OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 86|回复: 1

STM32F103C8T6与PD42S1Modbus通讯

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2022-1-22
在线时间
7 小时
发表于 3 天前 | 显示全部楼层 |阅读模式
最近买了原子的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);
}

回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2022-1-22
在线时间
7 小时
 楼主| 发表于 3 天前 | 显示全部楼层
测试完成了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-4-2 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表