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

    文章

    134

    浏览量

    16095
收藏 人收藏

    评论

    相关推荐

    嵌入式OK3576-C开发板体验】开箱报告

    简介 很荣幸参与到本次由嵌入式和电子发烧友提供的OK3576-C开发板试用机会。
    发表于 08-22 02:13

    嵌入式RK3568开发板蓝牙收、发文件测试

    本文由电子发烧友论坛用户fsdzdzy提供,感谢分享。嵌入式每月定期开展新的开发板体验活动,欢迎更多工程师朋友的关注和参与。嵌入式O
    的头像 发表于 02-02 16:31 1803次阅读
    <b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式RK3568<b class='flag-5'>开发板</b>蓝牙收、发文件测试

    嵌入式T113-i开发板的调屏方法

    对于飞嵌入式T113-i开发板的调屏问题,需要按照以下步骤进行操作
    的头像 发表于 01-29 16:25 893次阅读

    如何在嵌入式T113-i开发板的Buildroot中移植MQTT协议?

    嵌入式OK113i-S开发板上市一段时间以来收获了很多关注,也成为了许多客户项目选型的优质之选。在实际的项目开发中,工程师朋友们可能会需
    的头像 发表于 01-26 08:02 469次阅读
    如何在<b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式T113-<b class='flag-5'>i</b><b class='flag-5'>开发板</b>的Buildroot中移植MQTT协议?

    嵌入式A40i-H核心已适配“矿鸿OS”

    嵌入式基于全志科技A40i-H打造的FETA40i-C核心成功完成了“矿鸿OS”的系统适配,嵌入式核心
    的头像 发表于 01-18 08:02 909次阅读
    <b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式A<b class='flag-5'>40i</b>-H核心<b class='flag-5'>板</b>已适配“矿鸿OS”

    嵌入式T113-i开发板的调屏方法,就是这样简单

    的配备为客户提供了更加多样的选择。今天小编就与大家分享一下为嵌入式OK113i-S开发板适配LVDS屏幕的过程。
    的头像 发表于 01-12 11:50 2174次阅读
    <b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式T113-<b class='flag-5'>i</b><b class='flag-5'>开发板</b>的调屏方法,就是这样简单

    技术帖 | 嵌入式T113-i开发板的休眠及唤醒操作

    嵌入式OK113i-S开发板支持两种休眠方式:freeze和mem。本篇内容小编会为大家介绍如何让
    的头像 发表于 12-29 08:02 1194次阅读
    技术帖 | <b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式T113-<b class='flag-5'>i</b><b class='flag-5'>开发板</b>的休眠及唤醒操作

    OK113i-S开发板试用】软件开发环境搭建

    OK113i-S开发板试用】软件开发环境搭建
    发表于 12-25 12:06

    OK113i-S开发板试用】开机测评--软件测试

    OK113i-S开发板试用】开机测评--软件测试
    发表于 12-25 11:03

    OK113i-S开发板试用】开机测评--硬件

    OK113i-S开发板试用】开机测评--硬件 一,开箱见图 包装精致 注意:上面红黄的先
    发表于 12-24 20:51

    OK113i-C开发板试用初体验

    在收到新的开发板并准备开始我们的开发之旅之前,我们还需要进行一些必要的准备工作,这些准备工作包括开发环境搭建、内核编译、kernel配置等,以确保我们的开发板能够正常运行并为我们提供所
    的头像 发表于 12-16 15:52 788次阅读
    <b class='flag-5'>飞</b><b class='flag-5'>凌</b>OK113<b class='flag-5'>i-C</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>初体验

    OK113i-C全志T113-i开发板rtl8723du WIFI功能测试及蓝牙驱动移植

    OK113i-C 全志T113-i开发板板载一个RTL8723du wifi/蓝牙二合一模块,板子出厂已经移植好了WIFI驱动但是蓝牙
    的头像 发表于 12-11 13:52 2272次阅读

    体验官分享 | 用户眼中的嵌入式OK3588-C开发板究竟有多优秀?

    今天小编就与大家分享一来自体验官@EmbedIoT的原创内容——OK3588-C开发板体验报告
    的头像 发表于 12-08 11:33 1469次阅读
    体验官分享 | 用户眼中的<b class='flag-5'>飞</b><b class='flag-5'>凌</b>嵌入式OK3588-<b class='flag-5'>C</b><b class='flag-5'>开发板</b>究竟有多优秀?

    明德扬PCIE开发板系列XILINX-K7试用体验-第二

    本文为明德扬原创文章,转载请注明出处!作者:Vito 明德扬PCIE开发板系列XILINX-K7试用体验-第二 第二周的试用计划是实现常见低速协议(UART,
    的头像 发表于 11-29 15:39 3217次阅读
    明德扬PCIE<b class='flag-5'>开发板</b>系列XILINX-K7<b class='flag-5'>试用</b>体验-第二<b class='flag-5'>篇</b>

    半导体前端工艺:第六完结篇):金属布线 —— 为半导体注入生命的连接

    半导体前端工艺:第六完结篇):金属布线 —— 为半导体注入生命的连接
    的头像 发表于 11-27 16:11 752次阅读
    半导体前端工艺:第六<b class='flag-5'>篇</b>(<b class='flag-5'>完结篇</b>):金属布线 —— 为半导体注入生命的连接