完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1 系统原理
1.1 电控油门原理 工作时,由驾驶员发出转速的控制指令,由节气门开度传感器采集发动机的转速参数,并把信号输入电控单元;电控单元将控制信号和反馈的节气门位置信号进行比较,根据比较的结果来驱动执行器改变节气门的开度,使实际的开度与控制开度达到一致,从而实现车速的自动控制。 1.2 舵机控制原理 舵机是一种位置(角度)伺服驱动器,适用于那些角度需要不断变化并可以保持的系统。S3003型舵机有3个引脚,分别为电源Vcc、地GND和控制线Signal。控制信号由Signal通道进入信号调制芯片,获得直流偏置电压。它的内部有一个基准电路,产生周期为20 ms、宽度为1.5 ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片以决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为20 ms(即频率为50 Hz)。当方波的脉冲宽度改变时,舵机的角度发生改变,角度变化与脉冲宽度成正比。其输出轴转角与输入脉冲宽度关系如图1所示。 2 系统设计 本系统采用三星公司的S3C2410和Futaba公司的S3003型舵机分别作为控制器和执行器,使用Linux操作系统,实验平台为济南恒信有限公司的发动机实验平台。 2.1 系统设计流程 系统流程如图2所示。控制器S3C2410完成各项初始化工作,接收来自操作人员的cmd指令,根据cmd的值来进行一系列的处理,包括停止执行器、旋转多少角度等。然后通过节气门开度传感器和转速传感器计算出等效的cmd值,并与cmd进行比较以决定是进行下一次cmd的判断,还是涮整执行器的角度。 2.2 设置Linux系统时钟频率 为了降低电磁干扰和降低板间布线要求,芯片外接的晶振频率通常很低,通过时钟控制逻辑的PLL提高系统时钟。在三星公司的S3C2 410A手册中列出了推荐的几种时钟频率,这里我们选用输出时钟频率FCLK=202.80 MHz的配置,即PLL控制寄存器中的:MDIV=161(0xa1)、PDIV=3、SDIV=1。 在U-Boot的board/smdk2410/smdk2410.c中进行设置: 由以上程序可知FCLK=202.80 MHz,HCLK=101.40 MHz,PCLK=50.70 MHz,而S3C2410的PWM模块使用的时钟是PCLK,所以PWM的输入时钟为50.7MHz。 2.3 舵机驱动程序编写 2.3.1 使用udev来动态建立设备节点 Linux 2.6系列的内核使用udevr来管理/dev目录下的设备节点。同时它也用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。udev依赖于sysfs输出到用户空间的所有设备信息,以及当设备添加或者删除时/***in/hotplug对它的通知。 为了udevr能够正常工作,一个设备驱动程序要做的事情是通过sysfs将驱动程序所控制设备的主设备号和次没备号导出到用户空间。ud ev在sysfs中的/class/目录树中搜索名为dev的文件,这样内核通过/***in/hotplug接口调用它的时候,就能获得分配给特定设备的主设备号和次设备号。一个设备驱动程序只需要使用class_create接口为它所控制的每个设备创建该文件。 使用class_create函数创建class结构,这段代码在sysfs中的/sys/class下创建一个目录,目录中创建一个新的“pwm”的class类以容纳通过sysfs输出的驱动程序的所有属性。其中的一个属性是dev文件条目,它由class_device_create()创建——它触发了用户空间udev守护进程创建/dev/pwm设备节点。代码如下所示: 当驱动程序发现一个设备并且已经分配了一个次设备号时,驱动程序将调用class_device_create函数: class_device_create(pwm_class,NULL,MKDEV(devicemajor,0),NULL,“pwm”); 这段代码在/sys/class/pwm下创建一个子目录pwmN,这里N是设备的次设备号。在这个目录中创建一个文件dev,有了这个udev就可以在/dev目录下为该设备创建一个设备节点。 当设备与驱动程序脱离时,它也与分配的次设备号脱离,此时需要调用class_device_destroy(struct class*cls,dev_t devt)函数删除该设备在sysfs中的入口项: class_device_destroy(pwm_class,MKDEV(device_major,0))。 2.3.2 配置PWM的输出频率 先使用Linux系统提供的系统函数来获取时钟pclk: elk_p=clk_get(NULL“pclk”); pclk=clk_get_rate(clk_p); 由S3C2410数据手册可知,经过预分频器和时钟分频器之后,计算定时器0的输入时钟频率为clkin=(pclk/{prescaler0+1}/divider value);再通过16位的定时器0计数寄存器TCNTB0、和定时器0比较计数器TCMPB0(它们的值分别用tcnt和tcmp表示)分频,这样就可以从引脚Tout0处得到合适的PWM波形信号了,其周期为T=tcnt/clkin,高电平周期为Th=tcmp/clkin。 已知pclk=50.7 MHz,令 MAX=(prescale0+1)×(divider value) (1) 则有clkin=pclk/MAX;可以取tcnt=pclk/date;又因为tcnt为16位,所以tcnt≤65 535,这样可以直接消去pclk中的507;而系统需要T=20 ms的周期,先提取出系数50,即: tcnt=pclk/(date×50)=1 014 000/date (2) 得出MAX=date≥1 6,prescaler0的取值范围为0~255,divider value的可取值为1、2、4、16。 要求的PWM波形周期为20 ms,正电平宽度为0.5~2.5 ms,20 ms/0.5 ms=40,所以: tcmp=tcnt/40+(cmd-1)×tcnt/(40×N)(3) 其中temp和tcnt均为整数;N即为细分系数,它表示cmd加1时舵机将旋转(45/N)°;cmd是要输入的控制参数,用它来控制舵机的角度。 由式(1)~(3),以及tcmp和tcnt尽量取整数以减小误差的原则,MAX=date=可取16、20、25。 3 实验结果分析 理论上,细分系数N取值越大、执行器的动作越精确越好,但过大的细分系数会导致执行器的命令对cmd的响应变慢。因此,N的取值应该根据执行器到节气门阀的距离来综合考虑,取细分系数N=5即使用公式:tcmp=tent(cmd+4)/200,最小角度为(45/5)=9,足以满足实验的需要。 采用实验的方法,对MAX=date=16、20、25分别进行实验,并使用示波器进行观察根据寄存器的取整特性来对MAX=date的值进行综合的考量。结果如表1~表3所列。其中cmd为输入指令.err为误差,Wh为高电平宽度,~Wh为实际的高电平宽度。 由以上数据可以看出取MAX=date=20时,误差最小。由式(4)可知,prescale0+1=20、10、5对应的dividervalue=1、2、4。 结语 利用ARM锁相环所产生的高频率可以获得更精细的PWM波,从而对舵机实现更精确的控制来达到油门精确控制的目的。本文从理论和实践两方面实现了舵机角度为9的控制,要想获得更细分的角度,只需将N的值取大。如N=15,可获得的最小控制角度为(45/15)=3;N=45,可获得的最小控制角度为(45/45)=1。 |
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:55 , Processed in 0.626406 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号