天天看點

微型四軸飛行器

second order system analysis 自動控制原理 二階系統的matlab仿真分析

https://blog.csdn.net/cinmyheart/article/details/21454779

四旋翼動力學和仿真翻譯(Quadcopter Dynamics and Simulation)

https://blog.csdn.net/u013859301/article/details/51284371

我的四軸專用PID參數整定方法及原理---超長文慎入(先内環後外環)

https://blog.csdn.net/chenbang110/article/details/10567845

手把手帶你玩串級PID仿真實驗

https://blog.csdn.net/rick_grimes/article/details/75095315

四軸PID講解

https://blog.csdn.net/nemol1990/article/details/45131603

經典的串級PID算法,附源代碼

https://blog.csdn.net/mjf110107110/article/details/78950341

對串級PID和單級PID的了解(基于匿名微型六軸)

https://blog.csdn.net/guwhao/article/details/47346291

微型四旋翼飛行器設計經驗之瞎扯淡

https://blog.csdn.net/Rick_Grimes/article/details/75344054

以微型四旋翼飛行器來說,核心算法大概分為兩個部分:姿态解算算法與控制算法。

微型四軸飛行器
微型四軸飛行器

用51單片機做的四軸?以前别人這樣說我們隻能呵呵一笑說聲逗比,但是現在的51早已不是當年的51,6路15位硬體PWM+2路CCP的16位硬體PWM,相當于是8路15位硬體PWM,mega328都可以直接秒掉,而mega328卻正是市售MWC飛控的主要,mega328速度16MHZ,等效16MIPS,[email protected],等效25MIPS,運算速度也秒了mega328,也就是說,用51單片機做四軸絕對不成問題。

本人目前大二,做得不盡人意之處歡迎指教,不過麻煩說得别太專業化,我連模拟電路都還沒學過,自動控制原理都還隻自己看了一些些,太高深的懂不起,但是卡爾曼濾波,PID參數整定還是會的。

相關設計參數:

供電:   容量:650MAH(毫安)  電壓3.7v  倍率20c

電機:716空心杯+7.5厘米       有刷

【電壓】:3.7V, 空載電流110ma左右, 堵轉1.54A

【尺寸】:直徑7mm*長16MM*軸徑1mm 

【轉速】:空載40000rpm

MCU:[email protected]                      STM32F103C8T6   穩壓器件   AMS1117輸出電壓為3.3V的正向低壓降穩壓器

陀螺儀加速度計:MPU-6050                            ROLL/PICTH 兩軸姿态角       GPIO_Speed_50MHz             速度級别

磁場傳感計:HMC5883L

霍尼韋爾 HMC5883L 是一種表面貼裝的高內建子產品,并帶有數字接口的弱磁傳感器晶片,應用于低成本羅盤和磁場檢測領域。

無線晶片:NRF24L01+                                                                                    GPIO_Speed_10MHz

電機驅動MOS管:AO3400                                N溝道

MOS管保護用肖特基:BAT54ST

下載下傳口防靜電TVS:Rclamp0524P

機架:94*94mm

PCB厚度:1.2mm FR-4

軟體相關參數:

姿态解算&電機控制頻率:                                     125HZ(8ms) 

PWM頻率:28KHZ 1000精度

濾波算法:卡爾曼濾波器    平滑濾波

PID控制:PID=P*e(n)+I*[(e(n)+e(n-1)+...+e(0)]+D*[e(n)-e(n-1)]

mpu6050         ALIENTEK 推出的一款高性能三軸加速度+三軸陀螺儀的六軸傳感器子產品,并可利用自帶的數字運動處理器(DMP: Digital Motion Processor)硬體加速引擎,通過主IIC 接口,向應用端輸出姿态解算後的資料。

 NRF24L01       是一款無線通信通信晶片,采用FSK 調制。可以實作點對點或是1對6的無線通信。無線通信速度最高可達到2Mbps。 ​ NRF24L01采用SPI通信,可以很友善的連接配接到MCU上面。

淺談PID整定和姿态解算。

PID的整定是個讓很多人都感到頭痛的問題,在此,我想強調一句,PID整定必須建立在良好的姿态解算的基礎上才能進行,否則根本沒法弄出一個很好的效果。舉個例子,我的這個四軸,用互補濾波進行姿态處理,P最多調到3。再調大由于姿态解算不過關,P越大輸出的姿态震動越大,即使D調大系統也沒法收斂,也就是說這個系統發散了。而用卡爾曼濾波我可以把P調到4.5而且回複也有力,飛起來也穩。

在姿态解算中,有很多種方法,我這采用的就是普通的姿态角,其他的解算方法還有四元素,歐拉角,等等,其實四元數還是要轉化為歐拉角才能用于PID,不過四元數沒有歐拉角中萬向節死鎖的問題。具體請百度:四元數,歐拉角,萬向節死鎖。在此不一一贅述。

我這的姿态解算原理比較簡單,就是對三軸加速度的值進行三角函數運算即可。

舉個例子,首先我從加速度計中擷取資料。

    Accel_y= GetData(ACCEL_YOUT_H);    

    Accel_x= GetData(ACCEL_XOUT_H);           

    Accel_z= GetData(ACCEL_ZOUT_H);                                            

再進行轉化,轉化公式在MPU6050資料手冊裡有

    Angle_ax=(Accel_x)/8192;  

    Angle_az=(Accel_z)/8192; 

    Angle_ay=(Accel_y)/8192;    

好了,這裡得到的就是我們需要的加速度的值,取值範圍0-1,也就是多少個g,g是重力加速度這個就不用說了吧。

之後用反三角函數進行運算:

AngleAx=atan(Angle_ax/sqrt(Angle_ay*Angle_ay+Angle_az*Angle_az))*180/3.141592657; 

公式:X軸角度=arctan(Angle_ax/開根号(Angle_ay^2+Angle_az^2))

好了,這裡得到的是弧度制的角度,再乘180除以π即可得到所需的角度值。

之後要對得到的值進行濾波,為什麼要濾波呢,因為加速度計對震動特别敏感,一點震動就大姨媽,得到的角度值是不怎麼準确的,不過大緻在實際角度的上下。

而陀螺儀對震動不敏感,随便怎麼震動都不會高潮。陀螺儀輸出的資料是多少度一秒,據此進行積分,可以得到短時間内系統的姿态。不過陀螺儀有溫飄,溫度偏移一點他的誤差就會大一點,故要用加速度計的值來對陀螺儀的值進行校準。修正他的溫飄誤差以及積分誤差。這就是互補濾波的原理,短時間内以陀螺儀的值為準,長時間内以加速度計的值來對陀螺儀校準,二者優勢互補,去掉不好的一面,這樣得到的值就比較理想了。

互補濾波公式舉例:Angle=0.95*(Angle-Angle_gy*dt)+0.05*AngleAx;

前面的0.95和0.05是對陀螺儀角度和角速度角度的權值,意思就是你相信哪個的程度更大一點,因為震動是雙向的,故對加速度計進行低通濾波會使加速度計輸出的值接近實際值,什麼是低通濾波呢,打個比方,目前角度=0.95乘上次的角度+0.05乘測量的角度,這就是對測量值進行低通濾波,dt是積分時間,就是定時器定時的時間,我這取8ms,即dt=0.08。

至于卡爾曼濾波,

就是一個先進行估計,再根據實際測量的值修改卡爾曼參數,最後再算誤差,裡面涉及到線性代數,機率論的相關知識

再談PID,

得到了實時姿态,就知道了誤差,知道了誤差就要對電機進行控制,在PID中,P指比例,I指積分,D指微分,換種說法,P指回複力,P的輸出值=P*誤差;P越大偏差所引起的回複力越大。是系統能夠回到0點的主要力。D是系統運動的阻力,D的輸出值=D*(目前誤差-前一次誤差),D的存在能阻止系統運動。I是系統靜差的消除力,比如你四軸的重心偏了,四軸會朝一邊偏,對誤差進行積分再乘以I即可消除這種機械結構引起的偏移。I的輸出值=I*所有誤差積分之和。

光有P存在的情況,系統一有偏差,就會立馬回複,不過到0點時由于慣性,會繼續運動,故光有P的話系統會震蕩,根本停不下來。

故需要D,這個系統運動的克制力來對P進行壓制,當PD呈一定比例時,系統就會穩定在一定的值,不過有可能會有點誤差,這時就得靠I來修正。

I的原理決定了誤差存在的時間約久,回複力越大,I可以了解是變相的回複力,專門用來修正PD沒法消除的靜差。

PID整定的方法:

I和D置0,從小往大調P,調整至用手造成一個誤差,感覺回複有力即可。網上所說的調整至等幅震蕩不适合小四軸,你根本就不可能把這玩意弄到等幅震蕩的狀态。總得來說,P調至你覺得回複起來有點力度就行了,不要太過于糾結。

之後從小往大加大D,在D加大的過程中,會出現震蕩減小,震蕩最小,震蕩增大的過程。震蕩最小的那一點即very good。

調好PD之後如果系統有靜差,适當加上I即可,I不能加大,加大了會導緻系統震蕩,适當為宜。

這個過程一定要會區分震蕩的來源,到底是P引起的還是D引起的。這個口述講不清,隻有靠自己來體會。

調整好XY軸的PID後就該解決四軸自旋的問題了,一般來說XY軸的PID參數是一樣的,調好一邊,另一邊直接複制過去就行。

自旋控制方法有2種,一種是對HMC5883的值進行PD控制。一種是對Z軸陀螺儀旋轉速度進行PD控制,後面那種就夠了,隻不過需要飛前對陀螺儀偏差進行校準。這個PD參數不要太糾結,Z軸稍微給點控制就穩了,畢竟XY軸才是四軸飛起來的關鍵。

此外,PID的要求是系統的輸出量要和被調量成正比,故大四軸比小四軸好調得多,因為大四軸有電調,電調調整的不是電機供電電壓,而是力矩,也就是說大四軸輸出信号和升力是成正比的,而小四軸不是,但是我們隻需要他大概是正比關系就行了,也能好好滴做朋友的。推薦碳刷電機PWM頻率為500HZ,空心杯最好是20KHZ以上。

調PID中各種問題及解決方法彙總:

四軸偏離一定角度即使加I也糾正不過來,也就是說四軸明明知道他自己偏了,就是糾正不過來,解決方法:加大P。

D無論怎麼調四軸就是要震蕩,根本停不下來,解決方法,減小P

系統有細微偏差:加點點I

發現無論怎麼調PID根本就不能讓四軸取得一個很好的效果:換濾波方案吧,什麼梯度下降法,卡爾曼濾波算法都是很好的。

震動越大角度值和實際值偏離越大:陀螺儀裝錯位置了,在MPU6050子產品下面弄點泡沫雙面膠可以很好解決,原則上來講MPU6050是不能太靠近軸的。