熊远生,刘春元,蔡伟忠
(嘉兴学院 机电工程学院,嘉兴 314001)
步进电机转动的角度和输入驱动脉冲的个数成正比,其转动速率可以通过驱动脉冲的频率来控制,有较高的定位精度,无位置累积误差及特有的开环运行机制,与闭环控制系统相比,可减少系统成本,并提高了可靠性,具有较高的控制精度;因此,在精度要求不高的运动控制系统中,在工业领域得到了大量应用[1,2]。
为进一步提高控制精度,在实际应用中广泛应用步进电机细分驱动器,细分驱动器一般提供三个输入接口信号,ENA信号为脱机信号(低电平有效),当此输入控制端为低时,电机励磁电流被关断,电机处于脱机自由状态,此信号在大多数应用时一般悬空,DIR信号方向电平信号输入端,高低电平控制电机正/反转,PUL步进脉冲信号输入,每个信号提供两个输入端,内部用光耦实现隔离。
在工业控制中,有很多应用场合需要在上位机控制多个步进电机同时工作,如在水位传感器的初始螺栓位置调整中,为提高工作效率,希望10个步进电机在上位机控制下带动10个传感器同时进行位置调整。但是上位机一般不能直接连接细分驱动器,通常采用PLC的普通输出端口连接细分驱动器的DIR信号,PLC的脉冲输出端口连接细分驱动器的PUL信号,PLC与上位机之间通过RS485连接。但PLC价格相对较贵,编程灵活性不高。
本文针对在控制中需要控制多个步进电机的需求,设计了一种基于STM32的步进电机控制器,采用RS485与上位机相连,STM32输出端口经过放大后连接细分驱动器的DIR信号和PUL信号,将FreeModbus协议移植到STM32上,使用Modbus协议和上位机通信,接收DIR信号、PUL信号和设置参数等信息,通过软件实现输出脉冲频率可调、已输出脉冲个数可查询、输出脉冲可终止等功能。
在需要上位机对多个步进电机控制的场合,系统应用方案如图1所示,上位机通过USB转485和N个步进电机控制器进行485组网,上位机使用Modbus协议和N个步进电机控制器进行通信,步进电机控制器在收到方向和转动步数等信息后,将方向信号以高低电平的形式发送给相应的细分驱动器,将转动步数以脉冲个数的形式发送给相应的细分驱动器,细分驱动器在方向信号和脉冲信号的控制下,带动相应的步进电机转动。
图1 系统应用方案图
基于STM32的步进电机控制器硬件框图如图2所示。系统由24V供电,经过降压处理后提供5V和3.3V直流电,上位机通过USB转485接口后与步进电机控制器的RS485接口连接,STM32的IO口经过驱动后,通过输出接口连接细分驱动器的ENA、DIR和PUL接口,拨码开关输入用于设置步进电机控制器地址。
图2 基于STM32的步进电机控制器硬件框图
系统电源电路如图3所示,该电路主要是由78M05和LM1117两个三端稳压器构成。24V的直流电压经过78M05稳压器降压变成5V,其中D1是整流二极管,R1、R2和R3起分压散热的作用,5V电压再经过LM1117-3.3稳压器降成3.3V。
图3 电源电路
CPU电路如图4所示,采用STM32F030F4P6芯片作为主控芯片,以RC电路作为上电复位电路,时钟电路采用8MHz晶振,引出SW接口作为调试借口,对CPU的BOOT0引脚采用跳线的方法,根据需要可接高电平或低电平,采用一个发光二极管LED1对3.3V电源进行指示。
485接口电路如图5所示,采用SP3485实现串口到485的转换,采用STM32F030F4P6芯片PA0脚控制传输方向,R22和R20分别起到上拉电阻和下拉电阻的作用,R21做为终端匹配电阻,只是在网络的首末端才焊接。F1和F2为自恢复保险丝,和T1、T2一起对电路起保护作用。
输出接口电路如图6所示,采用三极管来驱动步进电机驱动器的输入光耦,STM32F030F4P6芯片的I/O口通过控制三极管的基极实现对步进电机驱动器的输入光耦的通断控制,将电平信号和脉冲信号传送给步进电机驱动器。
图4 CPU电路
图5 485接口电路
图6 输出接口电路
拨码开关电路如图7所示,采用上拉电阻的方法,当拨码开关OFF时,程序中对相应输入复位,拨码开关ON时,程序中对相应输入置位。1~5位拨码开关用于地址输入,分别对应1~32,当1~5位拨码开关全OFF时,对应地址为32,其余地址直接对应其输入二进制的组合。
图7 拨码开关电路
FreeModbus是一个针对嵌入式应用的通用Modbus协议。Modbus通信协议栈包括两层:Modbus应用层和网络层。FreeModbus提供了RTU/ASCII传输模式及TCP协议支持[3,4]。
移植FreeModbus协议时对硬件的需求包括,具有一个支持接收缓冲区满中断和发送缓存区空中断的异步串行接口、有一些能够容纳Modbus数据帧的RAM空间和一个定时器。
中断控制配置,在FreeModbus的标准移植接口文件port.h中,设置两个临界保护函数的宏定义,实现全局中断的打开和关闭。相关程序如下:
#define ENTER_CRITICAL_SECTION( ) __disable_irq();
#de fi ne EXIT_CRITICAL_SECTION( ) __enable_irq();
在物理层,用户只需完成串行口及超时定时器的配置即可。具体应修改接口文件portserial.c和porttimer.c。
1)eMBErrorCode eMBInit()完成物理层的初始化。主要包括:BOOL xMBPortSerialInit()串口初始化,设定I/O口功能、波特率、数据位数、校验方式;BOOL xMBPortTimersInit定时器初始化,设定定时器,设定t3.5定时需要的定时常数;
2)eMBErrorCode eMBEnable()使能协议栈。
3)void vMBPortTimersDisable()关闭超时定时器,在此函数中清零定时器计数值,关闭定时器中断;
4)BOOL xMBPortSerialPutByte()发送一字节数据,需要先使能485芯片的发送信号,调用USART_SendData()完成数据发送后,适当延时后使能485芯片的接收信号;BOOL xMBPortSerialGetByte()接收一字节数据,调用USART_ReceiveData()完成数据接收;
5)void UART1_IRQ()通过调用USART_GetITStatus()实现对发送和接收状态的判断,进行相应的处理。
应用层配置,在执行eMBEnable()使能协议栈后,不断循环调用eMBErrorCode eMBPoll()检测事件,通过四个接口函数eMBRegInputCB(),eMBRegHoldingCB(),eMBRegCoilsCB()和eMBRegDiscreteCB()实现对离散输入、输出线圈、输入寄存器和保持寄存器的读写操作。
步进电机控制器的功能处理主要用eMBRegHold ingCB()完成,eMBRegHoldingCB()对应06功能吗时用来处理设置输出脉冲频率、输出脉冲个数、输出脉冲方向和输出脉冲终止,eMBRegHoldingCB()对应03功能吗时用来处理查询输出脉冲频率、已输出脉冲个数、输出脉冲方向、输出脉冲终止标志,地址分别对应40001到40004。
完成软硬件设计后,搭建的实验系统如图8所示,上位机采用USB转485和两台步进电机控制器组网,上位机上运行Modbus Poll软件,设置相应参数后,步进电机能按期望的频率,方向和脉冲个数工作。
图8 步进电机控制器实验系统
本文设计了一种基于STM32的步进电机控制器,将FreeModbus协议移植到STM32上,实现了通过Modbus对多台步进电机的控制,实验结果表明,设计的步进电机控制器是可行的。