Arduino 单片机控制 SB-100 伺服电机示例说明 点击:6 | 回复:0



新怡机电

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 2回
  • 年度积分:20
  • 历史总积分:20
  • 注册:2013年7月22日
发表于:2026-05-30 06:16:20
楼主

Arduino 单片机控制 SB-100 伺服电机示例说明

一、 硬件接线基础与安全注意事项

在进行任何程序编写和通电测试前,必须确保 Arduino 单片机与 SB-100/24Y矿用隔爆型永磁伺服电动机的物理接线完全正确。

1.1 电源接口接线(防烧毁核心)

一体化伺服电机的电源端子正负极一旦接反,会直接导致电源短路,甚至可能损坏驱动器

+V 端子:连接直流电源正极,电压范围为 +24V 至 36V 。

GND 端子:连接直流电源地(负极)

重载避坑建议:如果电机所带的负载惯性较大,或者在需要急刹车的场合下运行,强烈建议在电源端子(+V 和 GND)之间并联一个大容量电容(如 50V 1000µF),以吸收反向电动势,保护驱动器 。

1.2 信号接口定义

电机采用标准的 DB9 公头接口进行信号传输,控制核心用到的引脚定义如下 :

PU+ / PU- (1脚/2脚):脉冲控制信号

DIR+ / DIR- (3脚/4脚):方向控制信号

485A / 485B (8脚/9脚)485 通信端口,内置隔离电源 。

COM (7脚):输出信号与 485 电源的公共地 。

二、 方式一:指令脉冲 + 方向位置控制模式

2.1 控制原理简介

脉冲控制模式(位置模式)下,Arduino 单片机充当控制核心 :

脉冲信号 (PU):脉冲上升沿有效 Arduino 每输出一个方波脉冲,电机就旋转一个步距。脉冲的频率(速度)决定了电机的运行转速 。

方向信号 (DIR):通过高/低电平信号控制 。为了保证电机可靠换向,方向信号应先于脉冲信号至少 5µs 建立 。

2.2 硬件接线(共阴极接法)

本驱动器的输入信号高电平时支持 3.3V~5V,刚好可以与 Arduino 的 5V 输出引脚直接连线 :

Arduino Digital 2 (D2) → 电机的 PU+ 

Arduino Digital 3 (D3) → 电机的 DIR+ 

Arduino GND → 同时连接电机的 PU-  DIR- 

注意:为了可靠响应脉冲信号,脉冲宽度应大于 1.2µs 。

2.3 Arduino 脉冲控制示例程序

// =================================================================

// 方式一: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

}

三、 方式二:RS485 通讯控制(Modbus RTU 协议)

3.1 控制原理简介

Modbus 通讯模式下,Arduino 通过串口发送包含特定数据帧的十六进制(HEX)命令,直接读写驱动器的内部寄存器 。

默认通讯参数:波特率 19200, 数据位 8, 无校验 (N), 停止位 1 

 

关键前提:控制前必须先向 0x00 寄存器(Modbus 使能)写入 1 ,否则外部脉冲信号有效,驱动器不响应通讯控制 。

3.2 硬件接线(需 TTL 转 RS485 模块)

驱动器内部 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 

3.3 Arduino 485 通讯控制示例程序

// =================================================================

// 方式二: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);

 

  // 【步骤 1Modbus 使能 (往寄存器地址 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 算法重新计算末尾两位校验码 ,否则驱动器将视其为无效指令而不予响应。 




热门招聘
相关主题

官方公众号

智造工程师