stm32两轮平衡小车项目详解
摘要
這個項目是在20年11月初開始的,當時的我很迷茫,本應該去實習的我在線上培訓,覺得無聊,便有了自己一人做項目的想法。也沒想到這個項目做了將近整整一個月,才差不多做了出來。也是準備做兩個項目的,這是第一個而已。
項目所需物料清單
主控板用到了c8t6、小車底盤(這個硬件是這項目于最貴的物料了),可以用大魚電子、或者平衡小車之家的。由于經(jīng)費的原因,我買了兩個帶電機的車輪、加上了亞克力板,勉強搭成了小車底盤。我的電機用的是JGA25-370電機。電機線正負是表示動力線1、2。電機線接反可以實現(xiàn)車輪反轉的效果。為了布線方便,我用到了面包板。由于對焊接并不是很熟練,沒用到洞洞板,這算是這個項目不大光彩的地方。用到的模塊有mpu6050、oled(四針)、穩(wěn)壓模塊(12V轉5V)、JGA25-370電機、電機驅動模塊(tb6612fng)、12v鋰電池,目前想到的就這些模塊。
項目過程中遇到的問題
這個項目歷時一個月,過程的艱辛可想而知,也是本人太菜的原因,基礎也很差。當時遇到的第一個問題就是穩(wěn)壓模塊不知道怎么用,由于沒有加上穩(wěn)壓模塊,導致電機不轉,這個問題困擾了很久,也問了很多人,最終知道了穩(wěn)壓模塊是來將12v的電壓降為5v的電壓來給單片機供電的,雖然沒用穩(wěn)壓模塊,電機驅動模塊并沒有燒壞。用了穩(wěn)壓模塊,由于不會焊接,就用了面包板代替了洞洞板。這讓我也了解了面板板的強大之處。對于我這個小白來說。焊接的技術太差了,會焊接的同學可以忽略,本人計算機專業(yè)的,對電烙鐵、焊錫并不是很了解。在校也沒進實驗室。電子、通信、自動化的同學應該帶焊接并不陌生的。第一個問題花了很長一段時間的。
由于用到了洞洞板,接線就方便了許多。接著遇到的問題就是PID調(diào)節(jié)了。這個PID是真的難調(diào)。我們知道,雖說平衡小車是三閉環(huán)控制系統(tǒng)。但是僅僅直立環(huán)也是可以平衡的,只是不夠精確罷了。直立環(huán)加速度環(huán)是完全可以平衡的,可以不用轉向環(huán)的。
機械中值的確定
每個物體都有屬于自己的機械中值,機械中值是調(diào)節(jié)PID的第一步,要想小車平衡性能非常好,首先必須得調(diào)節(jié)機械中值。之前也有人說過,要想小車能平衡,首先要讓小車有一個短暫的平衡,不能一落地小車就倒。接著我們來談談如何來確定小車的機械中值。將小車的mpu6050測試代碼燒錄到主控,將小車放置地上順時針轉動,直至倒下,記下小車的角度。接著將小車逆時針轉動,直至倒下,記下小車的角度。將兩次角度的值相加,除以2,此時這個值就是小車的機械中值。確定好機械中值,就可以來調(diào)節(jié)速度環(huán)、直立環(huán)了。
PD(直立環(huán))調(diào)節(jié)
我目前做的平衡小車v1.0版本,功能還有PID調(diào)節(jié)并不是很完善,目前小車只用到了直立環(huán),根據(jù)我的調(diào)節(jié),光直立環(huán)是可以平衡的。在調(diào)節(jié)直立環(huán)的時候,速度環(huán)PI中的kp、ki是必須置零的。首先判斷直立環(huán)kp的極性,令kp=+1,kd=0;燒錄程序,若小車向前傾,車輪向前加速,則說明極性正確,反之,則說明極性錯誤,令kp=-1。若小車兩輪轉動方向不一致,則說明硬件電機正負極接反了,需對調(diào)一下。kp極性判斷完畢,接下來調(diào)節(jié)Kp的大小,令kd=0,不斷增加kp,直至小車出現(xiàn)高頻幅度震蕩,調(diào)節(jié)kp不斷消除震蕩,持續(xù)增加,直至小車出現(xiàn)高頻震蕩,此時直立環(huán)調(diào)節(jié)完畢,由于kp、kd系數(shù)取的都是最大值,需要將系數(shù)乘以0.6,則是最平穩(wěn)的。這是PD(直立環(huán))調(diào)節(jié)。
PI(速度環(huán))調(diào)節(jié)
在調(diào)節(jié)速度環(huán)PI的過程中,直立環(huán)的kp、kd是不需要置零的,首先也是判斷極性,令kp=+1,燒錄代碼,用手向前轉動一側車輪,若兩側車輪同時向前加速,則kp極性正確,反之,則極性不正確,kp=-1。若kp極性判斷正確,則可以通過調(diào)節(jié)Kp、Ki來讓小車達到平衡。
程序講解
mpu6050模塊只用了五個引腳,分別是VCC、GND、SCL、SDA、INT,用到了IIC,引腳INT有相應的電平輸出,依次可以觸發(fā)外部中斷作為控制周期,周期性反饋數(shù)據(jù),保持mpu6050 數(shù)據(jù)的實時性。
編碼器通過定時器輸入捕獲脈沖數(shù),來測速的。定時器中斷和外部中斷一直不是很理解,今天經(jīng)過別人指導,豁然開朗。定時器中斷是通過定時器的重轉載值,分頻系數(shù)以及計數(shù)模式等設置,然后定義它的中斷觸發(fā)方式而產(chǎn)生的中斷,一般溢出中斷比較多。編碼器encode采用的就是定時器中斷。外部中斷則是通過定義管腳的電平狀態(tài),通過外部的電平來觸發(fā)它產(chǎn)生的中斷。mpu6050 INT引腳觸發(fā)就是外部中斷。
************************************************************************** 函數(shù)功能:單位時間讀取編碼器計數(shù) 入口參數(shù):定時器 返回 值:速度值 **************************************************************************/ int Read_Encoder(u8 TIMX) {int Encoder_TIM; switch(TIMX){case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0;break;case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;break; case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0;break; default: Encoder_TIM=0;}return Encoder_TIM; }控制代碼如下:直立環(huán)PD控制、速度環(huán)PI控制
KP、KD、KP、KI系數(shù)、機械中值
int Balance_Pwm,Velocity_Pwm,Turn_Pwm;float Mechanical_angle=0; // 無超聲波、電池平躺著的小車機械中值float balance_UP_KP=1000; // 小車直立環(huán)KP(第一次kp調(diào)1000 、參數(shù)乘以0.6 1000 //600 float balance_UP_KD=-1.2; //-1.2 -1.2 //-1.08 float velocity_KP=0; // 1.0 float velocity_KI=0; //0.005PD控制
/************************************************************************** 函數(shù)功能:直立PD控制 入口參數(shù):角度、機械平衡角度(機械中值)、角速度 返回 值:直立控制PWM **************************************************************************/ int balance_UP(float Angle,float Mechanical_balance,float Gyro) { float Bias;int balance;Bias=Angle-Mechanical_balance; //===求出平衡的角度中值和機械相關balance=balance_UP_KP*Bias+balance_UP_KD*Gyro; //===計算平衡控制的電機PWM PD控制 kp是P系數(shù) kd是D系數(shù) return balance; }附平衡小車圖、資料及代碼:
鏈接:https://pan.baidu.com/s/1VlaNkVwey1i6BrMO0dQ-tw
提取碼:s7k1
stm32平衡小車演示視頻
總結
以上是生活随笔為你收集整理的stm32两轮平衡小车项目详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。