新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2022-1-22
- 在线时间
- 7 小时
|
最近买了原子的PD42S1的步进电机闭环驱动,例程给的是原子自定义协议的例程,有大佬改过ModbusRTU标准协议版本的吗?想学习一下。以下是速度模式原子哥的源码
/**
* @brief 速度模式
* @param addr : 电机地址
* @param dir : 方向 ,0正转,1反转
* @param acc : 加速度 ,范围0 - 200,单位RPM/SS 注意:0直接启动
* @param speed : 速度 ,范围0.1 - 3000RPM
* @retval 从机应答 : 帧头 + 地址 + 功能码 + 参数列表 + 校验字节 + 帧尾
*/
void smd_speed_mode(uint8_t addr, uint8_t dir, uint8_t acc, float speed)
{
uint8_t cmd[16] = {0};
/* 装载命令 */
cmd[0] = FRAME_HEAD; /* 帧头 */
cmd[1] = addr; /* 地址 */
cmd[2] = FCT_SPEED_MODE; /* 功能码 */
cmd[3] = dir; /* 方向 */
cmd[4] = acc; /* 加速度,注意:0是直接启动 */
data_u.f = speed; /* 速度(RPM) */
cmd[5] = data_u.b[3];
cmd[6] = data_u.b[2];
cmd[7] = data_u.b[1];
cmd[8] = data_u.b[0];
cmd[9] = smd_checksum(cmd, 9); /* 校验和 */
cmd[10] = FRAME_TAIL; /* 帧尾 */
/* 发送命令 */
smd_send_data(cmd, 11);
}
我按照ModbusRTU协议进行了修改,但是电机没有反应
void Mysmd_speed_mode(uint8_t addr, uint8_t dir, uint8_t acc, float speed)
{
uint8_t cmd[16] = {0};
/* 装载命令 */
cmd[0] = addr; /* 地址 */
cmd[1] = 0x10; /* 功能码 */
cmd[2] = 0x00; /* 地址 */
cmd[3] = 0xF1; /* 功能码 */
cmd[4] = 0x00; /* 地址 */
cmd[5] = 0x03; /* 功能码 */
cmd[6] = 0x06; /* 功能码 */
cmd[7] = dir; /* 方向 */
cmd[8] = acc; /* 加速度,注意:0是直接启动 */
data_u.f = speed; /* 速度(RPM) */
cmd[9] = data_u.b[3];
cmd[10] = data_u.b[2];
cmd[11] = data_u.b[1];
cmd[12] = data_u.b[0];
/* 计算CRC16(仅针对前13字节) */
uint16_t crc_val = smd_crc16(cmd, 13);
/* 将CRC16高字节在前、低字节在后填入命令 */
cmd[13] = (uint8_t)(crc_val >> 8); /* CRC高字节 */
cmd[14] = (uint8_t)(crc_val & 0xFF); /* CRC低字节 */
/* 发送命令 */
smd_send_data(cmd, 15);
}
|
|