- #include <iostream>
- #include <stdio.h>
- #include <math.h>
- #include <Windows.h>
- //定義PID變量的結構體
- struct _pid
- {
- float SetSpeed;
- float ActualSpeed;
- float err;
- float err_last; //定義上上個偏差
- float err_next; //定義上一個偏差值
- float Kp,Ki,Kd;
-
- }pid;
- //初始化變量
- void PID_init(void)
- {
- printf ("pid_value_init_begin\n");
- pid.ActualSpeed = 0.0;
- pid.SetSpeed = 0.0;
- pid.err = 0.0;
- pid.err_last = 0.0;
- pid. err_next = 0.0;
-
-
- pid.Kp = 0.2;
- pid.Ki = 0.015;
- pid.Kd = 0.2;
- printf("pid_init end \n");
- }
- //增量式算法
- float PID_calculate(float speed)
- {
- pid.SetSpeed = speed;
- pid.err = pid.SetSpeed - pid.ActualSpeed;
-
- float incrementSpeed = pid.Kp * (pid.err - pid.err_next) + pid.Ki * pid.err + pid.Kd * (pid.err - 2 * pid.err_next + pid.err_last);
- pid.ActualSpeed += incrementSpeed;
- pid.err_last = pid.err_next; //定義上一個偏差值
- pid.err_next = pid.err;
- return pid.ActualSpeed;
- }
- int main(void)
- {
- int setcount = 0;
- printf ("Please begin \n");
- PID_init();
- while (setcount < 100)
- {
- float speed = PID_calculate(250.0);
- printf ("value is %f\n",speed);
- setcount++;
- Sleep(300);
- }
- system("pause");
- return 0;
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|