详细介绍如何使用RA4L1-SENSOR开发板通过Modbus RTU协议控制28BYJ-48步进电机,支持414、424、418三种拍数控制模式。
硬件介绍
RA4L1-SENSOR开发板
基于瑞萨RA4L1微控制器
丰富的GPIO接口和外设资源
支持Modbus RTU通信协议
高精度ADC采集功能
28BYJ-48步进电机
四相五线式步进电机
减速比:1:64
步进角度:5.625°/64
工作电压:5V DC
驱动方式:ULN2003驱动板
引脚连接
// 四相八拍步进电机引脚定义
#define MOTOR_PHASE_A_PORT BSP_IO_PORT_06_PIN_00 // P600引脚
#define MOTOR_PHASE_B_PORT BSP_IO_PORT_04_PIN_06 // P406引脚
#define MOTOR_PHASE_C_PORT BSP_IO_PORT_04_PIN_05 // P405引脚
#define MOTOR_PHASE_D_PORT BSP_IO_PORT_06_PIN_02 // P602引脚
三种控制模式详解
1. 414拍模式(单四拍)
使用keil调试时的一些注意事项:
使用keil时,若不使用5.38以上版本会无法编译成功,或无法使用调试器连接or调试。-----更换5.41版本
static const uint8_t STEPPER_PHASE_SEQUENCE_414[4][4] = {
{1, 0, 0, 0}, // A相
{0, 1, 0, 0}, // B相
{0, 0, 1, 0}, // C相
{0, 0, 0, 1} // D相
};
特点:每次只有一个绕组通电,转矩较小但功耗低。
2. 424拍模式(双四拍)
static const uint8_t STEPPER_PHASE_SEQUENCE_424[4][4] = {
{1, 1, 0, 0}, // AB相
{0, 1, 1, 0}, // BC相
{0, 0, 1, 1}, // CD相
{1, 0, 0, 1} // DA相
};
特点:每次两个绕组同时通电,转矩大,运行平稳。
3. 418拍模式(八拍)
static const uint8_t STEPPER_PHASE_SEQUENCE_418[8][4] = {
{1, 0, 0, 0}, // A相
{1, 1, 0, 0}, // AB相
{0, 1, 0, 0}, // B相
{0, 1, 1, 0}, // BC相
{0, 0, 1, 0}, // C相
{0, 0, 1, 1}, // CD相
{0, 0, 0, 1}, // D相
{1, 0, 0, 1} // DA相
};
特点:单双相交替,分辨率高一倍,运行更平滑。
Modbus RTU通信协议
寄存器映射表
| 寄存器地址 | 功能 | 取值范围 | 说明 |
|---|---|---|---|
| 01 | 自动上传控制 | 0-1 | 0:关闭, 1:开启 |
| 02 | LED控制 | 0-7 | 控制3个LED灯 |
| 03 | 电压读取 | 0-4095 | ADC电压值 |
| 04 | 电机控制 | 0-5 | 0:停止,1:正转,2:反转,3:刹车,4:连续正转,5:连续反转 |
| 05 | 电机步数 | 0-65535 | 单次运行步数 |
| 06 | 电机速度 | 1-1000 | 步进间隔(ms) |
| 07 | 电机方向 | 0-1 | 0:顺时针,1:逆时针 |
| 08 | 拍数模式 | 0-2 | 0:414拍,1:418拍,2:424拍 |
通信示例
读取电机状态:
发送:01 03 00 03 00 01 74 0B
回复:01 03 02 00 00 B8 44
设置电机连续正转:
发送:01 06 00 03 00 04 18 0B
回复:01 06 00 03 00 04 18 0B
核心代码解析
void motor_init(void)
{
// 配置电机引脚为输出模式
uint32_t motor_pin_config = IOPORT_CFG_PORT_OUTPUT_HIGH | IOPORT_CFG_DRIVE_HIGH;
// 初始化所有相为低电平
R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PHASE_A_PORT, BSP_IO_LEVEL_LOW);
// ... 其他相初始化
}
相序控制函数
void stepper_motor_phase(uint8_t phase)
{
// 根据当前拍数模式选择相序表
switch (current_phase_mode)
{
case MOTOR_PHASE_MODE_414:
// 414拍模式处理
break;
case MOTOR_PHASE_MODE_418:
// 418拍模式处理
break;
case MOTOR_PHASE_MODE_424:
// 424拍模式处理
break;
}
// 设置各相电平状态
// 更新调试变量
}
连续运行处理
void motor_continuous_process(void)
{
uint32_t current_time = get_system_time_ms();
uint16_t speed = modbus_registers[REG_MOTOR_SPEED - 1];
// 非阻塞式步进控制
if (current_time - last_step_time >= speed)
{
// 根据方向和模式执行步进
stepper_motor_phase(current_phase);
// 更新相序索引
if (current_phase_mode == MOTOR_PHASE_MODE_418)
{
current_phase = (current_phase + 1) % 8;
}
else
{
current_phase = (current_phase + 1) % 4;
}
last_step_time = current_time;
}
}
功能特点
1. 多种控制模式
单次运行:执行指定步数后停止
连续运行:持续运行直到收到停止命令
正反转控制:支持双向旋转
2. 灵活的速度控制
速度范围:1-1000ms/步
实时速度调整
平滑的速度变化
3. 完善的错误处理
Modbus CRC校验
寄存器范围检查
非法状态处理
使用指南
1. 硬件连接
将28BYJ-48电机连接到ULN2003驱动板
驱动板IN1-IN4连接到RA4L1开发板对应引脚
提供5V电源供电
2. 软件配置
配置正确的引脚定义
设置Modbus从站地址
选择合适的拍数模式
3. 通信测试
使用Modbus调试工具发送命令:
测试寄存器读写功能
验证电机各控制模式
监控实时状态
应用场景
工业自动化:传送带控制、机械臂定位
智能家居:窗帘控制、智能门锁
仪器仪表:精密仪器定位、阀门控制
机器人技术:关节驱动、轮式移动
注意事项
电源要求:确保提供稳定的5V电源
散热考虑:连续运行时注意电机温度
机械保护:避免电机堵转损坏
通信稳定性:在工业环境中使用屏蔽电缆
总结
本项目展示了RA4L1-SENSOR开发板在步进电机控制方面的强大能力,通过Modbus RTU协议实现了工业级的远程控制。三种拍数模式提供了灵活的控制选项,适合不同精度和转矩要求的应用场景。代码结构清晰,易于二次开发和功能扩展。
有人问你控制电机要干啥?
请看VCR。
更换5.41版本后,我的Plinkv2一下子就连上了。
Target界面无法显示完全。----------更换5.41版本

串口配置完成之后,无法输出,或程序一直卡在printf函数。
答:e2studio中未勾选函数重定向。若使用keil开发则需要勾选Target中的 Use MicroLIB,然后手动重定向串口函数。重写fputc函数。


fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
// ????Modbus???????
if(p_args->event == UART_EVENT_RX_CHAR)
{
modbus_uart_rx_callback(p_args);
}
}
int fputc(int ch, FILE *f __attribute__((unused))){
err = R_SCI_UART_Write(&g_uart9_ctrl,(uint8_t *)&ch, 1);
if(FSP_SUCCESS != err)__BKPT();
while(uart_send_complete_flag == false){};
uart_send_complete_flag = false;
return ch;
}


全部评论