新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于ARM-Linux的电子控制油门设计

基于ARM-Linux的电子控制油门设计

作者:时间:2012-05-08来源:网络收藏

2.3 舵机驱动程序编写
2.3.1 使用udev来动态建立设备节点
Linux 2.6系列的内核使用udevr来管理/dev目录下的设备节点。同时它也用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。udev依赖于sysfs输出到用户空间的所有设备信息,以及当设备添加或者删除时/sbin/hotplug对它的通知。
为了udevr能够正常工作,一个设备驱动程序要做的事情是通过sysfs将驱动程序所设备的主设备号和次没备号导出到用户空间。ud ev在sysfs中的/class/目录树中搜索名为dev的文件,这样内核通过/sbin/hotplug接口调用它的时候,就能获得分配给特定设备的主设备号和次设备号。一个设备驱动程序只需要使用class_create接口为它所的每个设备创建该文件。
使用class_create函数创建class结构,这段代码在sysfs中的/sys/class下创建一个目录,目录中创建一个新的“pwm”的class类以容纳通过sysfs输出的驱动程序的所有属性。其中的一个属性是dev文件条目,它由class_device_create()创建——它触发了用户空间udev守护进程创建/dev/pwm设备节点。代码如下所示:
e.jpg
当驱动程序发现一个设备并且已经分配了一个次设备号时,驱动程序将调用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。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭