0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【飞凌OKA40i-C开发板试用体验】伺服电机控制完结篇

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-10-19 11:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:刘建华, 帖子地址:https://bbs.elecfans.com/jishu_2309556_1_1.html


【话外】经过大伙的一个星期的努力,疫情得到控制,核酸检测社会面清零。今天,单位的领导热情的用鲜花迎接我们凯旋而归。

63535e5af4761e1fea0327b9b84ca2c.jpg

790de888f1e317bb2bc1a0bfb87f131.jpg
到家后立马投入到这个帖子的收尾工作,因为今天是最后一天提交作品。话不多说继续我的工作。
前面已经实现的界面的制作,今天完结伺服电机的控制。

1、生成电机控制指令,电机的指令是通过modbus(RTU 模式)来控制驱动器的。主机可以通过 modbus 的读写寄存器功能来设置驱动器参数和控制运行。这里只用到了功能码为 0x3(读寄存器)、0x6(写寄存器)这两个指令。指令格式如下:
image.png

2、这里需要用到CRC16的较验。具体的函数如下:

quint16 MainWindow::CalcCRC16(quint8 *SC_Buffer, quint8 SC_Amount)//生成校验码
{
    quint16 Crc;
    quint8 n, m, x;

    Crc= 0xFFFF;//16个1
    m= SC_Amount;//拿到长度
    x= 0;

    while(m>0){
        Crc ^= SC_Buffer[x];//第一个数据帧异或
        for(n=0; n<8; n++){//因为是quint8是8位数据,所以循环8次
            if(Crc & 1){//移出位为1,就进行异或
                Crc >>= 1;
                Crc ^= 0xA001;
            }else//为0继续移出
                Crc >>= 1;
        }
        m--;//下一个数据帧
        x++;
    }

    x = Crc>>8;//拿到高8位
    Crc <<= 8;//剩下低8位
    Crc &= 0xff00;//低位清0
    Crc |= x;//实现高低位位置互换

    return Crc;
}

3、有了CRC16的较验后,组装设置使能电机命令如下:

void MainWindow::on_openMotorBut_clicked()
{
    QByteArray data;
    data.resize(8);
    quint8 crc[8];
    quint8 n;

    ui->textBrowser->insertPlainText("start clicked!n");
    if(ui->openMotorBut->text() == "启动电机")
    {
        //EN set
        crc[0] = 0x01;
        crc[1] = 0x06;
        crc[2] = 0x00;
        crc[3] = 0x00;
        crc[4] = 0x00;
        crc[5] = 0x01;
        quint16 reCrc;
        reCrc = CalcCRC16(crc,6);
        crc[6] = reCrc>>8;
        crc[7] = reCrc & 0xff;

        for(n=0;n<8;n++){
            data[n] = crc[n];
        }
        serialPort->write(data);
        ui->openMotorBut->setText("关闭电机");
    }
    else {
        //close
        crc[0] = 0x01;
        crc[1] = 0x06;
        crc[2] = 0x00;
        crc[3] = 0x00;
        crc[4] = 0x00;
        crc[5] = 0x01;
        quint16 reCrc;
        reCrc = CalcCRC16(crc,6);
        crc[6] = reCrc>>8;
        crc[7] = reCrc & 0xff;
        ui->openMotorBut->setText("启动电机");
    }
}

4、组装设置电机目标速度,输入框在设计时规定,只能输入整数,在获取目标速度时,电机的最高转速为3000转,所以如果设置值高于3000,也只设置3000转。具体函数如下:

void MainWindow::on_setSpeedBut_clicked()
{
    QByteArray data;
    data.resize(8);
    quint8 crc[8];
    quint8 n;
    quint16 speed_val;
    ui->textBrowser->insertPlainText("set speed!n");
        //speed set 01 06 00 02 05 DC 2A C3
    speed_val = ui->editSetSpeed->text().toInt();
    if (speed_val>3000)
    {
        speed_val = 3000;
    }
    crc[0] = 0x01;
    crc[1] = 0x06;
    crc[2] = 0x00;
    crc[3] = 0x02;

    crc[4] = speed_val>>8;
    crc[5] = speed_val & 0xff;
    quint16 reCrc;
    reCrc = CalcCRC16(crc,6);
    crc[6] = reCrc>>8;
    crc[7] = reCrc & 0xff;

    for(n=0;n<8;n++){
        data[n] = crc[n];
    }
    serialPort->write(data);
    ui->textBrowser->setText("set speed val");

}

5、获取实时的电机速度。获取电机实时速度,设置了一个定时器,每一秒向电机发送读取电机的指令:01 03 00 10 00 01 85 cf。串口接收数据时,判断前3位是否为收到的速度的指令,如果是就更新LCDNUMBER。具体指令如下:

void MainWindow::read_speed()
{
    QByteArray data;
    quint8 n;
    quint8 crc[8] = {0x01, 0x03, 0x00, 0x10, 0x00, 0x01, 0x85, 0xcf};
    for(n=0;n<8;n++){
        data[n] = crc[n];
    }
    serialPort->write(data);
}
void MainWindow::serialPortReadyRead()
 {
     /* 接收缓冲区中读取数据 */
    quint16 speed;
     QByteArray buf = serialPort->readAll();
     if(buf[0] == 0x01 && buf[1] == 0x03 && buf[2] == 0x02)
     {
         speed = buf[3]<<8 | buf[4];
         speed = speed/10;
         ui->lcdNumber->display(QString::number(speed));
     }
     ui->textBrowser->insertPlainText(QString(buf.toHex()));
 }

这里还有另外一个技巧,就是要设置一个标志,只能是串口打开成功,才能启用定时器。
6、组装好电机、控制器后,开发板后,成功的实现了对电机的实时控制与监控。
【总结】经过了差不多两个多月的学习试用,虽然写出了多篇帖子,学习到了不少东西,但是对这块开发板的了解还是只在皮毛。如果有时间,还会继续了解这块优秀的开发板,争取写出更好的作品。
附工程源码

*附件:myserial.zip

控制
电机视频,详见作者原帖子内容

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 飞凌
    +关注

    关注

    0

    文章

    135

    浏览量

    16795
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    OK-MX9596-C开发板试用】④RS485-TTL串口,扩展无限可能

    OK-MX9596-C开发板试用】③云端AI拍照识别 -
    发表于 11-09 22:44

    OK-MX9596-C开发板试用】②体验WIFI、蓝牙、音频、视频,为AI应用打下基础

    OK-MX9596-C开发板试用】①开箱图赏、跑分测试、yolo大模型三箭齐发 -
    发表于 10-21 18:17

    【作品合集】嵌入式OK527N-C开发板测评

    针对不同的功能做了深度优化,方便用户二次开发的同时简化用户设计,为您的项目提供良好的评估及设计依据。 活动详情地址:OK527N-C开发板
    发表于 09-22 15:54

    送啦!嵌入式联合NXP邀您参加OK-MX9596-C开发板试用活动

    送啦!嵌入式联合NXP邀您参加OK-MX9596-C开发板试用活动
    的头像 发表于 08-22 08:03 759次阅读
    送啦!<b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式联合NXP邀您参加OK-MX9596-<b class='flag-5'>C</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>活动

    T527N开发板试用】7寸RGB屏幕适配与TP驱动

    Touchscreens input device support---> 再选中 Focaltech Touchscreen 然后重新编译kernel。按照[【T527N开发板
    发表于 08-15 18:06

    RK3568开发板暗藏32位兼容开关?嵌入式带你一键解锁!

    RK3568是一款64位处理器,嵌入式为其提供的交叉编译器也是64位的,然而部分用户可能需要在RK3568开发板上运行32位应用。本文将详细阐述如何使用32位交叉编译器,编译出32位应用,并使其能够在
    的头像 发表于 07-19 08:49 4186次阅读
    RK3568<b class='flag-5'>开发板</b>暗藏32位兼容开关?<b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式带你一键解锁!

    T527N开发板试用T527N开发板开箱评测

    很高兴收到嵌入式申请的T527N开发板,板子的正反面如下图所示: 可以看到,板子上面的资源非常的丰富,有CAN,485, SIM卡槽
    发表于 07-04 11:43

    T527N开发板试用】开箱与开发板介绍视频

    嵌入式OK527N-C开发板开箱介绍】 https://www.bilibili.com/video/BV1sfKSzmEtU/?share_source=copy_web&
    发表于 06-26 09:43

    5分钟学会网络服务搭建!i.MX9352开发板 + Linux 6.1实战示例

    本文就将以嵌入式OK-MX9352-C开发板(搭载了在工业物联网领域广泛应用的NXP i.MX9352处理器)为平台,介绍如何在Linu
    的头像 发表于 06-13 16:42 1080次阅读
    5分钟学会网络服务搭建!<b class='flag-5'>飞</b><b class='flag-5'>凌</b><b class='flag-5'>i</b>.MX9352<b class='flag-5'>开发板</b> + Linux 6.1实战示例

    支持OpenHarmony操作系统!OK527N-C开发板免费试用 #开发板试用 #HarmonyOS

    开发板
    ElecFans小喇叭
    发布于 :2025年06月05日 16:52:42

    性能强悍!合众HZ-RK3568开发板试用体验

    月19日   评测数量: 10块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-05 16:30 1106次阅读
    性能强悍!合众HZ-RK3568<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>体验

    有奖丨米尔 NXP i.MX91开发板免费试用来啦

    米尔与NXP合作发布的新品基于NXPi.MX91应用处理器的MYD-LMX91开发板免费试用名额来啦~~米尔提供了3套价值588元的MYD-LMX91开发板发起试用活动您不仅可以免费体
    的头像 发表于 06-05 08:02 1117次阅读
    有奖丨米尔 NXP <b class='flag-5'>i</b>.MX91<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>来啦

    5分钟学会网络服务搭建,i.MX9352 + Linux 6.1实战示例

    本文将以嵌入式OK-MX9352-C开发板(搭载了在工业物联网领域广泛应用的NXP i.MX9352处理器)为平台,介绍如何在Linux
    的头像 发表于 05-30 11:08 2146次阅读
    5分钟学会网络服务搭建,<b class='flag-5'>飞</b><b class='flag-5'>凌</b><b class='flag-5'>i</b>.MX9352 + Linux 6.1实战示例

    【评测试用】合众HZ-T536开发板免费试用体验

    【评测试用】合众HZ-T536开发板免费试用体验
    的头像 发表于 05-27 08:05 697次阅读
    【评测<b class='flag-5'>试用</b>】合众HZ-T536<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>体验

    3.1s启动!嵌入式i.MX93开发板部署LVGL,打造更高效的GUI

    近期,嵌入式为基于NXP i.MX93系列处理器打造的OK-MX9352-C开发板成功移植了LVGL v8.3,不仅界面美观精致,启动速
    的头像 发表于 01-16 11:52 1062次阅读
    3.1s启动!<b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式<b class='flag-5'>i</b>.MX93<b class='flag-5'>开发板</b>部署LVGL,打造更高效的GUI