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

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

硬件准备

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

  1. 伺服系统: TSDA-C12B伺服驱动器+SDGA-01C31AB伺服电机
    这款驱动器上带一个RS485通信接口,并且多个驱动器可以使用串接式总线串在一起,只要设置好对应ID就行。
  2. 开发板: 用的是正点原子探索者,板载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所示:

该程序整体实现的功能包含以下几点:

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

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

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

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

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

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

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

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

  9. 串口打印输出模块:通过串口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存放消息打印相关函数。

带485接口伺服电机使用MODBUS协议控制相关推荐

  1. 树莓派CM4 Sensing(包含485接口)+python+继电器+水质仪+阿里云物联网平台ito实现实时检测水质并上传数据到阿里云ito和远程控制灯光

    一.硬件设备 1.树莓派CM4 Sensing(包含485接口) 2.带485接口的继电器 继电器的mdobus指令 3.水质仪 水质仪线路需要改造一下 下图中1是水质仪自带的线,2是给水质仪提供电源 ...

  2. 西门子PLC与昆仑通态触摸屏恒压供水程序,使用ABB变频器4 85接口通过Modbus协议进行通讯和控制

    西门子PLC与昆仑通态触摸屏恒压供水程序,使用ABB变频器4 85接口通过Modbus协议进行通讯和控制 另提供:plc程序代写 代做 代编,plc程序设计,编程,西门子plc,三菱plc,台达plc ...

  3. STM32HAL库RS485-ModBus协议控制伺服电机

    STM32HAL库RS485-ModBus协议控制伺服电机 一个月前,接手了一个学长的毕设小车,小车采用rs485通信的modbus协议驱动轮毂电机,与往常我学习的pwm控制电机方法大相径庭,在这里以 ...

  4. RS485接口modbus协议RTU方式

    文章目录 RS485接口modbus协议RTU方式 一.RS485接口 二.Modbus通信协议 1.1 通信协议 1.2 通信方向 1.3 主从模式和寻址帧格式 1.4 modbus的主机寻址帧格式 ...

  5. 安卓开发板之串口通信,通过modbus Rtu协议控制下位机

    安卓开发板之串口通信,通过modbus Rtu协议控制下位机 1.环境准备 2.编写串口操作核心类 3.编写测试类 前言:因为公司最近有个人脸识别门禁的项目,这个项目主要业务是实现远程人脸注册,管理员 ...

  6. 台达DVP系列PLC与台达DTA温控器modbus通讯案例功能:采用台达DVP ES型号PLC,对台达DTA温控器通过485方式,modbus协议,进行温度的设定

    台达DVP系列PLC与台达DTA温控器modbus通讯案例功能:采用台达DVP ES型号PLC,对台达DTA温控器通过485方式,modbus协议,进行温度的设定,温度探头型号设定,实际温度读取. 硬 ...

  7. ubuntu16.04下使用Modbus RTU协议控制Robotiq

    ubuntu16.04下使用Modbus RTU协议控制Robotiq 一.设备配置 二.创建工作空间 三.安装驱动 四.配置串口 五. ROS节点控制夹爪 六.RVIZ显示模型 一.设备配置 操作系 ...

  8. 三菱FX1N PLC 485与三菱变频器modbus通讯 对变频器进行频率设定,加减速时间设置,正反转,启停控制

    三菱FX1N PLC 485与三菱变频器modbus通讯可直接拿来实用了,三菱FX PLC与三菱变频器通讯 采用器件:三菱FX1N PLC,FX1N485BD板,1台三菱E740变频器,三菱FX2N ...

  9. C#使用Modbus协议读写汇川PLC的M区寄存器(基本接口封装)

    C#使用Modbus-TCP协议读取汇川PLC,Modbus读写是按照MW地址来处理的 [寄存器单位是字WORD,占用两个字节,类似于C#中的ushort(UInt16)],实际测试发现字符串是按照字 ...

  10. 智能型水泵控制器,双路排污、稳压控制、带BA接口

    智能型水泵控制器GYXF330-2LP-B,双路排污.稳压控制.带BA接口,是应市场需求推出的一款高性能产品,主要用于排污泵.稳压泵.给水泵等控制.本装置用于水泵控制设备中的逻辑运算.自动远程信号处理 ...

最新文章

  1. 控制ftp访问时间段
  2. 013_JavaScript函数
  3. 小程序子组件向父组件传值_一套组件化、可复用、易扩展的微信小程序 UI 组件库...
  4. 如何用架构师思维解读区块链技术?
  5. NOIP2008 普及组T1 ISBN号码 解题报告-S.B.S.
  6. 5个常用的Python功能代码
  7. python中不论类的名字是什么歌_Python自动猜歌名,还愁排名上不去嘛?
  8. Android gradlew 多渠道打包
  9. NS2中数据包Packet的分析 (转帖)
  10. android出现anr(application not response)的分析
  11. 苹果手机怎么在照片上添加文字_不管用什么手机,这样操作一下,就能直接给照片添加文字...
  12. 2021年安全员-C证(安徽省)考试试卷及安全员-C证(安徽省)试题及解析
  13. 彩虹自助下单平台对接爱代挂插件程序
  14. 简单数论入门和基础数学知识(未完)
  15. 深度linux关闭搜狗后没法输入法,Deepin v20无法安装搜狗官方输入法 for Linux,附原因和解决办法...
  16. 原生js删除html,javascript删除一个html元素节点的方法
  17. 51单片机计数器c语言编程,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
  18. Python函数(西安加油!!!)
  19. 遗传图谱基础原理培训资料
  20. maven 打包错误:Please refer to xxx\target\surefire-reports for the individual test results.

热门文章

  1. 禁忌搜索算法TS求解连续函数最值
  2. Win7系统能用一键装机的方式安装win10吗?
  3. MAC终端使用SSH连接远程服务器
  4. UE4开发游戏的流程
  5. FPGA入门实验试验报告
  6. spss和python stata matlab_毕业季:计量经济学实证研究中,哪款软件好(SPSS,Eviews,Matlab,stata,SAS)...
  7. Docker cgroups资源控制
  8. 如何为html代码加密
  9. 数据挖掘第三版课后习题
  10. 车载通信——CAN通信诊断协议