带485接口伺服电机使用MODBUS协议控制 您所在的位置:网站首页 stm32软件开发 带485接口伺服电机使用MODBUS协议控制

带485接口伺服电机使用MODBUS协议控制

2023-03-21 08:15| 来源: 网络整理| 查看: 265

带485接口伺服电机使用MODBUS协议控制 硬件准备基于STM32的伺服电机控制程序软件架构主程序设计中断设计UART通信及数据解析RS485通讯及数据解析电机控制模式实现IO口监控程序说明

硬件准备

最近要用STM32控制一个三轴伺服系统,在网上找了半天资料,最终基于安富莱的一个MODBUS例程写好了程序。

伺服系统: TSDA-C12B伺服驱动器+SDGA-01C31AB伺服电机 这款驱动器上带一个RS485通信接口,并且多个驱动器可以使用串接式总线串在一起,只要设置好对应ID就行。开发板: 用的是正点原子探索者,板载STM32F407,通过一个串口2引到板载的SP3485转接芯片,用跳线帽接上就行。芯片同时需要一个接收使能信号来控制接收或发送,放在了PG8脚上。

工程文档在这。实际应用中因为是一个色度标定机器的机器控制部分,所以需要有上位机的参与,通过上位机发送控制信号给STM32,STM32解析并控制机器运动。

下面我就直接贴设计文档了,希望各位耗子尾汁。

文档里把串口2和串口3搞反了,应该是串口2与电机通讯,串口3与上位机通迅,我大意了啊。

基于STM32的伺服电机控制程序 软件架构

主控芯片采用STM32F407ZGT6,该伺服电机控制程序基于TODA电机经销商华创商城提供的模板程序进行编写,开发环境采用Keil v5,采用的MODBUS通讯协议参照“GB/Z 19582.1-2004 基于Modbus协议的工业自动化网络规范-第一部分”与“TSDA-C12B低压伺服用户手册”进行编写实现,程序包括主程序与中断共两部分,软件架构如图1所示: 三轴伺服电机控制程序软件架构 该程序整体实现的功能包含以下几点:

MODBUS-RTU协议通信:根据“TSDA-C12B低压伺服用户手册”的寄存器功能定义表与通信帧使用示例进行相应的配置和操作。

与上位机UART串口通信:根据自行定义的“上位机控制机器协议帧”实现对八种类型帧的接收与解析,并对电机驱动器进行相应的控制或数据读取。

SYSTICK定时器中断:通过配置systick定时器中断实现对接收数据的轮询以及对IO口状态的监控。

上位机数据解析模块:通过串口2接收上位机发送的信息,并解析为八种类型帧,转到各个模块执行对应的操作。

上位机响应模块:对上位机发送的数据进行统一回复或对特定信息请求帧进行特定回复。

机器控制模块:程序接收到上位机发送的数据帧后解析为相应的操作,并统一使用03指令,06指令,10指令对相应的寄存器执行相应的配置,通过串口3与板载UART转RS485芯片进行通信,进而对电机驱动器进行控制。

机器返回数据接收模块:程序接收机器发送的相应指令的回复帧,并进行解析,得到相关数据并回复上位机。

IO口信号监控模块:在主函数中由systick定时器给出定时信号,并执行对相关IO口的扫描监控,分别包括对三轴的上下限位信号,归零点信号,移动到位信号进行扫描,并执行相应的动作。

串口打印输出模块:通过串口1打印程序各部分调试信息,通过在主函数中轮询一个消息队列进行打印。

主程序设计

主程序流程图如图2所示,STM32上电后进行硬件初始化,包括GPIO口初始化,定时器初始化,串口初始化,电机上电初始化。硬件配置成功后循环执行:上位机通讯串口轮询,串口1消息队列轮询,IO端口扫描。 三轴伺服电机控制主程序流程图

中断设计

程序共开启了三个中断,分别为串口2接收中断,串口3接收中断,systick定时器中断。 串口2中断用于接收上位机发送的控制帧,每当接收到完整的一帧时,则产生接收到新帧信号,并进行校验与数据分析,具体流程如图3所示。 串口3中断用于与电机驱动器进行MODBUS协议通信,每当向驱动器发送一帧03,06或10指令帧时,会接收到对应帧的响应信号,每当接收到完整一帧时,则对数据进行校验与分析,具体流程如图4所示。 systick定时器基础中断间隔为1ms,并从中分频产生出10ms间隔,与全局运行时间等计时操作。 接收中断流程图

UART通信及数据解析

当程序接收到上位机的一帧新数据帧时,即对该数据帧进行解析,具体帧格式参照“上位机控制机器协议帧_新”进行定义: (1) 0x02_配置数据帧:对灯板的一号灯位置坐标,灯间距,灯个数等进行配置。 (2) 0x03_走位数据帧:控制机器标定头移动到X轴与Y轴对应标号的灯位上方。 (3) 0x04_Z轴下移帧:控制机器标定头Z轴下移。 (4) 0x05_状态设置帧:设置机器三轴为锁定或释放状态。 (5) 0x06_移动控制帧:控制机器三轴分别移动到相应的位置。 (6) 0x07_位置信息请求帧:读取机器三轴当前所处的位置。 (7) 0x08_状态信息请求帧:读取机器当前三轴状态为释放或锁定。 (8) 0x09_回零帧:机器三轴执行回零操作。 当程序接收到上位机发送的控制帧并执行完相应动作后,会给上位机发送一帧响应帧,在通常情况下为“EF/GOOD!!!/GH”,若发生错误则会返回“EF/ERROR!!!/GH”,对于特定的信息请求帧会返回特定的帧。

RS485通讯及数据解析

程序通过串口3与板载UART转RS485通信芯片来与电机驱动器进行数据通信。根据“GB/Z 19582.1-2004 基于Modbus协议的工业自动化网络规范-第一部分”对于MODBUS通信协议的规范定义与“TSDA-C12B低压伺服用户手册”中的电机寄存器配置表,可以通过以下帧进行控制: (1) 0x03_读寄存器帧:可以读取单个寄存器或多个连续寄存器的值并返回读取结果。 (2) 0x06_写单个寄存器帧:可以对单个寄存器进行写操作并返回操作结果。 (3) 0x10_写多个寄存器帧:可以对多个连续的寄存器进行写操作并返回操作结果。 在每次向驱动器发送配置帧后,驱动器均会返回一帧数据帧,用于指示该帧是否执行成功或返回读取的数据,因此需要通过串口3的接收中断接收返回帧。当接受到一帧新的返回数据,对返回帧进行解析,并对相应的数据进行处理。

电机控制模式实现

电机的控制模式为由上位机做主机,STM32做从机,由上位机发送控制信号给STM32,并由STM32做主机,电机驱动器做从机,由STM32发送控制信号给电机驱动器。在STM32中完成对上位机指令的解析与电机驱动器的控制,并接收电机驱动器的返回帧与向上位机发送返回帧。 由于三轴电机均为串接在RS485总线上,整体框架如图5所示:

控制模式框架图

IO口监控

这边本来可以用外部中断的,但是发生了奇怪的信号干扰问题,就改成这种扫描按键式的检测了

程序通过对IO端口进行扫描来判断各外部信号是否被置位。外部信号包括如下: (1) X/Y/Z轴上限:指示各轴移动距离的上限,若触发则停机。 (2) X/Y/Z轴下限:指示各轴移动距离的下限,若触发则停机。 (3) X/Y/Z轴零点:指示各轴外部零点位置,在归零动作时使用。 (4) X/Y/Z轴到位信号:指示各轴是否运行到给定位置,可通过软件设置误差范围。 每过30ms在systick中断计时器中会置位扫描信号,在主程序中进行IO端口扫描,对各个端口的扫描过程略有不同,但大体可以归结为为如图6所示: 端口扫描流程图

程序说明

(1) 工程文件结构 软件工程名为“通过485串口控制伺服电机_V4”,在工程文件目录“Project/MDK-ARM(uV4)/project.uvprojx”的工程文件,使用Keil V5打开,工程文件结构如图7所示。主程序和主要控制逻辑都存放在User文件夹下,其中main.c存放主程序与IO端口扫描,modbus_host.c存放与上位机通讯以及控制电机的主要逻辑。BSP文件夹存放板载硬件的初始化与中断处理文件,其中bsp_timer.c存放与定时器相关的部分,bsp_uart_fifo.c存放与串口相关的部分,bsp.c存放对各文档函数的集总调用,bsp_user_lib.c存放程序用到的工具函数。bsp_msg.c存放消息打印相关函数。 串口控制伺服电机工程文件结构



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有