找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2488|回复: 2
打印 上一主题 下一主题
收起左侧

STM32 PID算法测试C语言程序实现 0.96寸OLED显示

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include "PID.h"

  2. /*以电机调速为例*/

  3. struct _pid{
  4.         float SetSpeed;       //设定值
  5.         float ActualSpeed;    //实际值
  6.         float err;            //偏差值
  7.         float err_last;       //上一个偏差值
  8.         float err_last_last;  //最上一个偏差值
  9.         float Kp, Ki, Kd;     //比例、积分、微分系数
  10. }pid;

  11. void PID_init()               //初始化
  12. {
  13.         pid.SetSpeed = 0.0;
  14.         pid.ActualSpeed = 0.0;
  15.         pid.err = 0.0;
  16.         pid.err_last = 0.0;
  17.         pid.err_last_last = 0.0;
  18.   pid.Kp = 0.2;               //可修改
  19.         pid.Ki = 0.015;             //可修改
  20.         pid.Kd = 0.2;               //可修改
  21. }

  22. float PID_realize(float Speed)
  23. {
  24.         float incrementSpeed;        //当前值
  25.         pid.SetSpeed = Speed;        //用户设定值
  26.         pid.err = pid.SetSpeed - pid.ActualSpeed;   //偏差值
  27.         incrementSpeed =pid.Kp*(pid.err - pid.err_last) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_last_last + pid.err_last);
  28.         pid.ActualSpeed += incrementSpeed;   //实际输出值
  29.         pid.err_last = pid.err_last_last;
  30.         pid.err_last_last = pid.err;
  31.         return pid.ActualSpeed;
  32. }
复制代码
  1. /**********************PID算法测试C语言实现**************************/

  2. //  0.96寸OLED显示   IIC通讯
  3. //              --------------------
  4. //              GND   电源地
  5. //              VCC   接5V或3.3v电源
  6. //              SCL   接PA5(SCL)
  7. //              SDA   接PA7(SDA)  
  8. //              --------------------
  9. #include "stm32f10x.h"
  10. #include "oled.h"
  11. #include "PID.h"

  12. int main(void)
  13.   {
  14.                 u32 count=0;

  15.                 OLED_Init();                        //初始化OLED  
  16.                 OLED_Clear();
  17.                 PID_init();
  18.         
  19.                 OLED_ShowChar(16,0,'P',16);
  20.                 OLED_ShowChar(24,0,'I',16);
  21.                 OLED_ShowChar(32,0,'D',16);
  22.                 OLED_ShowCHinese(44,0,0);
  23.                 OLED_ShowCHinese(60,0,1);
  24.                 OLED_ShowCHinese(76,0,2);
  25.                 OLED_ShowCHinese(92,0,3);
  26.                
  27.                 OLED_ShowCHinese(0,4,4);
  28.                 OLED_ShowCHinese(16,4,5);
  29.                 OLED_ShowCHinese(32,4,6);
  30.                 OLED_ShowChar(48,4,':',16);
  31.                
  32.                 OLED_ShowCHinese(0,6,7);
  33.                 OLED_ShowCHinese(16,6,8);
  34.                 OLED_ShowCHinese(32,6,9);
  35.                 OLED_ShowChar(48,6,':',16);
  36.                
  37.                 OLED_ShowChar(86,5,'.',12);
  38.                 OLED_ShowChar(86,7,'.',12);
  39.                
  40.                 OLED_ShowNum(56,5,(int)setspeed,5,12);  //显示设定值整数部分
  41.                 OLED_ShowNum(93,5,(int)(setspeed*10)%10,1,12);  //显示设定值小数部分
  42.                 OLED_ShowNum(99,5,(int)(setspeed*100)%10,1,12);
  43.                 OLED_ShowNum(105,5,(int)(setspeed*1000)%10,1,12);
  44.                 OLED_ShowNum(111,5,(int)(setspeed*10000)%10,1,12);
  45.         while(count<1000)
  46.         {
  47.           float Speed = PID_realize(setspeed);
  48.                 OLED_ShowNum(56,7,Speed,5,12);    //显示当前值整数部分
  49.                 OLED_ShowNum(93,7,(int)(Speed*10000)%10000,4,12);  //显示当前值及小数点后4位
  50.         }
  51. }
复制代码


所有资料51hei提供下载:
PID算法测试.7z (184.24 KB, 下载次数: 140)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:186249 发表于 2019-8-29 23:56 | 只看该作者
这个怎么样,下来看看
回复

使用道具 举报

板凳
ID:423971 发表于 2020-4-16 23:23 | 只看该作者
感谢楼主 学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表