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

发布者:平凡梦想最新更新时间:2014-03-18 来源: elecfans关键字:S3C2410  ARM-Linux  电子控制油门 手机看文章 扫描二维码
随时随地手机看文章

  引言

  巡航控制系统(CCS)是20世纪60年代发展起来的,又称为恒速行驶系统。巡航控制系统工作时,ECU根据各种传感器输送来的信号判断汽车的运行状况,通过执行元件自动调节节气门的开度使汽车的行驶速度与设定的车速保持一致。汽车在良好路面上长时间行驶时,驾驶员启动巡航控制系统并设定行驶速度,不需驾驶员操纵加速踏板,通过巡航控制系统即可自动保持既定的行驶速度,不仅减轻了驾驶员的劳动强度,同时利用先进的电子控制技术控制节气门的开度,比驾驶员操纵节气门更精确,汽车燃料经济性、排放污染性也可得到改善。

  1 系统原理

  1.1 电控油门原理

  工作时,由驾驶员发出转速的控制指令,由节气门开度传感器采集发动机的转速参数,并把信号输入电控单元;电控单元将控制信号和反馈的节气门位置信号进行比较,根据比较的结果来驱动执行器改变节气门的开度,使实际的开度与控制开度达到一致,从而实现车速的自动控制。

  1.2 舵机控制原理

  舵机是一种位置(角度)伺服驱动器,适用于那些角度需要不断变化并可以保持的系统。S3003型舵机有3个引脚,分别为电源Vcc、地GND和控制线 Signal。控制信号由Signal通道进入信号调制芯片,获得直流偏置电压[2]。它的内部有一个基准电路,产生周期为20 ms、宽度为1?5 ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片以决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

  控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为20 ms(即频率为50 Hz)。当方波的脉冲宽度改变时,舵机的角度发生改变,角度变化与脉冲宽度成正比。其输出轴转角与输入脉冲宽度关系如图1所示。

  舵机输出转角与输入脉冲宽度关系

  图1 舵机输出转角与输入脉冲宽度关系

  2 系统设计

  本系统采用三星公司的S3C2410和Futaba公司的S3003型舵机分别作为控制器和执行器,使用Linux操作系统,实验平台为济南恒信有限公司的发动机实验平台。[page]

  系统流程

  图2 系统流程

  2.1 系统设计流程

  系统流程如图2所示。控制器S3C2410完成各项初始化工作,接收来自操作人员的cmd指令,根据cmd的值来进行一系列的处理,包括停止执行器、旋转多少角度等。然后通过节气门开度传感器和转速传感器计算出等效的cmd值,并与cmd进行比较以决定是进行下一次cmd的判断,还是调整执行器的角度。

  2.2 设置Linux系统时钟频率

  为了降低电磁干扰和降低板间布线要求,芯片外接的晶振频率通常很低,通过时钟控制逻辑的PLL提高系统时钟[3]。在三星公司的S3C2410A手册中列出了推荐的几种时钟频率,这里我们选用输出时钟频率FCLK=202?80 MHz的配置,即PLL控制寄存器中的:MDIV=161(0xa1)、PDIV=3、SDIV=1。

  在UBoot的board/smdk2410/smdk2410.c中进行设置:

  #define M_MDIV 0xA1

  #define M_PDIV 0x3

  #define M_SDIV 0x1

  int board_init (void){

  ……

  /* configure MPLL */

  clk_power?﹥MPLLCON = ((M_MDIV ﹤﹤ 12) + (M_PDIV ﹤﹤ 4) + M_SDIV);

  ……

  }

  在UBoot的cpu/arm920t/start.S中设置FCLK、HCLK、PCLK的比例:

  /* FCLK:HCLK:PCLK = 4:2:1*/

  ldrr0, =CLKDIVN

  mov r1, #3

  strr1, [r0]

  由以上程序可知FCLK=202.80 MHz,HCLK=101?40 MHz,PCLK=50.70 MHz,而S3C2410的PWM模块使用的时钟是PCLK,所以PWM的输入时钟为50.7 MHz。

  2.3 舵机驱动程序编写

  2.3.1 使用udev来动态建立设备节点

  Linux 2.6系列的内核使用udev来管理/dev目录下的设备节点。同时它也用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理 /dev目录以及所有用户空间的行为,包括加载firmware时。udev依赖于sysfs输出到用户空间的所有设备信息,以及当设备添加或者删除时 /sbin/hotplug对它的通知[4]。

  为了udev能够正常工作,一个设备驱动程序要做的事情是通过sysfs将驱动程序所控制设备的主设备号和次设备号导出到用户空间。udev在sysfs 中的/class/目录树中搜索名为dev的文件,这样内核通过/sbin/hotplug接口调用它的时候,就能获得分配给特定设备的主设备号和次设备号[5]。一个设备驱动程序只需要使用class_create接口为它所控制的每个设备创建该文件。[page]

  使用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的输出频率

  先使用Linux系统提供的系统函数来获取时钟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时的结果

  表1 MAX=date=16,tcnt=63375, clkin=3168750时的结果

  表2 MAX=date=20,tcnt=50700, clkin=2535000时的结果

  表2 MAX=date=20,tcnt=50700, clkin=2535000时的结果

  表3 MAX=date=25,tcnt=40560, clkin=2028000时的结果

   表3 MAX=date=25,tcnt=40560, clkin=2028000时的结果

  由以上数据可以看出取MAX=date=20时,误差最小。由式(4)可知,prescale0+1=20、10、5对应的divider value=1、2、4。

  结语

  利用ARM锁相环所产生的高频率可以获得更精细的PWM波,从而对舵机实现更精确的控制来达到油门精确控制的目的。本文从理论和实践两方面实现了舵机角度为9的控制,要想获得更细分的角度,只需将N的值取大。如N=15,可获得的最小控制角度为(45/15)=3;N=45,可获得的最小控制角度为(45 /45)=1。

关键字:S3C2410  ARM-Linux  电子控制油门 引用地址:基于三星S3C2410的ARM-Linux电子控制油门设计

上一篇:光子学技术将在汽车应用中大显身
下一篇:基于DM6446的视频运动车辆检测系统

推荐阅读最新更新时间:2024-03-16 13:38

采用S3C2410和Linux系统的指纹识别管理系统
作者Email: newtonian@263.net 摘要:随着ARM系列处理器性能的不断提高,过去一些专属于DSP领域的运算密集型的应用,例如指纹识别等,也能够在ARM处理器上得以很好的实现。并且由于MCU的强大控制功能,以及操作系统的巨大灵活性,使得这种系统有DSP平台不可比拟的优势。本文着重介绍了基于S3C2410和Linux操作系统的指纹识别管理系统的实现方法,以及这种实现方法与传统DSP系统的异同。 指纹识别技术在金融、交通、安全等领域以及日常工作和生活中被越来越广泛地应用。指纹识别的算法中通常有大量的矩阵运算,域变换,三角函数运算等等,属于典型的运算密集型的应用,因此通常采用DSP来实现嵌入式应用。不过近期情
[嵌入式]
S3C2410原理图导读
电脑里有主板,主板上有CPU、内存、网卡、串口等 开发板就是一台小电脑 在SOC如2440当中,有CPU和串口模块、I2C模块等等, 还有内存、网卡等,将这些加在一起做成一个开发板 点灯 我们可以看到2410主芯片这里有两个灯 如何点亮这两个灯? 只需要将GPB5或GPB6配置成输出引脚并且配置成低电平即可。 CS8900网卡 网卡属于类似内存的接口这一类 那么怎么访问这张网卡芯片呢? 看片选信号 打开2410手册中的内存映射图 只要地址再这个范围内,就可以访问这个网卡 这边通过与非门来选择IO读或者IO写模式 通过阅读前面的门电路,我们可以得知 nIOR = nOE || ADDR24的
[单片机]
<font color='red'>S3C2410</font>原理图导读
S3C2410解决网络式汽车防盗系统三大难题
  引言   汽车的普及为人们的生活带来了方便,同时也给人们提出了一大难题——汽车防盗。本设计是为了解决以往汽车防盗产品的缺点和不足而开发的集成传感、报警和远程图像监控3大功能模块的汽车防盗报警系统。   系统工作原理及组成   本系统是把传感器装在车身的隐蔽位置,当有人走进监控距离、车身移动或振动、车门被打开时,传感器发出电信号,通过A/D转换装置,发送到主控制器。控制器根据信号的来源,把报警分为“有人靠近”、“车体振动”和“车门被开”3个等级,并用GPRS/GSM终端将报警信息用短信的方式发送到用户手机上。把 “车门被开”作为高级别的报警,通知用户的同时,启动视频驱动程序,通过车内的摄像头把车内实况记录下来,发送到车主手机
[单片机]
用<font color='red'>S3C2410</font>解决网络式汽车防盗系统三大难题
S3C2410 LCD控制器的外部管脚图和内部方框图
S3C2410管脚 S3C2410 LCD控制器用于传输视频数据和产生必要的控制信号,像VFRAME、VLINE、VCLK、VM等等。除了控制信号,S3C2410还有输出视频数据的端口VD ,如图1示。将要用到的管脚描述如下:VCLK—— 像素时钟信号;VD ——LCD像素输出端口;VM/VDEN/TP— —LCD驱动器的AC偏置信号(STN)/数据使能信号(TFT)/SEC TFT源驱动器数据加载脉冲信号。 图1 S3C2410 LCD控制器的外部管脚图 LCD控制器由REGBANK、LCDCDMA、VIDPRCS、TIMEGEN 和LPC3600组成(见图2)。 REGBANK有17个可编程寄存器组和256×16的调色
[单片机]
<font color='red'>S3C2410</font> LCD控制器的外部管脚图和内部方框图
WINCE下s3c2410+cs8900 板子的网络问题解决
CS8900+s3c2410上网掉线的问题及其解决办法 自我理解是,系统在运行网络的时候,经常会去使能网络中断,而造成网络复位了 找到 E:\WINCE420\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c 找到 BOOL OEMInterruptEnable() 函数 里 case SYSINTR_ETHER: 使网卡的初始化只出现一次,因为每次初始化以后,连接就会断掉 加一个全局变量 Inited == FALSE case SYSINTR_ETHER: // Ethernet on EINT9. if(Inited == FALSE) // edit by andy
[单片机]
基于s3c2410开发板的UART测试程序
如下程序实现的是开发板从PC端口接受一个字符,并把该字符加1后发送会PC端口。(在本开发板测试成功)对于不同的主频要设置好UBRDIV0的值,在技术文档中有这个值的计算公式。 #define ULCON0 (*(volatile unsigned *)0x50000000) //UART 0 Line control #define UCON0 (*(volatile unsigned *)0x50000004) //UART 0 Control #define UFCON0 (*(volatile unsigned *)0x50000008) //UART 0 FIFO control #define UMCON0
[单片机]
基于ARM-Linux和GPRS技术的家庭智能控制终端
1引言     随着网络技术和通信技术的不断发展,人们希望即使在工作或外出时也能通过某种方式及时了解和控制家中的情况,同时伴随着数字化家庭的普及,实现智能家居的远程控制已经成为一种趋势。家庭智能控制系统通过家庭总线技术,把家庭中各种家用电器、家庭保安装置和各种计量设备连接到一起组成一个家庭内部网络,由家庭智能控制器进行统一管理 。远程控制就是通过某种通讯方式将智能家庭控制器与外界相连,使人们能够在本地或异地对家庭系统进行集中的监视、控制。本文中介绍的方案,结合了GPRS(GeneralPacketRadioService)技术永远在线,速度快,接入范围广,体积小,功耗低等优点 ,采用RS485工业总线,设计实现了一种基于嵌入式
[嵌入式]
Linux驱动:s3c2410/s3c2440 ts驱动分析
前言 前面结合“平台总线-设备-驱动”模型分析了ts(触摸)驱动的加载过程,现在进入驱动程序分析下其具体的实现。涉及到输入子系统、s3c2440的ADC转换和触摸控制器。 涉及的寄存器 image.png 调用probe函数 根据上一篇的分析,驱动层通过platform_driver_register注册后,会调用到该驱动层的probe函数。 s3c2410ts_probe函数分析 1. 硬件寄存器设置 获取设备参数 struct s3c2410_ts_mach_info *info; info = ( struct s3c2410_ts_mach_info *)pdev- dev.platform_data;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved