日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32两轮平衡小车项目详解

發布時間:2024/1/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 數據的實時性。

/************************************************************************** 函數功能:外部中斷初始化 入口參數:無 返回 值:無 作 用:是用來配置MPU6050引腳INT的,每當MPU6050有數據輸出時,引腳INT有相應的電平輸出。依次來觸發外部中斷作為控制周期。保持MPU6050數據的實時性。 **************************************************************************/ void MPU6050_EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中斷,需要使能AFIO時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);EXTI_InitStructure.EXTI_Line=EXTI_Line5;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿觸發EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器 }

編碼器通過定時器輸入捕獲脈沖數,來測速的。定時器中斷和外部中斷一直不是很理解,今天經過別人指導,豁然開朗。定時器中斷是通過定時器的重轉載值,分頻系數以及計數模式等設置,然后定義它的中斷觸發方式而產生的中斷,一般溢出中斷比較多。編碼器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.005

PD控制

/************************************************************************** 函數功能:直立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两轮平衡小车项目详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。