一、背景
前一步完成了将基于 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自整定及调速功能实现
因为前面做的时候先是实现功能,后来又系统地梳理了程序,将一些不合理的地方完善。此处就不再重复,直接基于前面优化后的程序修改。
主要修改的是:
- 主线程:增加对PID自整定、读整定结果、读PWM及速度记录命令的支持。
- 驱动线程:上述增加的三个命令的实现。
- 电机驱动类:优化测速算法
- 加入自己完善后的 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 做项目,使用难度也不算大。
就我自己而言,目前还需要落实两个点:
- 如何确定当前线程的最大栈使用量(或者最小剩余栈空间)
- 如果得到MCU的空闲率(或占用率)
这两点和程序可靠性相关,在 FreeRTOS 中,这两个数据可以很方便的获取,在 RT-Thread中还需要再深入琢磨一下,这是可以作为实际项目应用的前提。
——————————
文中程序下载:
1、单片机程序:
链接:https://pan.baidu.com/s/1Rpazl19Y5yFpuv2OoxIRdQ
提取码:4x23
2、PC端程序:
链接:https://pan.baidu.com/s/1zGwQCHo0_FgytI5P7pXkgQ
提取码:krmh