08 上位机)PID速度控制–接串口1!
-
CSDN 慕羽★大佬写的协议解析教程博客:https://blog.csdn.net/qq_44339029/article/details/106 004997
-
匿名上位机V7通信协议,20210528发布:https://pan.baidu.com/s/1nGrIGWj6qr9DWOcGpKR5 1g 提取码:z8d1
-
cJSON:{“p”:10,“i”:2,“d”:1,“a”:-2}
-
1、速度控制探索
- 前面我们已经能够通过编码器测量出速度值,下面我们来控制速度
- 我们先编写一个简单的控制方法
- 要求:转速控制在2.9-3.1转每秒
- 可以把中断里面不重要的输出注释掉
-
开始实验
-
现象:开始电机没有到达3转每秒,PWM占空比逐渐增大,电机逐渐达到要求转速、到达要求转速后我们增加阻力,电机变慢,阻力大小不变PWM占空比逐渐更大转速逐渐更大。
-
这样我们就把转速控制到我们想要的范围,但是我们并不满意、能够看出来控制的速度很慢,给电机一些阻力电机至少要2-3秒能够调整过来,这在一些场景是不允许的。
-
我们理想的控制效果是:在电机转速很慢的是时候能快速调整,在电机一直转的不能达到要求时候能够更快速度调整
-
引入——PID算法(比例,积分,微分)
-
2、准备工作-匿名上位机曲线显示速度波形方便观察数据
- 为了方便观察电机速度数据,我们通过上位机曲线显示一下。
- 我使用的版本是:匿名上位机V7.2.2.8版本推荐大家和我使用一样
- 我们要把STM32数据发送到匿名上位机,就要满足匿名上位机的数据协议要求
- 1.先补充一下大小端模式
- 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字
- 节,那么必然存在着一个如和将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。
- 所谓的大端模式(BE big-endian),是指数据的低位保存在内存的高地址中,而数据的高位,保 存在内存的低地址中(低对高,高对低);
- 所谓的小端模式(LE little-endian),是指数据的低位保存在内存的低地址中,而数据的高位保 存在内存的高地址中(低对低,高对高)。
- 常见的单片机大小端模式:(1)KEIL C51中,变量都是大端模式的,而KEIL MDK中,变量是小 端模式的。(2)SDCC-C51是小端寻址,AVRGCC 小端寻址.(3)PC小端,大部分ARM是小端
- (4)总起来说51单片机一般是大端模式,32单片机一般是小端模式.
-
2.看一下上位机要求的协议
-
灵活格式帧(用户自定义帧)
-
因为串口每次发送一个字节,但是数据可能是int16_t 16位的数据,或者int32_t 32位数据,每次发送 16位数据,先发送数据低八位,还是先发送数据高八位那?
-
匿名协议通信介绍给出:DATA 数据内容中的数据,采用小端模式传送,低字节在前,高字节在后。
-
那么就要求,比如我们在发送16位数据0x2314我们要先发送低字节0x14,然后发送高字节0x23
-
那么如何解析出低字节或者高字节,就需要知道多字节数据在单片机里面是怎么存的,因为STM32是小 端存储,所以低字节就在低位地址中,高字节高位地址中。
-
如果使用32单片机 小端模式,0x23高地址,0x14在低地址,所以我们要先发低地址,再发高地址。下面就是对16位数据,或者32位数据的拆分
-
//需要发送16位,32位数据,对数据拆分,之后每次发送单个字节
-
//拆分过程:对变量dwTemp 去地址然后将其转化成char类型指针,最后再取出指针所指向的内容
-
添加测试代码
-
3、下面设置上位机-数据解析
(在图形中设置里选中用户数据波形)
- 这个是控制效果,并不理想,后面我们介绍PID控制
-
4、PID逐个参数理解
-
加入的现在 过去 未来概念
-
p:现在 i:过去 d:未来
-
**5、PID的结构体类型变量(**里面成员都是浮点类型
- 先在pid.h声明一个结构体类型、声明.c中的函数
- 先在pid.h声明一个结构体类型、声明.c中的函数
-
然后在pid.c中定义结构体类型变量
-
然后在main中要调用PID_init();函数
-
P调节函数函数只根据当前误差进行控制
-
主函数-可以估算当p=10
-
就有较好的响应速度 先看根据p比例控制的效果
-
p调节 电机稳态后还是存在误差。
-
下面加入i 调节也就是减少静态误差 加入历史误差
-
下面是PID调节的
-
6、加入CJSON方便上位机调参
-
调大堆栈
-
软件开启中断
-
开启接收中断
-
中断回调函数
-
然后我们把cJSON库放入工程(里面下载cJSON新版
-
gtihub链接:https://github.com/DaveGamble/cJSON
-
百度网盘链接:https://pan.baidu.com/s/1AcNHtZuv5bokMQ2f6QoG7Q 提取码:a422
-
和添加其他文件一样,加入工程,然后指定路径
-
编写解析指令的函数:输入数据后立刻赋值的目的—修改了任意一数都可以立即反应到小车上
-
测试发送cJSON数据就会解析收到数据:{“p”:10,“i”:2,“d”:1,“a”:-2}
-
选功能界面——基本收发——CHR显示、CHR发送
-
p,i,d,a(目标速度值)
-
然后我们赋值改变一个电机的PID参数和目标转速
-
然后我们通过串口发送命令,就会改变PID的参数了