立即注冊 登錄
返回首頁

uid:133894的個(gè)人空間

日志

直流電機(jī)PID控制例程程序注釋

已有 737 次閱讀2017-6-26 13:21 |個(gè)人分類:STM32| 程序

基本算法

本例采用了增量式PID算法,算式如下: 
PIDOUT = basicValue + Kp*d_error + Ki*error + Kd*dd_error

其中: 
PIDOUT:PID輸出控制參數(shù),為PWM寬度的調(diào)整量 
Kp:比例調(diào)節(jié)參數(shù) 
Ki:積分調(diào)節(jié)參數(shù) 
Kd:微分調(diào)節(jié)參數(shù) 
error:誤差量(為期望速度-實(shí)際速度,可以為正數(shù)或負(fù)數(shù)) 
d_error:本次誤差量與上次誤差量之差(error-pre_error) 
dd_error:上次誤差量與上上次誤差量之差(pre_error-pre_pre_error

控制程序void SpeedAdjust() { long d_error,dd_error,error; //聲明變量 error = (int)(speed_ept - now_speed); //計(jì)算本次誤差(期待速度-當(dāng)前速度) d_error = error - pre_error; //本次誤差與上次誤差之差 dd_error = pre_error - pre_pre_error; //上次誤差與上上次誤差之差 pre_error = error; //將本次誤差賦值給上次誤差(下次計(jì)算用) pre_pre_error = pre_error; //將上次誤差賦值給上上次誤差(下次計(jì)算用) pwm_tmp = pwm_tmp + PID_P*d_error + PID_I*error + PID_D*dd_error; //計(jì)算pwm寬度調(diào)整量 if(now_speed>22) //如果當(dāng)前速度大于22 { Set_DCMotor(0,0); //不調(diào)整電機(jī) } else //否則 { if(pwm_tmp>=0) //如果pwm寬度調(diào)整為正(增加寬度) { Set_DCMotor(pwm_tmp,0); //增加直流電機(jī)轉(zhuǎn)速 } else //否則 { Set_DCMotor(pwm_tmp,1); //降低直流電機(jī)轉(zhuǎn)速 } } before_speed = now_speed; //講本次速度賦值給上次速度(下次使用) }

路過

雞蛋

鮮花

握手

雷人

評論 (0 個(gè)評論)

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部