admin 管理员组文章数量: 888134
2023年12月25日发(作者:嵌入式开发方向什么意思)
第22卷第6期 2012年6月 计算机技术与发展 COMPUTER TECHNOLOGY AND DEVELOPMENT V0l_22 No.6 June 2012 嵌入式Linux下步进电机驱动开发 汤冬云,张毅 (重庆大学软件学院,重庆400044) 摘要:为了实现在嵌入式系统中对步进电机进行控制且尽可能少占系统资源,现基于嵌入式处理器¥3C2410和Linux系 统进行步进电机驱动开发,包括相关硬件体系结构和软件系统组成及测试固化方法。实现了动态编译下步进电机驱动的 开发及电机控制。阐述了在Linux系统下驱动程序的设计流程和内核模块化编程思想,驱动程序模块化并在需要的时候 加载到内核是节省嵌入式硬件资源的主要方法之一。为一般嵌入式系统下编写驱动程序步骤提供参考。 关键词:步进电机;驱动程序;内核模块;嵌入式Linux 中图分类号:TF319 文献标识码:A 文章编号:1673—629X(2012)06—0167—04 Stepping Motor Driving Development under Embedded Linux System TANG Dong-yun,ZHANG Yi (College of Software,Chongqing University,Chongqing 400044,China) Abstract:In order tO achieve the stepper motor control in he tembedded systems and account systems as less resources。it has implemented he sttepping motor drive under the embedded processor S3C2410 and the Linux system.That includes he associatted hardware architecture nd sofatware systems and test curing methods.It has achieved the step motor-driven development and motor control under dynamic com— pilation.It elaborates the driver program design prcesseso in Linux system and kernel in modular program.Designed driver module and loadedintothe kernelwhile needingis one ofthemainmethods of saving embedded hardware resources.Andit provides a referencefor he genertal steps in writing a driver in embedded system. Key words:stepping motor;driver program;kernel modulr;embedded Lianux 0 引 言 伴随着Linux嵌人式技术不断的发展进步,在嵌 1硬件平台 1.1控制系统的硬件组成 入式系统下编写固定的设备驱动越来越受到人们的重 视。在当今各种嵌入式操作系统中,Linux开源、根据 需要可以任意裁剪的特性,更是吸引了人们的眼球。 Linux系统将存储器和外设分为3个基础大类:字符设 本系统采用基于ARM920T内核的¥3C2410V6微 处理器作为系统的中央控制器,该芯片主频200MHz, 最高可达266MHz,存储器分为64M的SDRAM(其时 钟频率高达100MHz)、64M Nand Hash和1M Nor Flash,外部接口包括用于通信和下载的串口、USB接 口、JTAG接口和GPIO接口。ULN2003是集成达林顿 管Ic,内部还集成了一个消线圈反电动势的二极管, 由双列16脚封装,最大驱动电压为50V,电流500mA。 备、块设备、网络设备。字符设备是指那些不经过系统 的快速缓冲,以串行顺序依次进行访问的设备…。块 设备要经过系统的快速缓冲,以数据块为单位的数据 读写。网络设备是面向数据包的接受和发送。步进电 机具有控制性能好、定位精确、抗干扰能力强等特点被 具有电流增益高、工作电压高、温度范围广、带负载能 力强等特点,适用于高速大功率驱动系统。 1.2步进电机参数指标 广泛用于各种自动控制系统中。作为执行元件,是机 电一体化的关键产品。文中实现了¥3C2410嵌入式 Linux下步进电机驱动程序。 步进电机是将电脉冲信号转变为角位移或线位移 的开环控制单元组件,在非超载的情况下,电机的转 收稿日期:2011—10—10;修回日期:2012—01—13 作者简介:汤冬云(1984一),男,湖北宜昌人,硕士研究生,研究方向 为嵌入式软件开发;张毅,副教授,博士,研究方向为软件工程、企 速、停止位置只跟脉冲信号的频率和脉冲数有关,不受 负载的变化,当步进驱动器接收到一个脉冲信号,就按 预设的方向转动一个步距角。由于它的转动是按固定 角度一步一步的运行,所以可以控制脉冲的数目来控 业应用集成、办公自动化、嵌入式软件开发、企业信息化。
・168・ 计算机技术与发展 }}define StepMtr第22卷 Add (volatile U16 ) 制角位移量,从而达到准确的定位 z 。本系统采用四 相八拍步进电机28BYJ48,工作电压为DC5V~ DC12V。 —(0x38001000) 28BYJ48型号步进电机静态指标:相数,产生不同 对级N、s磁场的激磁线圈对数,常用m表示(m=4)。 Motor01 1R Motor 12 Q1 O2 Q3 Stepmotor—2R 拍数,完成一个磁场周期性变化所需要脉冲数或导电 状态,用n表示(//,=8),或指电机转过一个齿距角所需 Mo_to/22 3R Motor 3 4 5 4R妄04 要的脉冲数,本电机运行方式为A—AB—B—BC—C—CD— D—DA—A。步距角,对应一个脉冲信号,电机转子转过 6 7 5R善Q5 6R 28BYJ48 Q6 的角位移用0表示,0=360度/(转子齿数 运行拍 数)。定位转矩,电动机在不通电状态下,电动机转子 自身的锁定力矩。静力矩,电动机在额定静态电作用 下,不作旋转运动时,电动机转轴的锁定力矩。 1.3步进电机的控制系统及接口电路 基于ARM的步进电机典型控制系统框图如图1 所示。系统控制经过ARM单片机、脉冲信号、信号分 配、功率放大、步进电机、负载6个过程。ARM单片机 产生脉冲信号,本系统由¥3C2410产生脉冲信号,其占 空比约为0.3~0.4,占空比越大,电机转速越高。信 号分配,不同的步进电机工作方式不同,28BYJ48工作 方式为四相/ 拍,最p A—AB—B—BC—C—CD—D—DA—A。 功率放大,驱动系统中最重要的部分是功率放大模块, 由于从ARM的GPIO口输出的脉冲电流都很小,需要 加一个功率放大器才能驱动步进电机。步进电机在一 定的转速下的转矩取决于它的动态平均电流而非静态 电流,步进电机的平均动态电流越大其转矩越大,要使 得平均电流达到最大,需要驱动系统尽量克服电动机 的反电动势 。 图I 步进电机控制系统图 由于本系统采用的四相八拍工作模式,系统采用 四路I/O进行脉冲分配,这四路I/O口是由处理器的 GPIO扩展出来的,通过ULN2003功率放大后,进入步 进电机的各相绕组。在四相八拍的工作模式下,脉冲 的分配信号如表1所列。 表I脉冲分配信号 序号 正转脉冲序列 反转脉冲序列 序号 正转脉冲序列 反转脉冲序列 l 0001(A) 1001(DA) 5 0lo()(C) O110(BC) 2 0011(AB) 1ooo(D) 6 1100(CD) 0010(B) 3 0010(B) 11O0(CD) 7 1000(D) 0011(AB) 4 0Il0(BC) 0100(C) 8 1001(DA) 0001(A) 系统控制电路如图2所示。控制步进电机的I/O 口地址为: 7R O7 8 GNDVCC VDCMOTER● _图2 步进电机控制电路 2驱动程序设计 设备驱动是操作系统的重要组成部分,对于特定 的硬件设备,对应的设备驱动程序是不同的。设备驱 动程序的任务包括自动配置、初始化子程序、检测需要 驱动的设备是否存在以及是否能正常工作。如果一切 正常,则对该设备及相关设备驱动程序运行需要的环 境进行初始化 。设备驱动程序的流程图如图3所 示。 模块 内核 + injtJn。dule0} + regiscer_chrdeV J c eanup_module0 l unregisteLcllrdeV l 图3设备驱动程序的流程图 步进电机是将脉冲信号转变为角位移或线位移的 控制元件,电机的状态只取决于脉冲信号的频率和脉 冲数,即对电机发送一个脉冲信号,电机就转过一定的 步距角 。这样,通过控制发送脉冲序列的个数,就可 以达到控制角位移量的目的。发送脉冲频率不同,电 机的转速和加速度就不一样,通过控制发送脉冲的频 率来控制电机的转速,达到调速的目的。发送脉冲信 号的顺序不同,相应的电机转向也不一样,按照正转脉 冲序列发送脉冲信号,电机就正向旋转。反之,发送反 转脉冲序列,电机就逆向旋转,以此来控制电机的旋转 方向。 步进电机在系统中认为是只写的字符设备,它只 响应应用程序传送给驱动的步进量、正反转等其它参 数。 2.1数据结构的定义 设备驱动运行在内核空间,而应用程序运行在用
第6期 汤冬云等:嵌入式Linux下步进电机驱动开发 ・169・ 户空间,内核空间为用户提供一个与计算机硬件相一 致的窗口,即用户进程通过设备文件跟硬件打交道 。 驱动程序通过设备文件进行操作时就可以对硬件进行 直接操作了,而对设备文件操作需要设备驱动程序提 供的人口点由数据结构向系统说明。file—operations数 据结构提供文件系统的人口点函数,也就是访问设备 驱动的函数 。该数据结构定义在<linux/fs.h>中的 {0x38001000,0x38001000,DOMAIN—IO,0,1,0,0},这 样在向虚拟地址StepMtr_Add操作时候就能对实际的 相应的物理地址进行操作。 2.3设备的打开和释放 当用户调用驱动程序时候,会调用step—mtr—open ()函数,在这个函数中要设置对应的端口配置器GPF. CON和端口上拉寄存器GPFUP,使用了Port F的前4 个端口,相应的端口应该定义为输出,根据端口F配置 寄存器的定义,GPFCON=0x00000155,这里要禁止端 函数指针表。file—operations数据结构的每一个成员的 名字对应着一个系统调用,用户就是利用系统调用对 设备文件进行操作。系统调用通过对设备文件的主设 备号找到相应的设备驱动程序,然后读取该结构中相 应的指针,把控制权交给该函数 。步进电机定义的 ifle—operations数据结构为: Static struct file—operations Step—Mtr_fops={ ioctl:stepmtr—_ioctl, open:step_mtr open, release:step—mtr_release, }; 从以上定义的数据结构可以看出,实现了步进电 机的控制、打开和释放函数。步进电机为只写设备,只 接受发出的脉冲命令,必要时候需要改变步进电机的 状态,所以需要ioctl函数,ioctl函数实现了步进电机 脉冲信号分配、电机的正反转动、启动和停止。 2.2设备的初始化 驱动模块都有一个入口函数,该函数为static Step —Mtr_module—init(Step—Mtr—init)载入驱动模块后,程 序跳转到Step—Mtr_init(void)函数,来对设备进行初始 化。在这个函数内,主要调用register—chrdev()来完成 字符设备在系统中的注册并建立与文件之间的关 联 。主要向内核注册了设备的主设备号、设备名称 和传递fops这个指针变量,在本系统中是通过下面调 用来完成注册: register_chrdev(STEPMTR—MAJOR,“Step—mtr”,& Step—Mtr_fops); 其中STEPMTR—MAJOR为定义的主设备号,Step— mtr为设备名称,Step—Mtr_fops为上文定义的文件指针 变量。在初始化函数里面还要实现步进电机的初始 化,申请控制步进电机的端口,用下面的函数实现: apply—region(StepMtr_Add,1,“Step—mtr”); 因为步进电机需要使用系统的I/O端口,而在 Linux系统中操作端口用的是虚拟地址而非实际物理 地址,所以要修改内核代码,使得调用步进电机的控制 程序时候,使用的虚拟地址能够映射到步进电机实际 接[1所接的端口地址 引。打开文件linux/arch/arm/ mach-s3c24lO/smdk.C,在结构体static struct map—desc 中的smdk—io—desc[]数组中添加一行元素 口的上拉寄存器,所以GPFUP=0xO000000F。同时还 需要判断当前驱动程序是否被打开,定义IOpen来记 忆驱动程序的状态,如果其值大于1,认为已经有其它 的应用程序打开了这个驱动程序,这时候返回Busy, 表明该程序处于忙碌状态。当调用step—mtr_release() 函数时,关闭驱动程序的调用,将IOpen清零。 2.4设备的操作 设备的具体操作是调用step—mtr—ioctl(struc inode ¥inode,struct file¥flip,unsigned int cmd,unsigned long arg)函数。上文定义了脉冲分配信号,根据表1, 定义正转时对应的结构体为: unsigned char CO—rotating[]:{0x01,Ox03,Ox02, Ox06,Ox04,OxOc,Ox08,Ox09}; 同理,定义反转时对应的结构体为: unsigned char re—rorating[]={Ox09,Ox08,OxOe, Ox04,0x06,Ox02,Ox03,OxO1}; 通过cmd的值来判断是正转还是反转,如果cmd =1,则代表正转,这时系统调用电机驱动函数stepmtr— driver(),并将正转对应的结构体CO—rotating[]的地址 传给该函数,使得系统的I/O端口能按定义的脉冲序 号发出脉冲,驱动电机正转;同理,当cmd=0时定义电 机反转,将re—rorating[]的地址传给驱动函数,驱动电 机反转。 2.5设备驱动程序的加载 在Linux系统中,驱动程序主要有两种方式进行 编译,一种是静态编译,另外一种就是动态编译。静态 编译是指直接将驱动程序编译到系统中,可以随时的 对它进行调用,不需要安装。这种做法的优点是调用 驱动程序的时候方便,但是这种方法会带来很多弊端。 首先,增加了内核空间,本来嵌入式硬件资源就很有 限,对不经常使用的驱动程序静态编译到内核中就浪 费了一定的内存空间。其次,如果编译好的内核下载 到目标板上重新启动有错误,需要重复的进行系统编 译,比较费时费力 。动态编译很好地解决了静态编 译的不足,动态编译在调用驱动程序的时候会因为要 寻找驱动程序模块而增加系统资源的占用和运行时 间,但是与系统内核消耗的资源来比显得微不足道。
・170・ 计算机技术与发展 第22卷 动态编译最大的方便在于用户对某一硬件的驱动程序 开发和调试的时候,不用反复重新启动系统就可以动 态的卸载旧的版本,加载新的版本。这种机制被称为 模块,模块本身不被编译入内核印象,从而控制了内核 大小,而且模块一旦被加入,它就和内核中其它部分完 全一样。 把写好的步进电机驱动程序编译成模块,然后调 用insmod把模块加载到内核,加载的时候系统会自动 检测此模块是否已经被加载,如果已经被加载,内核会 自动调用模块的初始化函数。模块卸载是用rmmod 函数来完成的,在调用时会先检测此模块是否能被卸 载,如果能被卸载则系统调用该函数清除函数。 驱动程序采用的模块化编程,当需要改驱动程序 时,通过加载模块,将该驱动添加到系统内核 。当 然,不需要该驱动程序的时候,就可以将该驱动程序卸 载下来,这样保证了Linux系统内核的大小。在嵌入 式开发过程中,系统资源有限,模块化编程的灵活方式 节约了资源。 3程序测试 将编写好的驱动程序在Pc机上进行交叉编译 (本系统采用的交叉编译版本为ann—linux—gcc一3.4.5 -glibc-2.3.6),生成Step—Mtr.O文件,然后将该文件 通过m或其它方式传输到目标机上。在加载前需 要修改文件的读写权限,其命令为: #chmod 777 StepMtr.O —.然后加载该模块,其命令为: #insmod Step..Mtr.O 在加载完成后,可以用下面的命令查看是否有加 载的驱动程序,其命令为: #1smod 接着建立设备节点,命令为: #mknod/dev/Step——Mtr C STEPMTR——MAJOR 0 其中/dev/Step—Mtr为步进电机设备驱动的设备 名,C表示本设备为字符设备,STEPMTR—MAJOR为在 上文定义的主设备号,0为从设备号。 这时候驱动程序一切就绪,编写相应的驱动测试 程序就能查看电机的状态。 上面的过程主要用来调试,在掉电之后不能保存, 所以需要将程序固化,需要将该程序和模块添加到根 文件系统。 将驱动程序和测试应用程序添加到cramfs根文件 系统Step中,然后将mkcramfs文件复制到Step所在的 目录,并在该目录下运行命令: #mkeramfs Step step_dfiver.cramfs 该命令运行成功后,会在该目录下生成step—driv- er.cramfs根文件系统,然后将其烧写在系统中,目标 板掉电后重新启动驱动程序能继续使用。 4结束语 本系统主要采用了¥3C2410处理器的ARM9单片 机,结合步进电机控制器ULN2003,对步进电机的控 制。在Linux系统下,设备驱动是内核与硬件之间的 接口,对硬件的操作都是通过驱动程序来实现的。文 中介绍了嵌入式Linux系统下驱动程序的原理并结合 步进电机的驱动程序,给出了在Linux系统下编写驱 动程序的一般方法。 参考文献: [1]王黎明.ARM9嵌入式系统开发与实践[M].北京:北京航 天航空大学出版社,2008. [2] Weerakoon T S,Samaranayake L.Development of a novel drive topology for a five phase stepper motor[C]//Proceed- ings of 1 lth international conference on electrical machines and systems.[S.1_]:[S.n.],2008. [3] 张付详,刘振宇.多通道步进电机控制器设计及Linux驱 动实现[J].制造业自动化,2011,33(2):47-50. [4] 白复东.嵌入式Linux驱动程序开发[J].信息技术,2009 (9):185-189. [5] Mizutani K,Hayashi S,Matsui N.Modeling and Control of Hy- brid Stepping Motors[C]//Proc.of IEEE/IAS Annum Meet— ing.[S.1.]:[S.n.],1993. [6]Rodriguez C s,Fischer G,Smolski S.Linux内核编程[M].陈 莉君,译.北京:机械工业出版社,2006. [7] 宋宝华.LINUX设备驱动开发详解[M].北京:人民邮电出 版社,2008. [8]孙泽田.嵌入式设计及linux驱动开发指南[M].北京:电 子工业出版社.2005. [9] 张国栋.基于嵌入式单片机的步进电机控制系统[J].电脑 知识与技术,2011,7(24):6017-6019. [10]周晓光.基于¥3C2440A的嵌入式视频系统设计[J].电子 测量技术,2006,29(6):84-86. [11]钟伟弘,关保国,张善青.步进电机的驱动及微机控制[J]. 天津理工学院学报,2000,16(2):66-68. [12]刘晓明,程铁汉,邵敏.基于ARM7的便携式工业打印机 [J].计算机技术与发展,2008,18(7):187-189.
版权声明:本文标题:嵌入式Linux下步进电机驱动开发 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703440083h451473.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论