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