17届智能车-电磁组比赛心得一
目錄
前言
一、電磁車的電感排布方案
二、如何調(diào)整電感的ADC數(shù)值+濾波方法
三、電磁四輪車的一些基礎(chǔ)控制算法
1.差比和算法+方向環(huán)
2.電機(jī)的速度環(huán)控制算法
小結(jié)
前言
????????2022年由于疫情的緣故,導(dǎo)致制作智能車的周期變得很短,線下賽也變成了線上賽,期間遇到了許多的困難,所幸的是得到了實(shí)驗(yàn)室小伙伴的幫助,在兩個(gè)月內(nèi)完成了比賽,取得了省級(jí)二等獎(jiǎng)。比賽的那短短十幾分鐘涵蓋了不知多少個(gè)日日夜夜,做智能車的這段時(shí)間收獲頗豐,這也將是我大學(xué)生涯最難忘的一段日子。本文在此對(duì)我這次比賽做一個(gè)總結(jié),本文內(nèi)容僅自己看法,如有錯(cuò)誤還請(qǐng)多多包涵。
一、電磁車的電感排布方案
?受限于stc16f的ADC管腳的數(shù)目,當(dāng)時(shí)采取的是兩橫,兩豎,兩內(nèi)八的方案,這里詳細(xì)說明一下各種電感的作用。
橫電感:這種電感利于在直道上面循跡,但是對(duì)彎道的變化感知低于斜電感和豎直電感
豎電感:在直道上面的數(shù)值理論上來說幾乎為0,但對(duì)于不同的車來說情況可能不太一樣,有點(diǎn)可能為0,有的不為0,甚至偏差很大。這種電感同樣對(duì)彎道有較強(qiáng)的感知,但比斜電感弱一點(diǎn)。
斜電感:這種電感對(duì)于彎道感知非常強(qiáng)烈,利于判斷環(huán)島,彎道等元素,還可以用來補(bǔ)線,但不利于單獨(dú)用它來循跡。
? ? ? ?根據(jù)我的比賽經(jīng)驗(yàn),電感的排布方案以及電感的位置需要根據(jù)賽道情況,電感類型,控制算法等因素不斷調(diào)整,如果照搬照抄,后期提速環(huán)節(jié)可能會(huì)非常受限制。
二、如何調(diào)整電感的ADC數(shù)值+濾波方法
? ? ? ? 在小車硬件搭好以后,可以把電感垂直放在電磁線上,通過對(duì)運(yùn)放的調(diào)節(jié)改變數(shù)值,注意,該數(shù)值得到的是電感的最大值。
?一般來說,最佳的調(diào)節(jié)狀態(tài)就是把小車來回?cái)[動(dòng),這時(shí)通過上位機(jī)觀察一對(duì)電感的變化波形,如果一對(duì)電感的上下浮動(dòng)相對(duì)稱,則說明調(diào)節(jié)的很好。
要想得到上面的那種波形,給電感采集到的值進(jìn)行濾波必不可少,常見的方法有:滑動(dòng)均值濾波,中位均值濾波,一階互補(bǔ)濾波等,下面給出中位均值濾波的方法以供讀者參考:
//冒泡排列for(j = 0; j < 10 - 1; j++){for(i = 0; i < 10 - 1 - j; i++){if(Left[i] > Left[i + 1]){filter_temp = Left[i];Left[i] = Left[i + 1];Left[i + 1] = filter_temp;}}} //去掉最大以及最小值for(i = 1; i < 10 - 1; i++){adc[0] += Left[i];} //取平均值adc[0]=adc[0]/8;三、電磁四輪車的一些基礎(chǔ)控制算法
1.差比和算法+方向環(huán)
void Direction_out(void) //方向環(huán)控制器 {direct.now_err=(20*(0.8*(adc[3]-adc[1])+0.2*(adc[5]-adc[2])))/(0.8* (adc[3]+adc[1])+0.2*myabs(adc[5]-adc[2]));//限幅if(direct.now_err>40) direct.now_err=40;else if(direct.now_err<-40) direct.now_err=-40;direct.sum_err=direct.kp*direct.now_err+direct.kd*(direct.now_err-direct.last_err);price_pwm=direct.sum_err/2; if(price_pwm>180) price_pwm=180;if(price_pwm<-180) price_pwm=-180;}direct.now_err為差比和算法得出的特征值,該值為距離中線的偏差,下面簡單講述一下該差比和算法:
其中A,B,C,P,均為可調(diào)系數(shù),可根據(jù)自己小車的實(shí)際情況來一個(gè)一個(gè)調(diào)節(jié)。以此來獲得小車對(duì)賽道情況的良好感知。
price_pwm為方向環(huán)PD控制得出的參量,通過放縮來傳給舵機(jī)驅(qū)動(dòng)函數(shù),其中P為比例系數(shù),D為微分系數(shù),由于是提供給舵機(jī)控制的參量,所以不太需要積分系數(shù)。
/*舵機(jī)參數(shù)*/ int steer_mid_value=490; //舵機(jī)中值void duoji_run(int angl) //驅(qū)動(dòng)舵機(jī)函數(shù) {uint16 PWM1_duty;PWM1_duty = steer_mid_value + angl; //duty占空比為490時(shí),舵機(jī)居中if(PWM1_duty > 595)PWM1_duty = 595; //限幅if(PWM1_duty < 380)PWM1_duty = 380;pwm_duty(PWMB_CH1_P74,PWM1_duty); //PWMB設(shè)置占空比}至于PID如何調(diào)節(jié),可以參考一下方法:
第一步是先把微分的參數(shù)設(shè)置成 0,把比例項(xiàng)按照最大的占空比除以最大的
誤差系數(shù)在乘上 0.1 作為調(diào)試的起點(diǎn);第二步根據(jù)系統(tǒng)的狀態(tài)增大比例項(xiàng),直到
系統(tǒng)能轉(zhuǎn)過急彎;第三步增加微分項(xiàng),系統(tǒng)出現(xiàn)比較穩(wěn)定時(shí)候開始下一步;第四
步是同時(shí)增減比例項(xiàng)和微分項(xiàng),直到智能車能平穩(wěn)地在直道上運(yùn)行且順滑地轉(zhuǎn)過
彎道;第五步把參數(shù)稍微調(diào)小到剛好振蕩,并將車速緩慢提升,完成控制參數(shù)調(diào)
試。
2.電機(jī)的速度環(huán)控制算法
由于是雙電機(jī),后續(xù)會(huì)采用差速控制,所以必須用兩個(gè)速度環(huán)控制兩個(gè)電機(jī),注意,這里的兩個(gè)速度環(huán)指的是變量分離,所使用的PID控制參數(shù)是一致的,如果不一樣,那參數(shù)整定起來會(huì)非常麻煩。下面以左電機(jī)為例:
int16 PID_IncreaseL(PID *SPID,int16 NextPoint,int16 NowData) {static int iErrorL,iIncpidL,iIncpidL_last; SPID->PrevErrorL = SPID->LastErrorL; //存儲(chǔ)誤差,用于下次計(jì)算SPID->LastErrorL = iErrorL; //當(dāng)前誤差iErrorL = NextPoint - NowData; //增量計(jì)算iIncpidL = (int16)((SPID->Integral) * iErrorL //E[k]項(xiàng)+(SPID->Proportion ) * (SPID->LastErrorL-SPID->PrevErrorL) //E[k-1]項(xiàng)+(SPID->Derivative) * (iErrorL-2*(SPID->PrevErrorL+SPID->LastErrorL))); //E[k-2]項(xiàng)return(iIncpidL); //返回增量值 } ------------------------------------------------------------------------------ void PID_InitL(PID *SPID,float Ep,float Ei,float Ed) {SPID->SumErrorL = 0;SPID->LastErrorL = 0; //Error[-1]SPID->PrevErrorL = 0; //Error[-2]SPID->Proportion = Ep; //比例常數(shù) Proportional ConstSPID->Integral = Ei; //積分常數(shù) Integral ConstSPID->Derivative = Ed; //微分常數(shù) Derivative Const }int Speed_outL(int EncoderL,int TargetL) //左輪速度環(huán)控制器 {PID_InitL(&QPID,speed.kp,speed.ki,speed.kd);speed_pwmL+=PID_IncreaseL(&QPID,TargetL,EncoderL);if( speed_pwmL > 8000 ) //增量限幅{speed_pwmL = 8000;}if( speed_pwmL < -8000 ){speed_pwmL = -8000;}speed_pwmL_last = speed_pwmL;return speed_pwmL; //增量輸出 }這里的速度環(huán)采用的是增量式PID控制,增量式PID的好處是它所得到的反饋僅和過去那一時(shí)刻有關(guān),得到的是累加量,非常適合電機(jī)這種被控制器,值得注意的是增量式中的P等同于位置式中的I,這一點(diǎn)可以對(duì)比兩者的公式發(fā)現(xiàn).下面給出位置式PID和增量式PID的公式,讀者可以自行對(duì)比.
?位置式PID
增量式PID?
以下是一些電機(jī)驅(qū)動(dòng)函數(shù)的代碼,控制邏輯基于8701的電機(jī)驅(qū)動(dòng).
void dianji_run(int example1,int example2) //驅(qū)動(dòng)電機(jī)函數(shù) {if(super.start==1) {dutyL=Speed_outL(num_left,example1);//num_left為編碼器采集的讀數(shù),example1為期望速度dutyR=Speed_outR(num_right,example2);if(dutyL >= 0) //正轉(zhuǎn){DIR_1 = 0;pwm_duty(PWMA_CH2P_P62,dutyL); }else //反轉(zhuǎn){DIR_1 = 1;pwm_duty(PWMA_CH2P_P62,-dutyL);}if(dutyR >= 0) //正轉(zhuǎn){DIR_2 = 0;pwm_duty(PWMA_CH4P_P66,dutyR);}else //反轉(zhuǎn){DIR_2 = 1;pwm_duty(PWMA_CH4P_P66,-dutyR);}}else{dutyL=Speed_outL(num_left,0);dutyR=Speed_outR(num_right,0);if(dutyL >= 0) //正轉(zhuǎn){DIR_1 = 0;pwm_duty(PWMA_CH2P_P62,dutyL); }else //反轉(zhuǎn){DIR_1 = 1;pwm_duty(PWMA_CH2P_P62,-dutyL);}if(dutyR >= 0) //正轉(zhuǎn){DIR_2 = 0;pwm_duty(PWMA_CH4P_P66,dutyR);}else //反轉(zhuǎn){DIR_2 = 1;pwm_duty(PWMA_CH4P_P66,-dutyR);}}}小結(jié)
本文對(duì)電磁四輪車的一些基礎(chǔ)控制算法以及制作思路作出了說明以供讀者參考,其中許多算法的細(xì)節(jié)還可以再優(yōu)化,考慮到簡潔性就不再過多闡述.后續(xù)會(huì)更新到閉環(huán)控制的原理以及電磁的識(shí)別算法等等.
總結(jié)
以上是生活随笔為你收集整理的17届智能车-电磁组比赛心得一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们终将泄露的人脸数据,后果到底有多可怕
- 下一篇: 珍大户 认知世界的经济学课程推荐电影《大