新闻中心

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

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

作者:时间:2013-11-11来源:网络收藏
  使用class_create函数创建class结构,这段代码在sysfs中的/sys/class下创建一个目录,目录中创建一个新的“pwm”的class类以容纳通过sysfs输出的驱动程序的所有属性。其中的一个属性是dev文件条目,它由class_device_create()创建——它触发了用户空间udev守护进程创建/dev/pwm设备节点。代码如下所示:
static struct class * pwm_class;
pwm_class = class_create(THIS_MODULE, “pwm”);
if(IS_ERR(pwm_class)){
  printk(KERN_ERR "Error creating pwm class.");
  goto error;
}
  当驱动程序发现一个设备并且已经分配了一个次设备号时,驱动程序将调用class_device_create函数:
  class_device_create(pwm_class, NULL, MKDEV(device_major, 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的输出频率
  先使用系统提供的系统函数来获取时钟pclk:
clk_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≥16,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)
  其中tcmp和tcnt均为整数;N即为细分系数,它表示cmd加1时舵机将旋转(45/N)°;cmd是要输入的控制参数,用它来控制舵机的角度。
  由式(1)~(3),以及tcmp和tcnt尽量取整数以减小误差的原则,MAX=date=可取16、20、25。
3 实验结果分析
  理论上,细分系数N取值越大、执行器的动作越精确越好,但过大的细分系数会导致执行器的命令对cmd的响应变慢。因此,N的取值应该根据执行器到节气门阀的距离来综合考虑,取细分系数N=5即使用公式:tcmp=tcnt(cmd+4)/200,最小角度为(45/5)=9,足以满足实验的需要。
  采用实验的方法,对MAX=date=16、20、25分别进行实验,并使用示波器进行观察根据寄存器的取整特性来对MAX=date的值进行综合的考量。结果如表1~表3所列。其中cmd为输入指令,err为误差,Wh为高电平宽度,~Wh为实际的高电平宽度。
表1 MAX=date=16,tcnt=63375, clkin=3168750时的结果
基于ARM Linux的电子控制油门设计
表2 MAX=date=20,tcnt=50700, clkin=2535000时的结果
基于ARM Linux的电子控制油门设计
表3 MAX=date=25,tcnt=40560, clkin=2028000时的结果
基于ARM Linux的电子控制油门设计
  由以上数据可以看出取MAX=date=20时,误差最小。由式(4)可知,prescale0+1=20、10、5对应的divider value=1、2、4。
结语
  利用锁相环所产生的高频率可以获得更精细的PWM波,从而对舵机实现更精确的控制来达到油门精确控制的目的。本文从理论和实践两方面实现了舵机角度为9的控制,要想获得更细分的角度,只需将N的值取大。如N=15,可获得的最小控制角度为(45/15)=3;N=45,可获得的最小控制角度为(45/45)=1。 linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭