08 上位机)PID速度控制--接串口1!

08 上位机)PID速度控制–接串口1!

  1. CSDN 慕羽★大佬写的协议解析教程博客:https://blog.csdn.net/qq_44339029/article/details/106 004997

  2. 匿名上位机V7通信协议20210528发布https://pan.baidu.com/s/1nGrIGWj6qr9DWOcGpKR5 1g 提取码z8d1

  3. cJSON:{“p”:10,“i”:2,“d”:1,“a”:-2}

  4. 1、速度控制探索

    1. 前面我们已经能够通过编码器测量出速度值,下面我们来控制速度
    2. 我们先编写一个简单的控制方法
    3. 要求:转速控制在2.9-3.1转每秒
    4. 可以把中断里面不重要的输出注释掉
      在这里插入图片描述
  5. 开始实验
    在这里插入图片描述

  6. 现象:开始电机没有到达3转每秒,PWM占空比逐渐增大,电机逐渐达到要求转速、到达要求转速后我们增加阻力,电机变慢,阻力大小不变PWM占空比逐渐更大转速逐渐更大

  7. 这样我们就把转速控制到我们想要的范围,但是我们并不满意、能够看出来控制的速度很慢给电机一些阻力电机至少要2-3秒能够调整过来,这在一些场景是不允许的。

  8. 我们理想的控制效果是:在电机转速很慢的是时候能快速调整,在电机一直转的不能达到要求时候能够更快速度调整

  9. 引入——PID算法(比例,积分,微分)

  10. 2、准备工作-匿名上位机曲线显示速度波形方便观察数据

    1. 为了方便观察电机速度数据,我们通过上位机曲线显示一下。
    2. 我使用的版本是:匿名上位机V7.2.2.8版本推荐大家和我使用一样
    3. 我们要把STM32数据发送到匿名上位机,就要满足匿名上位机的数据协议要求
    4. 1.先补充一下大小端模式
      1. 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字
      2. 节,那么必然存在着一个如和将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。
      3. 所谓的大端模式(BE big-endian),是指数据的低位保存在内存的高地址中,而数据的高位,保 存在内存的低地址中(低对高,高对低);
      4. 所谓的小端模式(LE little-endian),是指数据的低位保存在内存的低地址中,而数据的高位保 存在内存的高地址中(低对低,高对高)。
      5. 常见的单片机大小端模式:(1)KEIL C51中,变量都是大端模式的,而KEIL MDK中,变量是小 端模式的。(2)SDCC-C51是小端寻址,AVRGCC 小端寻址.(3)PC小端,大部分ARM是小端
      6. (4)总起来说51单片机一般是大端模式,32单片机一般是小端模式.
        在这里插入图片描述
  11. 2.看一下上位机要求的协议
    在这里插入图片描述

  12. 灵活格式帧(用户自定义帧)
    在这里插入图片描述

  13. 因为串口每次发送一个字节,但是数据可能是int16_t 16位的数据,或者int32_t 32位数据,每次发送 16位数据,先发送数据低八位,还是先发送数据高八位那?

  14. 匿名协议通信介绍给出:DATA 数据内容中的数据,采用小端模式传送,低字节在前,高字节在后。

  15. 那么就要求,比如我们在发送16位数据0x2314我们要先发送低字节0x14,然后发送高字节0x23

  16. 那么如何解析出低字节或者高字节,就需要知道多字节数据在单片机里面是怎么存的,因为STM32是小 端存储,所以低字节就在低位地址中,高字节高位地址中。

  17. 如果使用32单片机 小端模式,0x23高地址,0x14在低地址,所以我们要先发低地址,再发高地址。下面就是对16位数据,或者32位数据的拆分

  18. //需要发送16位,32位数据,对数据拆分,之后每次发送单个字节

  19. //拆分过程:对变量dwTemp 去地址然后将其转化成char类型指针,最后再取出指针所指向的内容
    在这里插入图片描述

  20. 添加测试代码
    在这里插入图片描述

  21. 3、下面设置上位机-数据解析
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

(在图形中设置里选中用户数据波形)

  1. 这个是控制效果,并不理想,后面我们介绍PID控制
    在这里插入图片描述

在这里插入图片描述

  1. 4、PID逐个参数理解
    在这里插入图片描述

  2. 加入的现在 过去 未来概念

  3. p:现在 i:过去 d:未来
    在这里插入图片描述

  4. **5、PID的结构体类型变量(**里面成员都是浮点类型

    1. 先在pid.h声明一个结构体类型、声明.c中的函数
      在这里插入图片描述
  5. 然后在pid.c中定义结构体类型变量
    在这里插入图片描述

  6. 然后在main中要调用PID_init();函数
    在这里插入图片描述

  7. P调节函数函数只根据当前误差进行控制

  8. 主函数-可以估算当p=10

  9. 就有较好的响应速度 先看根据p比例控制的效果
    在这里插入图片描述

  10. p调节 电机稳态后还是存在误差

  11. 下面加入i 调节也就是减少静态误差 加入历史误差
    在这里插入图片描述

  12. 下面是PID调节的
    在这里插入图片描述

  13. 6、加入CJSON方便上位机调参
    在这里插入图片描述

  14. 调大堆栈
    在这里插入图片描述

  15. 软件开启中断
    在这里插入图片描述

  16. 开启接收中断
    在这里插入图片描述

  17. 中断回调函数
    在这里插入图片描述

  18. 然后我们把cJSON库放入工程(里面下载cJSON新版

  19. gtihub链接:https://github.com/DaveGamble/cJSON

  20. 百度网盘链接:https://pan.baidu.com/s/1AcNHtZuv5bokMQ2f6QoG7Q 提取码:a422

  21. 和添加其他文件一样,加入工程,然后指定路径

  22. 编写解析指令的函数:输入数据后立刻赋值的目的—修改了任意一数都可以立即反应到小车上
    在这里插入图片描述

  23. 测试发送cJSON数据就会解析收到数据:{“p”:10,“i”:2,“d”:1,“a”:-2}
    在这里插入图片描述

  24. 选功能界面——基本收发——CHR显示、CHR发送

  25. p,i,d,a(目标速度值)

  26. 然后我们赋值改变一个电机的PID参数和目标转速

  27. 然后我们通过串口发送命令,就会改变PID的参数了在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值