Arduino Mega2560 使用RS485-Modbus 来控制直流无刷电机,读写寄存器方式

本文介绍使用Arduino通过RS485总线控制直流无刷电机的方法。文章详细记录了硬件连接过程,包括TTL到RS485的转换及注意事项,并提供了控制电机速度、加减速等操作的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近在搞一个小东西需要用到直流无刷电机,用了一个比较高大上一点的控制器,带有多种控制功能;其中有个RS485总线控制的,通过读写寄存器来实现速度、加减速、制动、换向的控制。平常用的单片机是Arduino,没有485的接口,因此从网上买了TTL-->485的转换模块,现在这个模块做的很好了,都是流向自动控制,不用操心,用起来和普通的TTL接口一模一样。

       首先按照控制器说明书的连接好硬件,这个很简单没什么坑,控制器也很智能,可以自学习记住霍尔传感器的位置信息。

      其次连接好控制硬件,单片机<-->TTL 485模块<-->电机控制器;这里有坑,请看下面一幅图片:一般来讲,TTL接口是Rx接Tx,Tx接Rx的,可是,这个TTL转RS485模块TMD的是Tx接Tx,Rx接Rx,真的是巨坑无比!注意这里,连接好就行了。

      

 

 

然后,打开Arduino的IDE,需要额外先下载ModbusMaster这个库,#include <ModbusMaster.h>   //modbusmaster库一下,然后读写寄存器就好了。非专业码农,我的水平有限,程序里面可能有很多错误或者不对的地方,发出来仅供参考,我这里已经编译上传arduinomega2560,控制功能正常。打开串口监视器,输入0-20以内的车速,就可以驱动电机转动,大于20就停机。


#include <ModbusMaster.h>   //modbusmaster库
uint16_t Speed_address = 0x0042;//要读取的从站起始地址,十六进制Hex 0C转为十进制Dec 1
uint8_t m_length = 1; //从从站起始地址开始你需要读取的数据的长度
uint8_t result;     //串口通信结果,不用明白是什么,只要知道这不是你最终需要的数据就行
int k=758;      //   1km=75.8 次/min换向 = 758 电控目标值
uint16_t MotorSpeed = 0;
uint8_t t=1;
ModbusMaster node;// instantiate ModbusMaster object创建实例

void setup() 
{
  Serial.begin(9600);//  初始化串口1
  Serial1.begin(9600,SERIAL_8E1);//  初始化串口1,偶校验位+1
  node.begin(1, Serial1);//  通过串口1与从设备1通讯
}
int numdata = 0;;
void loop() 
{
//  node.writeSingleRegister(0x0040, 2);
if (Serial.available()) 
{  
     numdata=Serial.parseInt();
    if(numdata != 0)
    {
    MotorSpeed = numdata*k;
    Serial.println("Request Speed :" +String( numdata) +String("Km/h"));  
   // Serial.println(MotorSpeed); 
    while(Serial.read()>=0);
    }
} 
   if(numdata<20)
   {
      result = node.writeSingleRegister(0x0043, MotorSpeed);   //
      Serial.print("换向频率" + String(MotorSpeed)); 
      node.readHoldingRegisters(0x0034, 1);
      Serial.print("  实际转速:");
      float k =node.getResponseBuffer(0);
      Serial.print(k);
      
      node.readHoldingRegisters(0x0021, 1);
      Serial.print("  实际电流:" );
      float j = node.getResponseBuffer(0);
      Serial.print(j*0.01);
      
      node.readHoldingRegisters(0x0037, 1);
      Serial.print("  控制盒温度:" );
      float L = node.getResponseBuffer(0);
      Serial.print(L*0.1);

      node.readHoldingRegisters(0x0038, 1);
      Serial.print("  输入电压:" );
      float M = node.getResponseBuffer(0);
      Serial.print(M*0.1);
      Serial.print("  电量:" );
      Serial.print((M*0.1/6-3.2)*100);
      Serial.println("%" );
   }
    else
   {
      result = node.writeSingleRegister(0x0040, 2); //大于20km/h自由停车
      Serial.println("超过极限,停车" );
   }

 

通常,在工业中,我们有几种机器和设备(PLC,CNC,变频器)来控制和监视最多样化的工业过程。 为了使所有这些设备一起工作,必须在它们之间建立通信网络。 但是,由于电动机,螺线管和其他执行器的激活,该行业环境中存在许多电磁干扰。 RS485通信标准是通信网络的物理层,可以实现多种协议,例如Modbus,Profibus等。 RS485通信标准适合在行业中实施,因为它接受几种网络拓扑,例如星形和环形。 它允许长距离通信,并使用双绞线电缆。由于我们具有差分通信信号,因此该电缆模型减少了电磁干扰,这有助于更好地抵抗噪声和电磁干扰。 除了RS485通讯之外,还有RS232通讯。它允许以点对点模式进行网络通信,并且遭受电磁干扰的影响更大。 但是,许多设备具有RS232通信,需要长距离传输数据。为此,我们需要使用称为MAX485的集成电路。 该集成电路在使TTL逻辑电平适应RS485通信所需的逻辑电平中发挥作用。 如今,已经有使用该集成电路的现成的低成本模块。它们允许信号调理并促进不同设备之间的通信。 因此,由于其坚固性,RS485通信可用于任何类型的环境。 因此,在本文中,我们将学习如何监视环境温度以及如何通过两个Arduino之间的串行/ RS485通信接收测量值。 Arduino Slave(发送器)将使用DS18B20数字传感器执行温度测量,并将测量值通过串行/ RS485发送到Arduino主设备(接收器),该设备将在LCD显示屏上写入20 x 4 I2C接收的温度值。 因此,通过本文您将学到: 在原型板上执行电路组装; 了解RS 485模块的操作; 了解DS18B20传感器的工作原理; 创建通信协议; 使用有线通信网络进行远程温度监控; 现在,我们将开始通过RS485串行通信使用DS18B20传感器进行温度监控项目的开发的完整介绍。 通过RS485串行通信使用DS18B20传感器开发温度监控项目 在图3中,我们具有项目组装所需的原理图电路。Arduino Uno将成为主机(接收器),它将接收温度测量值并将在LCD显示屏上显示20 x 4 I2C。 Arduino Nano将作为从设备(发送器),它将读取DS18B20传感器并通过RS485模块发送测量值。 现在,让我们转到设置项目所需的材料清单。 带有DS18B20和RS485模块的Arduino项目 温度传感器DS18B20是数字温度传感器,因为要传输信息,它使用协议1-Wire。 1-Wire协议由Dallas Semiconductor和Maxim制造。 1线总线对设备使用主/从概念。 微控制器是主机,外围设备是从机。 在制造过程中,每个设备都会收到一个唯一的ID,即设备标识号(地址),以便在有很多设备时可以在总线上对其进行标识。 信息格式: 1线仅使用一条数据线,并使用长脉冲和短脉冲表示1和0。60微秒脉冲表示0,15微秒脉冲表示1。 在VCC与DS18B20传感器的信号引脚之间必须使用4K7的上拉电阻,以使微控制器与传感器之间的通信稳定。 将发射器和接收器电路组装到原型板上之后,我们可以在图6中看到原型板上的物理组装。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值