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