采用嵌入式设计实现多路步进电机控制的方法
摘要: 本文设计实现了一种三路步进电机控制系统,它基于RTThread嵌入式实时系统,提高了系统的实时性和后期的功能扩展能力。系统控制电路采用STM32F4系列的微控制器,结合小功率步进电机驱动器A4988,完成了硬件电路板设计。软件中运用操作系统自带的finsh机制,实现对指令的初步解析,控制系统可以通过读取G指令,控制多路电机按照一定轨迹运动,同时可以调节电机运动的加减速参数。实际项目验证证明该系统具有很好的稳定性。
引言
随着计算机技术和微电子技术的发展,步进电机作为自动化控制的执行单元,越来越多地运用在各种领域中,许多控制领域需要对多台步进电机进行同步协调控制,如军事、航空、机器人控制。特别是近年来,随着嵌入式技术和集成化的发展,其应用范围逐步扩大,逐渐扩展到普通民用行业,如小型雕刻机、3D打印等。步进电机作为一种将电脉冲信号转换成相应的角位移或线位移的机电元件,其最大的优点是易于开环控制、无积累误差。在应用中,对速度、位置的精度控制尤为重要,所以对于电机的控制要具有实时性[1]。
传统上,单片机(one-board computer)控制适合比较简单的电机控制系统,对于复杂的系统,若电机控制只为其中的一个模块,既要求电机控制模块内部协调运动,又要求与其他模块保持同步,结构复杂,实现难度大。
随着单片机(one-board computer)本身性能的增强,在嵌入式系统的基础上,完成对多电机的实时协调控制具有很多优点。嵌入式系统的实时性特点可以使其胜任对多电机的协调控制;可裁减性特点可以使得系统容易扩展其他模块;能够支持多任务,使得程序开发更加容易,便于维护,同时能够提高系统的稳定性和可靠性(Reliability)[2]。
本研究基于嵌入式实时系统设计出一套多步进电机控制系统,此系统基于嵌入式技术协同控制三路步进电机,以对多轴系统的速度、位置达到精确控制,并且可以实时调节电机的运动速度。本设计的重点为软件方面对电机的协同控制,使得系统对电机的定位精度达到预期的目的。系统本身很容易地根据不同功能需求扩展出各种功能,具有一定实用价值。
硬件电路设计
1.1总体设计
本设计硬件结构如图1所示。
图1 硬件结构图
主控芯片采用内置的UART串口与上位机通信,接收上位机发送的控制指令,并向上位机发送系统当前状态。通过SPI接口读取SD卡中的Gcode文件,主控芯片逐行解析文件中的G指令,根据G指令中位置偏移和速度,最终得到驱动电机的脉冲,从而控制3路步进电机按照推荐速度精确达到目的位置。3路限位开关可以反馈电机的位置信息,主要用于初始化步进电机系统,从而规定电机系统内部坐标系。
本设计电路中主控制器采用ST公司的STM32F4系列微控制器,电机驱动芯片采用A4988,作为执行机构的步进电机使用两相四线的42步进电机。
1.2主控芯片
本系统电路中主控芯片采用基于ARM内核的STM32F40x微控制器,芯片内部含有1 MB Flash和256 KB RAM,完全可以运行小型的嵌入式系统。该微控制器还包括了大量的片上外设资源,非常适合控制类应用。
1.3驱动模块
本系统电路中电机驱动模块采用Allegro公司的A4988电机驱动器,该驱动器是一个完整的带有内置转换器的微电机驱动器,它可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机,具有高达35 V和±2 A的输出驱动能力,且控制简单,只需在驱动器相应引脚输入一个脉冲即可驱动步进电动机产生一个微步,程序不必再考虑相序表等电机底层的控制,驱动模块电路如图2所示。
图2 驱动模块
本设备采用1/16细分模式,MS1、MS2、MS3引脚需置高电平,主控制器只需控制电机驱动芯片上的ENABLE、DIR、STEP三个引脚即可完全控制此步进电机。ENABLE为步进电机控制器的使能端;DIR为电机的方向控制端,用于控制电机的转动方向;STEP为电机的步数控制端,输入脉冲来控制电机的步数以及转速。
软件系统设计
2.1软件总体设计
根据设计需要实现的目标,本文把系统分为不同的子功能,充分利用嵌入式系统多任务的优势,把各个子功能作为系统中不同的任务进程实现,包括:上位机指令解析任务、用户界面显示、记录监视进程、运动规划管理进程、电机驱动任务,各个任务通过嵌入式系统的信号量进行同步。为了保证步进电机系统的实时性,其中电机驱动进程为核心进程,设定其任务优先级最高,除中断外,没有任何进程可以抢占它的CPU控制权。
系统设计有用户互交界面,终端选用串口工控彩屏,控制简单,作为系统脱离上位机时的控制方式。
本文将主要介绍软件设计电机运动规划和底层驱动的实现:从串口或SD卡读取运动指令,转换为实际的电机机构的移动。
① 使用finsh shell机制从串口或直接从SD卡读取指令,识别指令,随后存放入指令缓冲区;
② 运动规划进程取得指令,把它们转化为Block块对象,其中包含了速度、方向、加速度等信息,并加入Planner中的环形缓冲队列中;
③ 无论什么时候Planner中存在Block块对象,电机驱动进程都将会启动,读取块对象,并启动定时器中断。
2.2嵌入式系统选择
在实时嵌入式系统的选择上,本设计选用了RTThread嵌入式操作系统,它是一款类Linux系统,它是一款国内的开源全抢占的实时操作系统内核[3]。RTThread实时操作系统内核是一个高效的硬实时内核,它具备非常优异的实时性、稳定性、可裁减性,最小可以只有3 KB ROM和1 KB RAM占用。其内核包提供了大部分的同步和通信机制,并且任务调度算法基于优先级的全抢占式线程调度,最多可支持256个线程优先级。此嵌入式系统支持从ARM7到CortexM3等多种类型内核的处理器。
除了内核之外,此嵌入式系统还用于文件系统、TCP/IP协议栈、图形用户界面、用户shell组件,本设计中就运用了系统的shell组件来简化命令解析功能。
上位机指令解析任务依靠嵌入式系统中的finsh shell机制,finsh shell是RT?Thread内置的用户命令行组件,用户能够通过串口设备使用finsh shell,它在系统中被设计为一个独立的进程,其进程默认优先级为8,进程试图从外部设备中获得用户的输入,然后对用户命令进行解析执行。依靠嵌入式系统提供的shell机制,可以轻易地自定义用户指令,通过如下宏定义实现:FINSH_FUNCTION_EXPORT_ALIAS()。
图3 Gcode_recev流程图
本文中实现一个Gcode_recev(char *movecmd)函数,参数movecmd为一行或多行G指令,函数的结构流程图如图3所示,其中指令缓冲区为全局的自定义的结构体。结构体包含一个环形缓冲区和一个信号量,通过这个全局变量实现进程间的数据共享,并且用信号量避免缓冲区数据的竞争。
通过宏定义“FINSH_FUNCTION_EXPORT_ALIAS(Gcode_recev,G,"Gcode_recev(“”)")”,我们可以通过串口终端以G(“cmd”)的形式执行运动指令,达到调试的目的。除此之外,系统还实现了关启电机、清除运动缓冲、查看参数等函数功能。
2.3运动规划管理
图4 运动规划管理流程图
系统的实际使用状态通常为一端不断读取运动指令,另一端不断驱动多路步进电机移动。两端中间存在一个结构体队列来缓冲两端执行速度的差异,进程的结构流程图如图4所示。
系统通过串口或SD卡能够识别的运动指令(通常为G指令),指令中包含了电机移动的目的坐标和速度参数。读取一行运动指令后,系统结合全局信息对指令进行解析,为了防止电机启动时,启动速度过快造成失步,或电机停止时速度过快而不能精确定位,步进电机的运动方式采用梯形运动方式。
在程序中,设计了Planner_t结构体。stage1部分为一个环形缓冲区,缓冲区大小可以根据实际使用情况定义。代码如下:
typedef struct{
//stage1
stepBlock_t stepBlock[BUFFER_SIZE];
int32_thead , tail , len;
//stage2V
……
}Planner_t;
而stepBlock_t结构体中包含了各步进电机运动的方向、步数、主步数(即各电机运动步数的最大值)、加速前步数、减速前步数、速度等信息,用于底层的电机驱动函数代码如下:
typedef struct{
//stage1
int32_t steps[3];
bool dir[STEPPER_NUM];
int32_t steps_event_count;
//stage2
int32_t accelerate_until;
int32_t decelerate_after;
float acceleration;
}stepBlock_t;
2.4电机驱动
以上只是对步进电机运动的规划,并没有涉及到底层的电机驱动,实际的电机驱动一般采用两种方式:定时器PWM脉冲或定时器中断[4]。本文中采用定时器中断函数在操作系统下层直接驱动步进电机,只需在中断函数中向某个电机驱动器CLK引脚发送一个脉冲,即可驱动电机一微步。
在系统中的多个用户任务进程中,电机驱动进程是最重要的,它实际上完成了对步进电机最底层的控制,为了保证当前运动指令下电机运行的流畅,此进程对时间要求非常敏感,它在系统中决定了电机运动速度的上限。进程流程图如图5所示,此进程用一个不断循环的函数实现,对应于规划管理进程不断向Planner结构体中填充块数据,电机驱动进程则不断从Planner中取出块数据,根据Block块中的参数启动Timer定时器,首次设置定时器参数,最终在定时器中断服务函数中驱动电机运动。
图5 电机驱动进程
STM32F40x系列微控制器用于多个定时器资源,并且其时钟频率最高可达到84 MHz。本系统中,电机的最大转速为1500 PRM,驱动器取16细分时,若要达到此速度,需要定时器频率约为72 kHz,考虑到系统多任务的复杂性,也完全可以满足需要。
定时器中断在系统中的应用仅保证两个微步间隔时间的精确性,为了保证嵌入式系统的实时性,定时器的中断服务函数执行时间应尽量缩短[5],因此在中断服务函数中只做两件必要的任务:给步进电机脉冲和更新定时器。中断服务函数流程图如图6所示。
图6 中断服务函数流程图
结语
本文在RTThread的嵌入式实时系统的基础上实现了对多路步进电机的控制,基于嵌入式系统,系统功能按模块设计实现,大大减小了设计的整体难度,并且有利于系统后期的功能扩展,以较低的成本实现多路步进电机的控制。基于此设计的3D打印机项目已经在使用,且系统运行稳定。