1d415d5c0c1be96e286c0b693d6d4cd.jpg (733.81 KB, 下載次數: 63)
下載附件
OLED顯示
2019-7-21 12:05 上傳
單片機源程序如下:
- #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, 下載次數: 141)
2019-7-21 15:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|