掌上单片机实验室 – RTT下实现PID自整定(20)

文章讲述了将基于Arduino+FreeRTOS的PID自整定功能成功移植到RT-Thread操作系统下,实现了PID电机调速,并测试了RT-Thread的实时性。通过串口数据发送验证,证明在目前的应用强度下,RT-Thread的实时性满足要求。
摘要由CSDN通过智能技术生成

一、背景

        前一步完成了将基于 Arduino + FreeRTOS 实现的小车运动控制功能移植到 RT-Thread 下,一切顺利,说明两个均为 RTOS 的系统从应用角度看,差别不大,至少在实现过程中如此。

        这一步要将前面已经基于 Arduino + Free RTOS实现的 PID 自整定功能移植到 RT-Thread下,实现PID调速。

        前面虽然将 PID 调速的功能编写完成,但并未实现 PID 调速;因为从代码上实现 PID 调试并不难,难的是 PID 参数的确定,即所谓“整定”过程。

        考虑到要尝试 PID 自整定算法,故前一步就没有去调试 PID 部分。

        PID 自整定的实现相对而言运算量稍大,尤其是我想借助于PC机实现直观的调整过程,增加了不少数据采集和发送操作,对程序运行的实时性有点压力,故用来测试  RT-Thread 的实时性应该是不错的素材。

二、需求

        将 Arduino 中第三方分享的 PID 自整定库:PID_AutoTune 引入目前的RTT程序中,实现PID参数的自整定,完成PID电机调速功能。

        测试 RT-Thread下的实时性是否能满足目前编程方式的功能要求。

三、实施

3.1  PID自整定及调速功能实现

        因为前面做的时候先是实现功能,后来又系统地梳理了程序,将一些不合理的地方完善。此处就不再重复,直接基于前面优化后的程序修改。

        主要修改的是:

  1. 主线程:增加对PID自整定、读整定结果、读PWM及速度记录命令的支持。
  2. 驱动线程:上述增加的三个命令的实现。
  3. 电机驱动类:优化测速算法
  4. 加入自己完善后的 PID自整定类

        这一步修改未涉及到硬件,纯粹是算法修改,应该说抽象到这个层面,不论在哪个环境下的C代码都是一样的,直接拷贝,略微修改一下不同的语法约定即可。

        PID自整定库基本未做修改,直接拷贝到应用程序目录中即可。如想了解关于 PID 自整定的详情,请看“掌上单片机实验室 – 实现PID自整定”一文,此处不再赘述。

        实际测试后,效果同前,看来至少在目前的应用强度下,RT-Thread的实时性没有问题。

3.2 串口数据发送阻塞操作验证

        因为在设计PID自整定功能的实现方式时,为了借助于PC机直观的看到自整定的过程,以及整定后调速的效果,设计了PWM及速度的记录功能,每20ms采集一点,设置了64点缓存,可以纪录约1秒时间,PC每秒读一次即可获取连续的速度及PWM变化数据。但这样串口数据收发的强度略大,尤其是发送,最多可能一次发约200字节。如果发送是阻塞方式,在发送期间不响应其它任务,则程序的实时性将大打折扣。

        目前串口发送设计的是中断发送方式,但看源代码似乎不完全是,故设计如下方式验证一下:

        1)设一个全局变量:rt_bool_t   g_bTxdBusy

        2)在调用串口发送函数前置位,函数结束后复位:

        g_bTxdBusy = true;

         rt_device_write(g_sCommandPort, 0, a_u8FrameHead, 7);  // 先发送帧头

        g_bTxdBusy = false;

        ……

        g_bTxdBusy = true;

         rt_device_write(g_sCommandPort, 0, p_u8GetPtr, u16TxdBytes);

          g_bTxdBusy = false;

        3)在串口接收线程中,在5ms唤醒操作时,检测发送标志,如果正在发射则说明串口在发送过程中并未完全阻塞,还可以响应其它线程的处理:

        if(u32EventG_RetVal & TIMER_FOR_CMD_RCV)

        {

                if(g_bTxdBusy) LOG_D("Txd Busy!");      // 测试串口发送阻塞现象 230410

                if(i_u16RcvGetPtr != i_u16RcvSavePtr)

                {

                        if(dataFrame_OK())

                        {

                            frameProc();

                        }

                }

         }

按上述编程后,实测结果:

        从上述结果看,目前发送方式下,并未阻塞,可以响应其它线程的操作,实时性应该不受此影响,暂时还可以使用,不用急于升级 Serial V2了。

四、结语

        按以往的经验,RT-Thread 如此复杂度的程序可以胜任,大多数场景都可以使用(针对MCU的应用而言),完全可以考虑选择  RT-Thread 做项目,使用难度也不算大。

        就我自己而言,目前还需要落实两个点:

  1. 如何确定当前线程的最大栈使用量(或者最小剩余栈空间)
  2. 如果得到MCU的空闲率(或占用率)

        这两点和程序可靠性相关,在 FreeRTOS 中,这两个数据可以很方便的获取,在 RT-Thread中还需要再深入琢磨一下,这是可以作为实际项目应用的前提。

——————————

文中程序下载:

1、单片机程序:

链接:https://pan.baidu.com/s/1Rpazl19Y5yFpuv2OoxIRdQ

提取码:4x23

2、PC端程序:

链接:https://pan.baidu.com/s/1zGwQCHo0_FgytI5P7pXkgQ

提取码:krmh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值