直流電機PID調速

2021-10-01 07:39:07 字數 3411 閱讀 1312

文章寫的是基於數字pid控制器的閉環電機速度控制系統,系統以stc89c51微控制器為控制核心,通過電機驅動l298n(這裡因為所用電機是個小馬達,額定電流和堵轉電流不算大,所以用的是tc1508s做驅動)控制電機轉速,電機轉速控制採用pwm控制。在對電機轉速進行調速的過程同時,微控制器對電機的轉速進行實時採集,並在lcd1602顯示屏上實時顯示電機實際轉速。由於pid引數整定的需要,在設計中利用按鍵實現pid引數顯示和修改;同時使用按鍵控制電機的目標轉速。

以下是主要硬體部分:

霍爾感測器測速的使用非常簡單,在電機同軸上安裝幾個小磁鐵,當磁鐵靠近霍爾感測器的時候,輸出端輸出低電平。

下面部分**,後面會附上**zip,僅供參考。

主程式:

#include

"include.h"

void

main()

}

初始化程式:

#include

#include

"init.h"

#include

"lcd_drive.h"

#include

"key.h"

#include

"tim.h"

#include

"int0.h"

#include

"pid.h"

#include

#define kp 7.03

#define ki 2.39

#define kd 0

void

motor_init

(void);

void

system_init

(void

)void

motor_init

(void

)

pid的c檔案:

#include

"pid.h"

#include

"int0.h"

#include

"string.h"

pid velocity_pid;

int out=0;

//------------------------------------------

// 設定pid引數

//------------------------------------------

void

set_pid_parameter

(float kp,

float ki,

float kd)

//增量式pid

float

incpidcalc

(pid *pidx,

int nextpoint)

定時器c檔案:

#include

"tim.h"

#include

"delay.h"

#include

"int0.h"

#include

"key.h"

#include

"pid.h"

bit bling_bling=0;

//閃爍標誌位,選中的引數會閃爍,用於螢幕

void

timer0init

(void

)//50毫秒@12.000mhz

void

timer1init

(void

)//100uãë@12.000mhz

void

tim0_isr

() interrupt 1}if

(_50ms_dida==2)

//100msµãµ½âö³å¸öêý

for(i=

0;i<

9;i++

) out=

(int

)incpidcalc

(&velocity_pid,pulse_sum[9]

);if(velocity_pid.setpoint==

0)out =0;

pulse =0;

/******************************/

_50ms_dida=0;

}}void

tim1_isr

() interrupt 3

else

if(dirct_flag==0)

//motor_in0 = 0;motor_in1 = 1;//·´×ª

}}

按鍵c檔案:

#include

"key.h"

#include

"lcd_drive.h"

#include

"pid.h"

int aim_velocity=0;

uint8 parameter=0;

bit key_aux=

0,inte***ce_flag=0;

bit dirct_flag=

0,off_and_on=0;

void

_5_key_scan

(void

)else

if(dirct_flag==0)

}}else

if(switch==

0&& key_aux==1)

//¿ª¹ø¼üºíñ¡ôñpid²îêý¼ü

if(off_and_on ==1)

else

if(dirct_flag ==0)

}}else}if

(up_speed==

0&& key_aux==1)

}}if(down_speed==

0&& key_aux==1)

else

if(inte***ce_flag)}}

if(inte***ce_f ==

0&& key_aux==1)

//½çãæçð»»°´¼ü

else}if

(clockwise_key && switch && up_speed && down_speed && inte***ce_f)

//鬆開

key_aux =1;

}

顯示屏的程式就不貼了,每個人使用的顯示屏都可以不一樣。只要資訊能顯示出來都可以了。

下面附上程式壓縮包。motor_incpid.zip

直流電機pwm 直流電機的調速方法

直流電機的調速方法 一 概述 一是調節電樞電壓,二是調節勵磁電流,1 常見的微型直流電機,其磁場都是固定的,不可調的永磁體,所以只好調節電樞電壓。調節電樞電壓方法 常用的一是可控矽調壓法,再就是脈寬調變法 pwm pwm的h型屬於調壓調速。pwm的h橋只能實現大功率調速。國內的超大功率調速還要依靠可...

直流電機PID調節 P

其實要用pid調節的話,最好是使用帶有編碼器的比較高階一點的直流減速電機,但是因為它 有點貴,所以我們一般做智慧型小車就會選用普通的直流電機,但是普通的直流電機也是可以使用pid調節的,雖然它的效果沒有帶編碼器得到直流減速電機的好,但是我們也可以在調節的過程中慢慢地深刻的理解pid調節的含義。今天先...

PID演算法控制直流電機筆記

1.將偏差的比例 積分和微分通過線性組合構成控制量,用這一控制量對被控物件進行控制,這樣的控制器稱為pid控制器。簡單說就是根據系統的誤差,利用比例 積分 微分計算出控制量進行控制。2.為什麼需要pid演算法?電機在不同負載情況下,為了保持速度不變,需要不斷調整pwm占空比,pid演算法可以動態調整...