单片机源程序如下:
- #include "PID.h"
- /*以电机调速为例*/
- struct _pid{
- float SetSpeed; //设定值
- float ActualSpeed; //实际值
- float err; //偏差值
- float err_last; //上一个偏差值
- float err_last_last; //最上一个偏差值
- float Kp, Ki, Kd; //比例、积分、微分系数
- }pid;
- void PID_init() //初始化
- {
- pid.SetSpeed = 0.0;
- pid.ActualSpeed = 0.0;
- pid.err = 0.0;
- pid.err_last = 0.0;
- pid.err_last_last = 0.0;
- pid.Kp = 0.2; //可修改
- pid.Ki = 0.015; //可修改
- pid.Kd = 0.2; //可修改
- }
- float PID_realize(float Speed)
- {
- float incrementSpeed; //当前值
- pid.SetSpeed = Speed; //用户设定值
- pid.err = pid.SetSpeed - pid.ActualSpeed; //偏差值
- incrementSpeed =pid.Kp*(pid.err - pid.err_last) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_last_last + pid.err_last);
- pid.ActualSpeed += incrementSpeed; //实际输出值
- pid.err_last = pid.err_last_last;
- pid.err_last_last = pid.err;
- return pid.ActualSpeed;
- }
复制代码- /**********************PID算法测试C语言实现**************************/
- // 0.96寸OLED显示 IIC通讯
- // --------------------
- // GND 电源地
- // VCC 接5V或3.3v电源
- // SCL 接PA5(SCL)
- // SDA 接PA7(SDA)
- // --------------------
- #include "stm32f10x.h"
- #include "oled.h"
- #include "PID.h"
- int main(void)
- {
- u32 count=0;
- OLED_Init(); //初始化OLED
- OLED_Clear();
- PID_init();
-
- OLED_ShowChar(16,0,'P',16);
- OLED_ShowChar(24,0,'I',16);
- OLED_ShowChar(32,0,'D',16);
- OLED_ShowCHinese(44,0,0);
- OLED_ShowCHinese(60,0,1);
- OLED_ShowCHinese(76,0,2);
- OLED_ShowCHinese(92,0,3);
-
- OLED_ShowCHinese(0,4,4);
- OLED_ShowCHinese(16,4,5);
- OLED_ShowCHinese(32,4,6);
- OLED_ShowChar(48,4,':',16);
-
- OLED_ShowCHinese(0,6,7);
- OLED_ShowCHinese(16,6,8);
- OLED_ShowCHinese(32,6,9);
- OLED_ShowChar(48,6,':',16);
-
- OLED_ShowChar(86,5,'.',12);
- OLED_ShowChar(86,7,'.',12);
-
- OLED_ShowNum(56,5,(int)setspeed,5,12); //显示设定值整数部分
- OLED_ShowNum(93,5,(int)(setspeed*10)%10,1,12); //显示设定值小数部分
- OLED_ShowNum(99,5,(int)(setspeed*100)%10,1,12);
- OLED_ShowNum(105,5,(int)(setspeed*1000)%10,1,12);
- OLED_ShowNum(111,5,(int)(setspeed*10000)%10,1,12);
- while(count<1000)
- {
- float Speed = PID_realize(setspeed);
- OLED_ShowNum(56,7,Speed,5,12); //显示当前值整数部分
- OLED_ShowNum(93,7,(int)(Speed*10000)%10000,4,12); //显示当前值及小数点后4位
- }
- }
复制代码
所有资料51hei提供下载:
PID算法测试.7z
(184.24 KB, 下载次数: 140)
|