毕业设计 基于STM32单片机的二轮平衡小车
文章目錄
- 0 前言
- 1 簡介
- 2 主要器件
- 3 實現(xiàn)效果
- 4 設(shè)計原理
- 4.1 PID算法
- 4.2 HC-SR04超聲波模塊
- 4.3 TB6612FNG電機驅(qū)動模塊
- 4.4 MPU6050芯片姿態(tài)監(jiān)測傳感器
- 5 部分核心代碼
- 5 最后
0 前言
🔥 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天要分享的是
🚩 于STM32單片機的二輪平衡小車
🥇學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數(shù):4分
- 工作量:4分
- 創(chuàng)新點:3分
🧿 選題指導, 項目分享:
https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md
1 簡介
今天我們來介紹一下基于STM32單片機的二輪平衡小車模塊及算法原理。
小車可以實現(xiàn)手機APP控制前進、后退、左轉(zhuǎn)和右轉(zhuǎn)。
利用HC-SR04超聲波模塊可以實現(xiàn)跟隨、避障模式。
利用智能手機可以實現(xiàn)重力感應(yīng)控制。
2 主要器件
- STM32F103C8T6主控芯片
- TB6612FNG電機驅(qū)動模塊
- MPU6050芯片姿態(tài)監(jiān)測傳感器
- HC-05藍牙模塊
- HC-SR04超聲波模塊
3 實現(xiàn)效果
控制板引腳圖
4 設(shè)計原理
4.1 PID算法
PID算法已經(jīng)有105年的歷史了, 它在很多地方都有它的應(yīng)用,如汽車的定速巡航、3D打印機的溫度控制器,自平衡小車,飛行器等。在介紹pid算法之前要先介紹階響應(yīng),階響應(yīng)是當輸入信號,從零跳變?yōu)橐恢?#xff0c;系統(tǒng)的輸出曲線響應(yīng),如下圖所示:
圖中黑線是輸入信號,輸入信號從0直接跳變成1之后,紅線就是系統(tǒng)的輸出響應(yīng),可以看到它經(jīng)過一段時間的上升之后。逐漸穩(wěn)定到1附近。
可以通過一些系統(tǒng)性能指標來評價系統(tǒng)階響應(yīng)的好壞:
一. 超調(diào):overshoot
它是指響應(yīng)超出穩(wěn)態(tài)值的最大偏移量與穩(wěn)態(tài)值之比
二. 上升時間:rise time
是指的響應(yīng)曲線從10%上升到穩(wěn)態(tài)值90%所需的時間,在上圖中就是指rise time。
三. 穩(wěn)定時間:seeting time
就是指響應(yīng)曲線到達穩(wěn)定值附近,比如正負-5%左右,并不在超過這一段誤差范圍之外的最小時間,也就是圖中的setting time,到達setting time之后,就可以認為系統(tǒng)基本達到穩(wěn)定狀態(tài)了。
四. 穩(wěn)態(tài)誤差:steady-state error
它也叫靜態(tài)誤差或者靜差,它是指的穩(wěn)態(tài)值與設(shè)定值之間的誤差
如果我們要控制(如上圖)無人小車,要讓它比小車準確的前進三米,那么它的穩(wěn)態(tài)誤差就是它實際行駛的距離與設(shè)定值三米之間的差距,上升時間就是指距離值的10%,也就是0.3米上升到2.7米的行駛時間,穩(wěn)定時間就是指它穩(wěn)定在三米附近的時間。 我們需要設(shè)計一個反饋控制器,目的是使原本性能參數(shù)不太好的性能曲線變成理想狀態(tài)的性能曲線,也就是說它的上升時間和穩(wěn)定時間都要盡可能小,并且要消除他的穩(wěn)態(tài)值與它的設(shè)定值之間的誤差。
如上圖中系統(tǒng)響應(yīng)曲線,可以看到它的系統(tǒng)響應(yīng)時間很長,而且最后的穩(wěn)態(tài)值與它的設(shè)定值三米之間還存在很大的誤差。
所以要引入pid控制算法,pid它之所以叫這個名字,是因為它是由p,i,d三種控制器組合而成,p控制器是最基礎(chǔ),在其基礎(chǔ)上可以加上i控制器或者d控制器來形成pi或者pd控制器,也可以三種控制器同時使用,也就是最后的pid控制器,下面分別對這三種控制器進行詳細介紹。
P(比例)控制器是最簡單的控制器,P英文全稱Proportion(比例),也就是比例的意思,比例控制器的基本思想就是對系統(tǒng)的誤差呈上一個比例因子kp,從而得到它的控制量輸出o,也就是利用誤差的正負和大小作出成比例的反應(yīng), 比例因子kp,可以得到相應(yīng)o值的正負和大小,輸出量的大小與輸入誤差信號的大小成比例關(guān)系的一種控制。 公式是:O=Kp*e 。
假設(shè)讓無人小車前進3m,p控制器輸出pwm波的占空比Duty_p,Duty_p =Kp*error,就是Duty_p等于誤差乘以kp(比例因子)。加上p控制器之后,系統(tǒng)響應(yīng)曲線就可以變成下圖所示的藍色曲線。
可以看到p控制器減少了上升時間和穩(wěn)態(tài)誤差,但是系統(tǒng)也有本身沒有任何超調(diào)變成了有一定的超調(diào)量,也就是說p控制器增加了系統(tǒng)的超調(diào)量。
上圖顯示的是p控制器中不同的比例因子Kp,kp所對應(yīng)的三條響應(yīng)曲線,其中藍色是p=5的情況,紅色是p=10的情況,橙色是p=20的情況,可以看出kp值越大上升時間也就越快,穩(wěn)態(tài)誤差越小,但是它的超調(diào)量也會隨之增大。 通過簡單的改變比例系數(shù)kp是不能消除系統(tǒng)震蕩效果,并且kp值越大,系統(tǒng)震蕩的幅度也在增大。也就是通過p控制器對誤差所產(chǎn)生的修正會使系統(tǒng)在接近理想狀態(tài)時產(chǎn)生一個超越穩(wěn)態(tài)值的沖量并產(chǎn)生震蕩。要解決震蕩,就需要對系統(tǒng)接近理想狀態(tài)時的動量進行修正。(動量=質(zhì)量速度) ,也就需要對速度進行修正,使系統(tǒng)在接近理想狀態(tài)時,為了讓他更容易穩(wěn)定下來,我們要將速度值盡量減小,這就需要用到誤差的導數(shù),因為速度的本質(zhì)就是位移的導數(shù),而這里的誤差就是位移值之差,所以速度也可以認為是誤差的導數(shù)(O=Kd* de/dt),我們需要用它來對輸出控制量進行進一步的修正,也就是引入了微分控制。 它可以利用誤差的導數(shù),也就是誤差的變化率來修正pwm波的占空比,所以現(xiàn)在duty_pd等于誤差乘以比例因子kp再加上誤差減去上一次誤差的變化量乘以一個微分系數(shù)kd(Dudy_pd=Kperror+Kd(error-last_error))。它們的響應(yīng)曲線如下圖所示:
藍線是之前加入p控制器的響應(yīng)曲線,紅線是在pd控制下的響應(yīng)曲線,可以看出Pd控制器的使用使得超調(diào)量相對之前減少了很多,而且穩(wěn)定時間也有所減少。 其實比例控制器是一種事后調(diào)節(jié),它是在發(fā)生了誤差之后再進行調(diào)節(jié),微分控制器是事前進行調(diào)節(jié),就是超前預(yù)測控制,它在誤差有減小趨勢的時候,就是這次誤差小于上一次誤差時,加入d控制器會使得它的輸出變小,從而避免過度控制所產(chǎn)生的超調(diào),當誤差有增大的趨勢時,也就是說這一次的誤差大于上次的誤差,d控制器會使得輸出更大一些,從而抑制誤差的增長趨勢,加快系統(tǒng)的運動速度使得調(diào)節(jié)時間減小。 同時也可以發(fā)現(xiàn),此時其實系統(tǒng)還存在穩(wěn)態(tài)誤差,為了消除這一點我們需要引入另外一種控制器,也就是積分控制器來改善控制系統(tǒng),它可以記錄自己前面一些時刻的誤差,尤其有重復性的,并且值比較固定的誤差,特別是穩(wěn)態(tài)誤差,它可以將這些誤差累加起來,當達到一定閾值,也就是說足夠大的時候,系統(tǒng)就會做出一些補償或者修正。 所以此時Pi控制器的輸出也就是pwm波的占空比,(Dudy_pi=Kperror+Ki∑error)Dudy_pi等于誤差乘以比例因子kp再加上前一段時間的誤差之和乘以積分因子Ki,下圖曲線是三種不同控制器下的響應(yīng)曲線:
綠線和藍線分別是之前的pd和p控制器所對應(yīng)的響應(yīng)曲線,紅線是pid控制器所對應(yīng)的響應(yīng)曲線,加入了積分控制器之后,系統(tǒng)沒有了穩(wěn)態(tài)誤差,但是也增加了一定超調(diào)量。 所以i積分控制器的主要作用是消除靜態(tài)誤差,使系統(tǒng)最后的穩(wěn)態(tài)值和設(shè)定的值之間沒有任何誤差,同時積分作用的強弱也取決于積分時間常數(shù),如果積分時間常數(shù)越大,積分項也會越慢,控制調(diào)節(jié)效率也就越弱。 綜合考慮的所有因素,考慮到誤差的變化率以及消除誤差的因素,我們可以將這三種控制器全部都用上,也就是同時對誤差進行比例積分和微分運算,它的系統(tǒng)響應(yīng)如下圖所示:
此時加入pid閉環(huán)控制系統(tǒng)不僅上學時間很快,而且沒有任何超調(diào),也沒有穩(wěn)態(tài)誤差。
簡單的做一個總結(jié),pid的主要作用就是設(shè)置值和實際值做差,他們的誤差,分別輸入給比例,積分和微分控制器。比例控制器就是將誤差乘以一個常數(shù),積分控制器就是對誤差進行一段時間的累積運算,微分就是計算誤差的變化率,將這三者的輸出之和進行累加,得到最后的pid的輸出結(jié)果并輸出給控制對象,也就是要改進的控制系統(tǒng),從而形成一個閉環(huán)電路。
4.2 HC-SR04超聲波模塊
簡介
HC-SR04超聲波模塊常用于機器人避障、物體測距、液位檢測、公共安防、停車場檢測等場所。HC-SR04超聲波模塊主要是由兩個通用的壓電陶瓷超聲傳感器,并加外圍信號處理電路構(gòu)成的。如圖:
兩個壓電陶瓷超聲傳感器,一個用于發(fā)出超聲波信號,一個用于接收反射回來的超聲波信號。由于發(fā)出信號和接收信號都比較微弱,所以需要通過外圍信號放大器提高發(fā)出信號的功率,和將反射回來信號進行放大,以能更穩(wěn)定地將信號傳輸給單片機。模塊整體電路如圖:
模塊參數(shù)
(1)模塊主要電氣參數(shù)
- 使用電壓:DC—5V
- 靜態(tài)電流:小于2mA
- 電平輸出:高5V
- 電平輸出:底0V
- 感應(yīng)角度:不大于15度
- 探測距離:2cm-450cm
- 高精度 可達0.2cm
(2)模塊引腳
超聲波模塊有4個引腳,分別為Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V電源, Trig(控制端)控制發(fā)出的超聲波信號,Echo(接收端)接收反射回來的超聲波信號。模塊如圖
4.3 TB6612FNG電機驅(qū)動模塊
簡介
TB6612FNG是一款新型驅(qū)動器件,能獨立雙向控制2個直流電機,它具有很高的集成度,同時能提供足夠的輸出能力,運行性能和能耗方面也具有優(yōu)勢,因此在集成化、小型化的電機控制系統(tǒng)中,它可以作為理想的電機驅(qū)動器件。
原理圖如下:
TB6612FNG驅(qū)動接口詳解
TB6612FNG驅(qū)動如下圖所示
接口說明:
- VM:電機驅(qū)動電源輸入(2.74-10.8V)
- VCC:邏輯電平輸入(5.0V)
- AO1和AO2:接直流電機A
- BO2和BO1:接直流電機B
- PWMA:控制電機A的轉(zhuǎn)速
- AIN1和AIN2:控制電機A(停止、正轉(zhuǎn)、反轉(zhuǎn))
- STBY:正常工作/待機狀態(tài)控制端PWMB:控制電機B的轉(zhuǎn)速
- BIN1和BIN2:控制電機B(停止、正轉(zhuǎn)、反轉(zhuǎn))
- GND:接地
AIN1和AIN2用于控制電機A停止、正轉(zhuǎn)、反轉(zhuǎn),真值表如下
AIN1001AIN2010狀態(tài)停止正轉(zhuǎn)反轉(zhuǎn)BIN1和BIN2的真值表同上
4.4 MPU6050芯片姿態(tài)監(jiān)測傳感器
MPU6050
MPU-60x0是全球首例9軸運動處理傳感器。它集成了3軸MEMS陀螺儀,3軸MEMS加速度計,以及一個可擴展的數(shù)字運動處理器DMP(Digital Motion Processor),可用I2C接口連接一個第三方的數(shù)字傳感器,比如磁力計。擴展之后就可以通過其I2C或SPI接口輸出一個9軸的信號(SPI接口僅在MPU-6000可用)。MPU-60x0也可以通過其I2C接口連接非慣性的數(shù)字傳感器,比如壓力傳感器。
MPU-60x0對陀螺儀和加速度計分別用了三個16位的ADC,將其測量的模擬量轉(zhuǎn)化為可輸出的數(shù)字量。為了精確跟蹤快速和慢速的運動,傳感器的測量范圍都是用戶可控的,陀螺儀可測范圍為±250,±500,±1000,±2000°/秒(dps),加速度計可測范圍為±2,±4,±8,±16g。一個片上1024字節(jié)的FIFO,有助于降低系統(tǒng)功耗。和所有設(shè)備寄存器之間的通信采用400kHz的I2C接口或1MHz 的SPI接口(SPI僅MPU-6000可用)。對于需要高速傳輸?shù)膽?yīng)用,對寄存器的讀取和中斷可用20MHz的SPI。另外,片上還內(nèi)嵌了一個溫度傳感器和在工作環(huán)境下僅有±1%變動的振蕩器。
5 部分核心代碼
/************************** .h文件******************************/#ifndef _pid_H #define _pid_H#define MODEL_P 1 #define MODEL_PI 2 #define MODEL_PID 3typedef struct {u8 choose_model; //使用哪個模式調(diào)節(jié),以方便分布調(diào)試float curr; //當前值float set; //設(shè)定值float En; //當前時刻誤差值float En_1; //前一時刻誤差值float En_2; //前二時刻誤差值float Kp; //比例系數(shù)float T; //每隔T控制器輸出一次PID運算結(jié)果u16 Tdata; //判斷PID周期到?jīng)]到float Ti; //積分時間常數(shù)float Td; //微分時間常數(shù)float Dout; //增量PID計算本次應(yīng)該輸出的增量值-本次計算的結(jié)果float OUT0; //一個維持的輸出,防止失控short currpwm; //當前的pwm寬度u16 pwmcycle; //pwm周期}PID;extern u8 STATUS; extern PID pid; void PID_Init(void); //增量式PID初始化 void pid_calc(void); //pid計算 并輸出/************************** .c文件******************************/#endif #include "pid.h" #include "PWM_Config.h" #include "USART_Config.h" //USART設(shè)置PID pid;void PID_Init() // {pid.choose_model = MODEL_PID;pid.T=330; //采樣周期,定時器使用1ms,則最小執(zhí)行PID的周期為330mspid.set =280; //用戶設(shè)定值pid.Kp=0.5; //比例系數(shù)pid.Ti=40; //微分系數(shù)常數(shù)pid.Td=10; //積分時間常數(shù)pid.OUT0=0; //一個維持的輸出pid.pwmcycle = 330; //PWM的周期 }void pid_calc() {float dk1;float dk2;float t1,t2,t3;if(pid.Tdata < (pid.T)) //最小計算周期未到{return ;}pid.Tdata = 0;pid.En=pid.set-pid.curr; //本次誤差dk1=pid.En-pid.En_1; //本次偏差與上次偏差之差dk2=pid.En-2*pid.En_1+pid.En_2;t1=pid.Kp*dk1; //比例t2=(pid.Kp*pid.T)/pid.Ti; //積分t2=t2*pid.En;t3=(pid.Kp*pid.Td)/pid.T; //微分t3=t3*dk2;switch(pid.choose_model){case MODEL_P: //僅用Ppid.Dout= t1; printf("使用P運算\r\n") ;break;case MODEL_PI: //僅用PIpid.Dout= t1+t2; printf("使用PI運算\r\n") ;break;case MODEL_PID: //用PIDpid.Dout= t1+t2+t3; printf("使用PID運算\r\n") ;break;} pid.currpwm+=pid.Dout; //本次應(yīng)該輸出的PWMprintf("PID算得的OUT:\t%d\r\n",(int)pid.currpwm) ;if(pid.currpwm>pid.pwmcycle) //確保值在0-pid.pwmcycle之間{pid.currpwm=pid.pwmcycle;}if(pid.currpwm<0){pid.currpwm=0;}printf("實際輸出使用的OUT:\t%d\r\n",(int)pid.currpwm) ;pid.En_2=pid.En_1;pid.En_1=pid.En; } void tim4_pwm_init(u16 arr,u16 psc) { RCC->APB1ENR |= 1<<2; //時鐘復位TIM4TIM4->CR1=0x0080; //ARPE 使能,Timx_ARR寄存器被裝入緩沖器TIM4->CR1|=0x01; //使能定時器 4RCC->APB2ENR |= 1<<3; //時鐘使能GPIOB 由電路圖知GPIO6和TIM4的通道一復用 GPIOB->CRL&=0X00F00000;GPIOB->CRL|=0XBB033333; //pb6 7復用功能輸出 PB6輸出ch1,pb7輸出ch2TIM4->ARR = arr; //設(shè)置計數(shù)器自動重裝載值TIM4->PSC = psc; //預(yù)分頻器設(shè)計TIM4->CCMR1 =0X6060; //配置Tim4輸入捕獲模式TIM4->CCMR1|=1<<3; //CH1 預(yù)裝載使能 TIM4->CCMR1|=1<<11; //CH 2 預(yù)裝載使能TIM4->CCER |=1<<0; //OC1 輸出使能 TIM4->CCER |=1<<4; //OC2 輸出使能} 這里用到的寄存器全部可以在stm32中文手冊里查到。5 最后
總結(jié)
以上是生活随笔為你收集整理的毕业设计 基于STM32单片机的二轮平衡小车的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http安全 Java_AES - HT
- 下一篇: 基于stm32c8t6的两轮平衡小车 第