當前位置:首頁 » 操作系統 » stm32pid演算法

stm32pid演算法

發布時間: 2022-11-25 20:13:28

A. 位置式pid控制演算法

增量式PID演算法的輸出量為
ΔUn
=
Kp[(en-en-1)+(T/Ti)en+(Td/T)(en-2*en-1+en-2)]
式中,en、en-1、en-2分別為第n次、n-1次和n-2次的偏差值,Kp、Ti、Td分別為比例系數、積分系數和微分系數,T為采樣周期。
計算機每隔固定時間
T將現場溫度與用戶設定目標溫度的差值帶入增量式PID演算法公式,由公式輸出量決定PWM方波的占空比,後續加熱電路根據此PWM方波的占空比決定加熱功率。現場溫度與目標溫度的偏差大則占空比大,加熱電路的加熱功率大,使溫度的實測值與設定值的偏差迅速減少;反之,二者的偏差小則占空比減小,加熱電路加熱功率減少,直至目標值與實測值相等,達到自動控制的目的。

B. 想利用單片機 如stm32這類晶元來進行控制,如溫度。

STM32(或其它) + 溫度感測器 + 加熱裝置 做個恆溫箱。 可以用上PID演算法
STM32 + 傾角感測器 + 電機 做個兩輪平衡小車
STM32 用內部或外部AD做頻譜分析,可以用上FFT演算法。 也可以做成示波器或者多通邏輯分析儀

C. 基於stm32的兩輪平衡車怎麼實現方向控制

stm32單片機的使用,電機PID演算法,陀螺儀的使用及濾波演算法,遙控模塊可以用藍牙或者2.4g無線模塊,2.4g更遠一點,價格也不貴。總的做起來了成本在200左右,我現在正在做。

D. stm32單片機溫度控制pid代碼

STM32的 PID和PWM墨水溫度控制系統 控制方案: K_SENSOR熱電偶作為溫度感測器,50w電烙鐵作為加溫設備作為控制對象,預先設定一個溫度值,微處理器為ARM公司... 查看全部>>

E. 如何在STM32中實現模糊自整定PID演算法

不管在什麼單片機或者ARM晶元中,你需要的是PID演算法,你需要將你的模糊整定PID演算法使用C語言編程實現你的PID整定功能。

F. 用單片機做PID演算法控制問題

1.可以直接套用PID公式,無論增量還是絕對的。PID演算法是根據誤差來控制的演算法,不依賴系統的模型,故不用算系統的傳遞函數。有的書提到傳遞函數,一般是用於理論建模模擬,從而直接用Matlab一類的模擬軟體進行PID參數調試。得到的參數可以為實際應用提供一定參考價值。

2.PID參數整定有一套原則。首先要了解各個參數的作用。具體的整定方法,隨便找本自控原理的書都會提到,我不太記得了,大致是有一個倍數關系。但實際操作,一般不會是用這個數,是需要根據系統的反應,改變各個參數來試的。盡信書不如無書啊~
另外,不同系統的參數肯定不一樣。就算同一個系統,稍微有一些改變,可能最好的那組參數就會變化。因此衍生了很多先進PID演算法,如神經PID、專家PID、模糊PID等等。

G. 基於stm32溫度控制系統pid演算法程序

看你會哪種單片機,不過PID通常用C來做,容量太小的單片機運行不了, 通常選高速單片機來做.我見過51的,也見過用STM32來做的

H. stm32單片機能寫復雜控制演算法么

1.PID原理
1.1 P I D三個參數簡單理解
1.2 P I D
1.3 PI PD PID適用系統
2.串級PID原理
3.PID代碼
3.1 單級PID
3.1.1 初始化PID結構體
3.1.2 單級PID計算
3.1.3PID初始化
3.1.4 清空PID
3.2 串級PID
3.2.1 初始化串級PID結構體
3.2.2 串級PID計算
4.PID的使用
4.1 定義PID結構體並初始化
4.2 定義電機速度函數
4.3 在檢測霍爾碼盤時發送速度給電機
4.4 實驗效果
1.PID原理
PID是什麼,P,I,D的分別功能

你和PID調參大神之間,就差這篇文章!

1.1 P I D三個參數簡單理解
P(比例): 簡單來說,P就是涼了加熱水,熱了加涼水。比目標值小,我就增加一點,比目標值大,我就減小一點。(現在)
P可能出現的問題: 1.P太小,達到目標值需要花費很長的時間,而且會有穩態誤差。2.P太大,達到目標值時可能會一直震盪。

I(積分): 將一段時間內的誤差累積起來加到輸出上,可以消除歷史誤差對當前實際曲線的影響,提高系統的穩定性。 (過去)
I可能出現的問題: 1.I太小,可以消除穩態誤差,但太慢了,對於某些需要很快響應的系統,顯然不能滿足要求。2.I太大,累計誤差佔比過大,就會出現抖動現象,難以收斂。

D(微分): 減小最大超調量。(下圖中③就是最大超調量。) 可以有效減小震動的幅度。讓曲線收斂更快 (未來)
D可能出現的問題: 1.D太小,作用小,時間長。2.D太大,為了減小超調量,補償的過多,導致震盪很久。
在這里插入圖片描述

1.2 P I D
先調P,逐漸增加P直到系統出現震盪,將當前值乘0.7就是較為合適的值。
再調I,將穩態誤差逐漸降低。
後調D,將最大超調量降到最低。

1.3 PI PD PID適用系統
PI:響應速度要求不那麼高的系統。
PD:大慣性系統。超調量太大。
PID:都可以。

網上將PID原理太多太多了,我的理解也都是參見上面的內容。認真看肯定有收獲。

2.串級PID原理
【串級PID】淺談串級PID作用及意義——快速理解串級PID結構優勢

這里個人理解就是,單機PID就是穩定速度。而需要帶位置和角度的就要用串級PID了。常用於平衡車,板球系統等。
而轉速閉環稱為串級PID的內環,位置 (角度) 閉環稱為串級PID的外環。其實也很好理解,位移是速度的積分,只有速度慢慢穩定,位置才能確定。

3.PID代碼
3.1 單級PID
3.1.1 初始化PID結構體
typedef struct _PID
{
float kp,ki,kd;
float error,lastError;//誤差、上次誤差
float integral,maxIntegral;//積分、積分限幅
float output,maxOutput;//輸出、輸出限幅
}PID;
1
2
3
4
5
6
7
1
2
3
4
5
6
7
3.1.2 單級PID計算
#define LIMIT(x,min,max) (x)=(((x)<=(min))?(min):(((x)>=(max))?(max):(x)))

//單級pid計算
void PID_SingleCalc(PID *pid,float reference,float feedback)
{
//更新數據
pid->lastError=pid->error;
pid->error=reference-feedback;
//計算微分
pid->output=(pid->error-pid->lastError)*pid->kd;
//計算比例
pid->output+=pid->error*pid->kp;
//計算積分
pid->integral+=pid->error*pid->ki;
LIMIT(pid->integral,-pid->maxIntegral,pid->maxIntegral);//積分限幅
pid->output+=pid->integral;
//輸出限幅
LIMIT(pid->output,-pid->maxOutput,pid->maxOutput);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
3.1.3PID初始化
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
{
pid->kp=p;
pid->ki=i;
pid->kd=d;
pid->maxIntegral=maxI;
pid->maxOutput=maxOut;
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
3.1.4 清空PID
//清空一個pid的歷史數據
void PID_Clear(PID *pid)
{
pid->error=0;
pid->lastError=0;
pid->integral=0;
pid->output=0;
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
3.2 串級PID
3.2.1 初始化串級PID結構體
typedef struct _CascadePID
{
PID inner;//內環
PID outer;//外環
float output;//串級輸出,等於inner.output
}CascadePID;
1
2
3
4
5
6
1
2
3
4
5
6
3.2.2 串級PID計算
//串級pid計算
void PID_CascadeCalc(CascadePID *pid,float angleRef,float angleFdb,float speedFdb)
{
PID_SingleCalc(&pid->outer,angleRef,angleFdb);//計算外環(角度環)
PID_SingleCalc(&pid->inner,pid->outer.output,speedFdb);//計算內環(速度環)
pid->output=pid->inner.output;
}
1
2
3
4
5
6
7
1
2
3
4
5
6
7
4.PID的使用
STM32應用(九)編碼器及其測速原理、L298N電機驅動控制編碼器電機

在這篇博客的配置下,只需要修改部分代碼。以單級PID為例子。

4.1 定義PID結構體並初始化
PID pid;

void Motor_Init(void)
{
PID_Init(&pid,10,0,0,1000,1000);
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); //開啟編碼器定時器
__HAL_TIM_ENABLE_IT(&htim1,TIM_IT_UPDATE); //開啟編碼器定時器更新中斷,防溢出處理
HAL_TIM_Base_Start_IT(&htim6); //開啟10ms定時器中斷
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //開啟PWM
__HAL_TIM_SET_COUNTER(&htim1, 10000); //編碼器定時器初始值設定為10000
motor.loopNum = 0; //防溢出
}
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
4.2 定義電機速度函數
void Motor_Send()
{
float output = 0;
PID_SingleCalc(&pid, motor.targetSpeed, motor.speed);
output = pid.output;
if(output > 0) //正轉
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, (uint32_t)output);
IN1(1);
IN2(0);
}
else //反轉
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, (uint32_t)(-output));
IN1(0);
IN2(1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4.3 在檢測霍爾碼盤時發送速度給電機
if(htim->Instance==htim6.Instance) //10ms中斷
{
int16_t pluse = COUNTERNUM - RELOADVALUE/2;
motor.totalAngle = pluse + motor.loopNum * RELOADVALUE/2;
motor.speed = (float)(motor.totalAngle - motor.lastAngle)/(4*13*RR)*6000; //進行速度計算,根據前文所說的,4倍頻,編碼器13位,減速比30,再乘以6000即為每分鍾輸出軸多少轉
motor.lastAngle = motor.totalAngle; //更新轉過的圈數
Motor_Send();//發送速度
}

I. stm32代碼Speed_P是什麼意思

  1. Speed_P不是C的保留字。為用戶編寫程序的自定義變數名。

  2. 大膽推測:Speed_P,speed應為英譯速度,p,因為STM32多用於直流電機控制,P可代表pid演算法中的P值,Speed_P推測為速度計算時pid演算法參數的p值。

  3. 以上推測僅供參考,單單一個變數名實際作用只能猜。

熱點內容
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:370
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:606
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:27
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:100
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:935
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:728
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:797
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:504
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:367
ef資料庫查詢數據 發布:2025-05-18 03:29:36 瀏覽:669