嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁减,适用于应用系统对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统[1]。自20世纪70年代世界上第一个为嵌入式应用而设计的微处理器诞生以来,已在几十年的发展历程,如今嵌入式系统(embedded system)已经成为电子信息产业中最具增长力的一个分支。随着微电子技术的发展,嵌入式控制系统在工业生产智能化、自动化中的应用越来越普及。尤其手机、PAD、GSP、机顶盒等新兴产品的大量应用,嵌入式系统的市场正在以每年30%的速度递增,嵌入式系统的设计也成为软硬件工程师越来越关心的问题。 步进电机是工业控制中的一种常用执行部件,具有控制灵活、价格低等优点,因而在许多设备和装置中常被采用。嵌入式步进电机控制器就是将微处理器置于电机控制器中,使步进电机控制器能按设定的相数、拍数以及单个触发脉冲所走的步数,提供相应的控制逻辑。 1、步进电机的工作原理 步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电元件,它实际上是一种单相或多相同步电动机。目前常用的步进电机有3类:反应式步进电动机(VR)、永磁式步进电动机(PM)和混合式步进电动机(HB)。现以反应式三相步进电机为例说明其工作原理,定子铁芯上有六个形状相同的大齿,相邻两个大齿之间的夹角为60o。每个大齿上都套有一个线圈,径向相对的两个线圈串联起来成为一个绕组,各个大齿的内表面上又有若干个均匀分布的小齿。转子是一个圆柱形铁心,外表面上圆周方向均匀地布满了小齿。转子小齿的齿距是和定子相同的。设计时应使转子齿数能被2整除,但某一项绕组通电,而转子可自由旋转时,该相两个大齿下的各个小齿将吸引相近的转子小齿,使电动机转动到转子小齿与该相定子小齿对齐的位置,而其他两相的各个大齿下的小齿必定和转子的小齿分别错开1/3的齿距,开成“齿错位”,从而形成电磁引力使电动机连续地转动下去。 永磁式步进电动机和混合式步进电动机的绕组电流要求正、反向流动,故驱动电路一般要做成双极性驱动。 2、相应的软硬件配置 硬件环境:主要包括ARM嵌入式开发板;用于ARM7TDMI的JTAG仿真器
图1 四相步进电机在开发板中的接法 四相步进电机的控制方法有四相单四拍、四相单、双八拍和四相双四拍3种控制方式。步距角的计算公式为
其中:m为相数,孔制方法是四相单四拍和四相双四拍时C为1。控制方法是四相单、双八拍时C为2,Zk为转子小齿数。我们采用的是四相单、双八拍控制方法,所以步距角应为360o/512/8。 UP-NETARM300开发平台中使用EXI/O的高四位控制四相步进电机的四个相。按照四相单、双八拍控制方法,电机正转时的控制顺序为A →AB→B→BC→C→CD→D→DA。EXI/O的高四位的值如表1所示。 表1 电机正转时EXI/O高四位的值
反转时,将控制信号按相反的顺序给出即可。 4、用ARM汇编语言实现对步进电机的控制 对步进电机工作原理掌握后,通过程序完成对74HC573的高四位进行操作来完成步进电机的脉冲分配。在C 语言程序中调用汇编先要完成两件工作:在C语言程序中使用extern关键字声明外部函数,即要声明要调用的汇编子程序;在汇编程序中使用export伪指令声明要C中要调用的汇编子程序,使用export声明后其他程序可以调用此汇编程序。如下例: 4.1 C中调用汇编程序 #include extern void strcopy(char *d,const char *s); int main() { const char *srcstr=”First string-source”; char dststr[]=”Second string - destinnation”; printf(“Before copying: ”); printf(“ %s %s ”,srcstr,dststr); strcopy(dststr,srcstr); printf(“After copying: ”); printf(“ %s %s ”,srcstr,dststr); return (0); } 4.2 汇编语言字符串复制子程序 AREA Scopy, CODE, READONLY EXPORT strcopy ;此句保证其他程序可调用此程序 Strcopy LDRB r2, [r1],#1 ;装载字节后将地址加1 STRB r2, [r1],#1 ;保存字节后将地址加1 CMP r2, #0 ;比较r2 是否为零 BNE Strcopy ;如果r2不等于零跳转 MOV pc, 1r ;返回 END 4.3 原理图
图 74HC573控制原理 4.4 使用的程序如下: AREA STEP, CODE, READONLY EXPORT STEPCTROL STEPCTROL START MOV R0, #0 ADR R2, TABLE ;将表头地址存入R2中 LOOP LDR R5,=0x0a000000草药 ;bank5,将要写入数据的地址放R5中 LDRB R1,[R2],#1 ;注意这里是先将R2中的数据(一个字节)送入R1后R2的内容所表示的地址再加1 STRB R1, [R5] ;将R1中的数据送入R5中的数据所表示的地址中 MOV R1,#0 ;从本句开始到DELAYOVER为两级循环嵌套延时 REPEAT ADD R1,R1,#1 ; 将R1中的值加1再送入R1中 CMP R1, #400 ;[R1]和400比较 BNE NEXT1 ;如果上面的比较结果不等跳转 B DELAYOVER NEXT1 MOV R3, #2 NEXT2 ADD R3, R3, #2 CMP R3, #40 BNE NEXT2 ;将R3中的数据和40进行比较,不等则跳转 B REPEAT DELAYOVER ADD R0, R0, #1 ;控制循环八次 CMP R0, #8 ;将8和R0中的数比较 BNE loop ;如果上面的比较结果不等跳转到loop,否则执行下一条语句 B START TABLE DCB ox10, ox30, ox20, ox60, ox40, oxc0, ox80, ox90 END 5、结束语 嵌入式步进电机控制器,具有成本低、应用方便、通用性强等优点,有较大的推广价值。用汇编语言实现对ARM的四路I/O通道输出控制,实现环形脉冲分配用于控制步进电机,嵌入式技术可以大大减小系统的体积和重量,在环境比较恶劣的现场,基于ARM的系统可以提高系统的可靠性和稳定性。