智能车竞赛·通过虚拟示波器实现电机PID调参

  • Post author:
  • Post category:其他

本文主要针对智能车小白,大佬可以浅看一下,如有错误希望大家多多指正。

引入:

刚入门智能车的朋友们可能都知道备赛时要对电机进行PID调试,看了一大堆资料,了解了什么是位置式PID,什么是增量式PID,kuakua一顿乱写,写好了电机PID控制代码。写好代码之后,诶!我要怎么调试呢?怎么在电脑上看电机的转速呢?哦~!懂了!要用上位机来看。诶!上位机是什么?……

估计小白们一开始肯定会有这样的疑惑吧。下面我就开门见山,给大家展示一下我用的“上位机”。

  • 这里插一句,因为百度百科对“上位机”的释义是:可以直接发出操控命令的计算机,屏幕上显示各种信号变化(液压,水位,温度等)。我用的这个软件(VisualScope)没有发出操控命令的功能,只能显示信号变化,所以下面都把它叫做示波器

它长这个样子:(乍一看有点像MC里的方块)

刚开始电机PID调试(速度波动很大,纵轴表示速度,蓝线和紫线是目标速度,分别为左右轮):

电机PID调试完成后(速度波动小):

 电机PID调参到上图所示的程度应该就差不多了,虽然每个队每辆车的调试结果可能有所差异,但也大差不差。在这篇文章里我主要讲如何让电机的转速在电脑中显示,方便车友们PID调参。

第一步 硬件准备

  •  编码器。可以这么说,电机闭环的实现离不开编码器。如果你是双驱车那就要有两个编码器,四驱车(H/M)就要有四个编码器。编码器用龙邱或者逐飞的都可以。要带方向的还是正交编码视个人情况而定。
  • 无线模块。本人使用的是逐飞的恩智浦智能车无线串口模块,排针端和USB端各一个,一个插在电脑接收数据,一个插在主板的串口模块发送数据。

第二步 配置无线模块和虚拟示波器

逐飞关于无线模块的资料都是免费开源的(获取链接我会放在文末)。当你向逐飞客服要资料时,你收到的资料大概会是这样:

 这里给出了两种上位机,一个是逐飞科技无线转串口上位机,一个是sscom32上位机(在串口助手压缩文件里)。虽然给了这两个上位机,但看图像调PID的话这两个上位机基本用不上。

拿到资料之后,我们首先点开串口说明书,在这里我建议大家购买最新或者较新版本的无线串口模块。接着按照说明书里的内容配置好无线串口模块。我一开始没有配置,波特率之类的参数都默认好了,如果一开始你没有配置无线串口模块不能实现数据发送的话,就按照说明书配置一遍。

接下来就到了配置虚拟示波器(VisualScope)。之前没听说过虚拟示波器的可能不知道在哪里找到这个示波器的资源,但其实这个资源是可以直接和逐飞客服要的(我会放在文末),而且逐飞的代码库里有与虚拟示波器之间的通信协议(代码层面),在写代码的时候直接调用逐飞库里的函数就可以实现数据在示波器显示了。(野火调试助手之类的上位机也很好用,但是逐飞没有现成的函数实现数据在野火上位机的显示。)

虚拟示波器的操作界面

 获取虚拟示波器资源之后,参照使用说明配置好串口与示波器。最重要的是通信端口(我这里是COM7)和波特率(115200)。

配置好以上,我们给MCU烧录带有数据传送的代码,就可以实现数据在虚拟示波器的显示。

第三步 代码实现

//以下代码编写使用了逐飞最新的库
#include "zf_common_headfile.h"

int16 data1=0, data2=0, data3=0, data4=0;
uint8 data_buffer[10];  

int main(void)
{
     clock_init(SYSTEM_CLOCK_600M);  // 初始化芯片时钟 工作频率为 600MHz
     debug_init();                   // 初始化默认 debug uart(这些初始化函数默认加入)
     wireless_uart_init ();          // 无线转串口模块 初始化

     while(1)
     {
        data1+=10;
        data2-=10;
        data3*=2;
        data4+=1;
        virtual_oscilloscope_data_conversion (data1, data2, data3, data4, data_buffer); // 将4个数据打包                           
        wireless_uart_send_buff(data_buffer, 10); // 发送数据
     }
}

以上代码的data1等变量为测试参数,实际运用时换成编码器值encoder1、encoder2、encoder3、encoder4。

注意事项

  • 电机PID调试方法:先调 I 值,调至实际速度曲线在速度参考线附近振荡时,再调P值,最后根据实际调试效果来调试D值。如果仅调试了PI就能很好地实现速度闭环,那么D值就不是必要的(电机PI)。
  • 很重要的一点!调试效果除了受调参是PID数值的影响,还受无线串口发送数据间隔编码器获取电机转速的时间间隔影响。你想,编码器每间隔1s获取一次转速和每间隔1ms就获取一次转速对比,肯定是后者的精确度更高。这个获取数据的时间间隔是可以在代码直接修改,或者通过 systick_delay函数间接修改。

资料获取:

无线转串口资料:https://pan.baidu.com/s/1nTQtYR_6dBcDM_vS_UEv9A

虚拟示波器:https://pan.baidu.com/s/198CMXTZsbI3HAEqNXDngBw

写在最后:如果大家对本文章有任何疑惑的都可以在评论区留言。感谢!


版权声明:本文为S13352784013原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。