最近在搞一个小东西需要用到直流无刷电机,用了一个比较高大上一点的控制器,带有多种控制功能;其中有个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("超过极限,停车" );
}