基于嵌入式Linux的步进电机驱动程序设计_第1页
基于嵌入式Linux的步进电机驱动程序设计_第2页
基于嵌入式Linux的步进电机驱动程序设计_第3页
基于嵌入式Linux的步进电机驱动程序设计_第4页
基于嵌入式Linux的步进电机驱动程序设计_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要:介绍了 Linux 驱动程序的实现机制, 在分析步进电机和驱动程序接口的基 础上, 给出了一个在嵌入式 Linux 平台上编写步进电机驱动的实例。本平台基于 Samsung公司的 S3C2410X CP,U采用 Linux2.4 内核作为它的操作系统。介绍了 如何通过对驱动程序的操作实现对步进电机的控制。 在 JXARM2410实验平台上的 实验结果表明驱动运行正常。1引言随着嵌入式技术的飞速发展, 基于嵌入式系统的新一代工业控制器也日益增 多。同以往的控制器不同,新的仪器大多以 32 位嵌入式处理器为核心,并且安 装有嵌入式操作系统, 从而大幅度提高了处理能力, 方便了设计开发。 在各

2、种嵌 入式操作系统中, 嵌入式 Linux 是免费的自由软件, 其构建的系统成本较低, 而 且 Linux 是单内核的操作系统, 并可按要求进行任意剪裁, 因此越来越多的研究 人员开始在用 Linux 平台来开发自己的产品 1 。嵌入式开发过程中, 经常需要为特定设备开发驱动程序。 这些驱动程序的编 写和编译与 PC上的 Linux 驱动开发相比存在明显的差异, 需要考虑的因素更多, 实现过程更为复杂。本文以 Samsung公司 S3C2410X CPU为例,探讨如何为使用 嵌入式 Linux 的工业控制器开发字符设备驱动程序来驱动步进电动机。2Linux 驱动程序概述在 Linux 中,几乎

3、所有的内容都是文件, 对设备驱动的访问也是以文件操作 的方式实现的。 Linux 系统支持 3 种类型的硬件设备:字符设备、块设备和网络 设备,这些设备的驱动程序是系统内核的重要组成部分。 对用户程序而言, 操作 系统隐藏了设备的具体细节, 把设备映射为一个设备文件, 用户程序可以对设备 文件进行 open、close 、read 、write 等操作。这些操作和驱动程序是通过 struct file_operations 这一数据结构关联起来的, 编写设备驱动程序的主要工作就是 编写子函数填充 file_operations 的各个字段 2 。3嵌入式 Linux 步进电机驱动程序开发31

4、嵌入式 Linux 设备驱动程序的结构嵌入式 Linux 下的设备总体上可以分为两部分:其一,驱动与内核接口层, 它实现驱动模块在 Linux 内核的注册加载与卸除 工作。主要任务就是在模块加载时向内核注册驱动, 以及实现虚拟文件系统的设 备操作接口。对于采用中断的设备,此部分还包括中断处理函数的注册与注销。其二,硬件设备接口层, 这部分主要描述驱动程序与设备的交互。 它主要包 括硬件探测和初始化以及设备的读写访问和设备控制操作。 硬件探测主要是在驱 动注册加载时监测设备是否存在, 设备初始化主要是检测到设备后对它进行初始 化操作。设备的读写操作主要完成从设备接受数据和将数据发送给设备的操作。

5、 硬件设备接口层还需要包括一些设备的控制操作,设定设备的工作参数。对于驱动程序与内核接口层, Linux 提供了标准的入口点函数 init_module() ;在通过模块化的设计方法设计驱动程序时, 使用 insmod 加载核 心模块时会调用本函数, 通知内核对驱动程序进行注册。 模块的卸除工作与加载 工作类似,通过 rmmod卸载模块时,调用 cleanup_module() 取消驱动程序的注 册。32 步进电机驱动程序需求分析步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。 在非超负 载的情况下, 电机的转速、 停止的位置只取决于脉冲信号的频率和脉冲数, 而不 受负载变化的影响。

6、所以在驱动程序中间只需要考虑这两个方面的影响。本系统的步进电机的四相由硬件地址 0x28000006的 bit0 bit3 控制,bit0 对应 MOTOR_,Abit1 对应 MOTOR_,Bbit2 对应 MOTOR_,Cbit3 对应 MOTOR_。D本 文所描述的驱动是针对整步模式下的步进电机,整步模式下的步距角18。在整步模式下的脉冲分配信号如表所示。所以在程序中需要通过编制脉冲分配表控制步进电机, 并且通过修改脉冲分 配表可以实现步进电机方向的控制。系统的步进电机仅仅是一个输出的通道, 只能顺序的进行控制的操作, 因此 作为一个字符设备来进行驱动。 对于字符设备的操作而言驱动程序需

7、要提供相关 的几个操作分别为 open,read ,write ,ioctl 等相关的函数入口点。在驱动程 序的实现过程中需要定义这些文件相关的操作, 填充进入 file_operations 结构 中。与普通文件相比,设备文件的操作要复杂得多,不可能简单的通过 read 、 write 等操作来实现。并且由于对于步进电机驱动程序没有相关的输入与输出, 更关注的是对硬件的控制,因此在驱动程序对于 write 操作和 read 操作仅需返 回 0 ,而对于硬件的控制只需要在驱动程序中实现 ioctl 函数,并在其中添加相 应的 case 即可。通过 cmd区分操作,通过 arg 传递参数和结果

8、3 。3 3 步进电机驱动程序设计因为步进电机用到了 I/O 端口,而在 ARM9中操作端口要用虚拟地址而非实 际的物理地址,所以要修改内核代码。修改文件内核源代码中间的 smdk.c ,在结构体static struct map_desc smdk_io_desc _initdata = vCS8900_BASE, pCS8900_BASE, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 , vCF_MEM_BASE, pCF_MEM_BASE, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 , vCF_IO_BASE, pCF_IO_BASE,

9、0x01000000, DOMAIN_IO, 0, 1, 0, 0 ,LAST_DESC;中添加一行数组元素 0xd3000000, 0x28000000, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 , 则步进电机的物理地址 0x28000006 对应的虚拟地址 为 0xd3000006,在驱动程序中应对这个地址进行操作。定义全局变量 num和 status 用来控制步进电机的速度和方向:static int num=1;static enumoff,clockwise,anticlockwise status=off;定义步进电机的整步模式正转脉冲表:unsigne

10、d char pulse_table =0x05, 0x09, 0x0a, 0x06,;定义时钟节拍函数 time_tick ()static void time_tick(unsigned long data)static int i=0;switch(status)case off: break;case clockwise:if(+i=num)i=0;if( row = 4 ) row = 0;(*(char *)0xd3000006)=pulse_tablerow+;ttimer.expires=jiffies+1;add_timer(&ttimer);break;case antic

11、lockwise:if(+i=num)i=0;if( row = -1 ) row = 3;(*(char *)0xd3000006)=pulse_tablerow-;ttimer.expires=jiffies+1;add_timer(&ttimer);break;case default: break;在 time_tick() 函数中判断步进电机的状态,是停止、正转还是反转。若是 正转,则按正向顺序发送脉冲,并添加定时器 ttimer ;若是反转,则按反向顺 序发送脉冲,并添加定时器 ttimer ;若是停止则不再发送脉冲,也不再添加定 时器。在 stepper_module_init(

12、) 函数中申请 I/O 端口,并初始化定时器 ttimer: if(check_region(0x28000006, 1) / 看该 I/O 端口是否 已经被占用printk(The stepper port is used by another module.n);return -1;request_region(0x28000006, 1, DEVICE_NAME); / 申请该 I/O 端口 init_timer(&ttimer); / 初始化定时器 ttimerttimer.function=time_tick; / 填写定时器处理函数为 time_tick ()编写 ioctl 函数

13、用来接收应用程序对于步进电机的控制。int device_ioctl( struct inode *inode, struct file *file, unsigned int ioctl_num,unsigned long ioctl_param)struct stepper * s;/* 根据实际程序中的不同需求更改 ioctl 函数的调用 */switch (ioctl_num)case IOCTL_SET_MSG:s = (struct stepper*) ioctl_param;switch (s-CmdID)case 0: /* 开始 */status=clockwise;ttim

14、er.expires=jiffies+1; / 开启定时器add_timer(&ttimer);break;case 1: status=off;break;case 2:/* 反转 */* 停止 */if(status=clockwise) status=anticlockwise; if(status=anticlockwise) status=clockwise; break;case 3: if(num!=1)num-; break;/* 加速 */case 4: num+; break; /* 减速 */return 0;通过 s 指针得到 stepper 结构中的表示命令类型的参数, 根据该参数判断命 令类型,0 是 start 起动,1 是 stop 停止,2 是 reverse 反向,3 是 up 电机加速, 4 是 down 电机减速,通过改变全局变量 num和 sta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论