在进行任何程序编写和通电测试前,必须确保 Arduino 单片机与 SB-100/24Y矿用隔爆型永磁伺服电动机的物理接线完全正确。
一体化伺服电机的电源端子正负极一旦接反,会直接导致电源短路,甚至可能损坏驱动器 。
+V 端子:连接直流电源正极,电压范围为 +24V 至 36V 。
GND 端子:连接直流电源地(负极) 。
重载避坑建议:如果电机所带的负载惯性较大,或者在需要急刹车的场合下运行,强烈建议在电源端子(+V 和 GND)之间并联一个大容量电容(如 50V 1000µF),以吸收反向电动势,保护驱动器 。
电机采用标准的 DB9 公头接口进行信号传输,控制核心用到的引脚定义如下 :
PU+ / PU- (1脚/2脚):脉冲控制信号 。
DIR+ / DIR- (3脚/4脚):方向控制信号 。
485A / 485B (8脚/9脚):485 通信端口,内置隔离电源 。
COM (7脚):输出信号与 485 电源的公共地 。
脉冲控制模式(位置模式)下,Arduino 单片机充当控制核心 :
脉冲信号 (PU):脉冲上升沿有效 。Arduino 每输出一个方波脉冲,电机就旋转一个步距。脉冲的频率(速度)决定了电机的运行转速 。
方向信号 (DIR):通过高/低电平信号控制 。为了保证电机可靠换向,方向信号应先于脉冲信号至少 5µs 建立 。
本驱动器的输入信号高电平时支持 3.3V~5V,刚好可以与 Arduino 的 5V 输出引脚直接连线 :
Arduino Digital 2 (D2) → 电机的 PU+
Arduino Digital 3 (D3) → 电机的 DIR+
Arduino GND → 同时连接电机的 PU- 和 DIR-
注意:为了可靠响应脉冲信号,脉冲宽度应大于 1.2µs 。
// =================================================================
// 方式一:Arduino 脉冲+方向位置控制示例
// =================================================================
const int pulsePin = 2; // 脉冲引脚接 Arduino D2
const int dirPin = 3; // 方向引脚接 Arduino D3
// 驱动器默认参数:一圈脉冲数为 8192 (16位电子齿轮默认参数)
const int stepsPerRevolution = 8192;
void setup() {
// 设置控制引脚为输出模式
pinMode(pulsePin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
// ----------- 步骤 1:控制电机正向旋转一圈 -----------
digitalWrite(dirPin, HIGH); // 设定方向为高电平
delayMicroseconds(5); // 方向信号需先于脉冲信号至少 5µs 建立
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(pulsePin, HIGH);
delayMicroseconds(6); // 脉冲高电平保持(需大于 1.2µs)
digitalWrite(pulsePin, LOW);
delayMicroseconds(6); // 脉冲低电平保持。调节此延时可改变电机转速
}
delay(1000); // 停顿 1 秒
// ----------- 步骤 2:控制电机反向旋转一圈 -----------
digitalWrite(dirPin, LOW); // 切换方向为低电平
delayMicroseconds(5); // 方向建立时间
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(pulsePin, HIGH);
delayMicroseconds(6);
digitalWrite(pulsePin, LOW);
delayMicroseconds(6);
}
delay(1000); // 停顿 1 秒
}
在 Modbus 通讯模式下,Arduino 通过串口发送包含特定数据帧的十六进制(HEX)命令,直接读写驱动器的内部寄存器 。
默认通讯参数:波特率 19200, 数据位 8, 无校验 (N), 停止位 1 。
关键前提:控制前必须先向 0x00 寄存器(Modbus 使能)写入 1 ,否则外部脉冲信号有效,驱动器不响应通讯控制 。
驱动器内部 485 已通过光耦隔离 。连线方式如下:
Arduino TX (D11) → 485 模块的 DI (数据输入)
Arduino RX (D10) → 485 模块的 RO (数据输出)
Arduino Digital 4 (D4) → 同时连 485 模块的 DE 和 RE(控制收发状态)
485 模块 A 端 → 电机的 485A
485 模块 B 端 → 电机的 485B
Arduino GND → 电机的 COM
// =================================================================
// 方式二:Arduino RS485 Modbus RTU 控制示例
// =================================================================
#include <SoftwareSerial.h>
const int RE_DE_PIN = 4; // 485 收发控制引脚接 D4
SoftwareSerial mySerial(10, 11); // 软串口定义:RX 接 D10, TX 接 D11
// 发送 Modbus 原始数据帧的函数
void sendModbusCommand(byte cmd[], int len) {
digitalWrite(RE_DE_PIN, HIGH); // 切换为发送状态
delay(1);
mySerial.write(cmd, len); // 串口输出 HEX 字节流
mySerial.flush(); // 等待硬件发送缓存排空
delay(1);
digitalWrite(RE_DE_PIN, LOW); // 切回接收状态释放总线
}
void setup() {
pinMode(RE_DE_PIN, OUTPUT);
digitalWrite(RE_DE_PIN, LOW);
mySerial.begin(19200); // 匹配电机默认通讯波特率 19200
delay(500);
// 【步骤 1】Modbus 使能 (往寄存器地址 0x00 写入 1)
// HEX 源码命令:01 06 00 00 00 01 48 0A
byte modbusEnableCmd[] = {0x01, 0x06, 0x00, 0x00, 0x00, 0x01, 0x48, 0x0A};
sendModbusCommand(modbusEnableCmd, 8);
delay(100);
// 【步骤 2】驱动器输出使能 (往寄存器地址 0x01 写入 1)
// 指令带标准 CRC 校验:
byte motorEnableCmd[] = {0x01, 0x06, 0x00, 0x01, 0x00, 0x01, 0x19, 0xCA};
sendModbusCommand(motorEnableCmd, 8);
delay(100);
}
void loop() {
// 【步骤 3】通过功能码 0x10 发送增量位置指令走位置
// A. 控制 1 号电机向前移动一圈(这里假设一圈对应 4000 脉冲)
// HEX 源码命令:01 10 00 00 00 02 04 0F A0 00 00 F0 CC
byte moveForwardCmd[] = {0x01, 0x10, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0F, 0xA0, 0x00, 0x00, 0xF0, 0xCC};
sendModbusCommand(moveForwardCmd, 13);
delay(5000); // 延时 5 秒,等待电机运转定位完毕
// B. 控制 1 号电机向后移动一圈(对应脉冲数为 -4000)
// HEX 源码命令(已修正原手册末尾的 CRC 校验码错误):
byte moveBackwardCmd[] = {0x01, 0x10, 0x00, 0x00, 0x00, 0x02, 0x04, 0xF0, 0x60, 0xFF, 0xFF, 0xE1, 0x54};
sendModbusCommand(moveBackwardCmd, 13);
delay(5000); // 延时 5 秒
}
关于启动速度(堵转问题):在脉冲控制时,若设置的脉冲频率过高,电机可能会因为瞬间扭矩不足产生“嗡嗡”声而不旋转 。测试时应先从低速开始(增大程序中的 delayMicroseconds 延时),等转动顺畅后再逐步提速。
控制模式的覆盖关系:请务必注意,当往驱动器发送指令开启 Modbus使能=1 后,外部物理接口输入的脉冲信号将自动失效 。若想换回外部脉冲控制,必须通过通讯将 Modbus 使能写为 0,或将驱动器重新断电上电 。
动态更改数据的 CRC 计算:通讯示例中的十六进制数组最后两位为 CRC-16 校验码 。如果您在实际开发中需要修改运行位置(脉冲数)或目标速度,必须使用标准 Modbus CRC 算法重新计算末尾两位校验码 ,否则驱动器将视其为无效指令而不予响应。


客服
小程序
公众号