固定翼飛機豎直飛行控制系統方案設計
·讀取遙控信號:這個遙控信號見圖5右上角,是9個脈沖組成的脈沖串,每20ms一串,讀取的方法如下,由TPM捕捉到脈沖的上升沿進入模定時器捕捉中斷程序后,先看是不是脈沖串里的第一個,若是就把定時器清零,然后把捕捉值存入數組,這樣9次后,數組里就由低到高地存下了每個脈沖發生的時間,用減法一算,各脈沖寬度就出來了。為防止出錯,附加了脈沖數錯誤預防,就是對脈沖個數進行計數,如果在一個脈沖串里讀到了多于9個脈沖就意味著有干擾了,需要盡快把所有脈寬按中間值1.5ms處理。這樣雖然和遙控器發出的指令不一樣,但減少了出大問題的機會。本文引用地址:http://www.j9360.com/article/161120.htm
·8ms定時中斷:系統有一個模定時器18ms中斷程序,因為正常的脈沖串9個脈沖不會超過18ms,所以可以讓定時器在第一個脈沖開始時計數,計到18ms就認為一個脈沖串結束,把脈沖數計數器清零。模定時器捕捉中斷程序里看到這個計數器被清零了就知道下一個脈沖串開始了。這個中斷還為PID的定時運算提供時間標志,每進入一次中斷就把標志置位,主程序讀到標志被置位就進行PID運算,這樣就保證了PID運算的周期是固定的。
·1.67ms中斷程序和A/D中斷程序:為了讀取MMA7260QT輸出的數據需要用A/D讀值,這里每1.6667ms進入中斷一次設定A/D通道,讀完三個通道用時5ms,在兩個脈沖串的標準間隔20ms內可以各讀4次,用滑動平均值算法后可以濾除干擾。
主程序介紹
雖然傳感器都是水平放置的,但因為溫度電壓等的不同,三個軸的輸出和計算的輸出是不一樣的,會有少許偏差,為了解決這個問題,在上電后先對三個軸的值連續讀64次后平均,把這個平均值作為飛機要穩定的目標值,這樣飛機就基本穩定了。
提到穩定,PID功不可沒,主程序里的PID有兩處要提一下。一是因為傳感器的穩定性問題和飛機的抖動,A/D輸出值差2、3個數是很正常的,所以在主程序里要判斷一下,如果誤差值在3以內,則不進行PID運算,這樣就減少了舵機無謂的抖動;二是因為飛機的前后左右重量不一致,所以在飛機前傾后仰左右擺動時要用不同的P值計算。
主程序每20ms更新一次數據,數據就是前后左右上下的控制脈沖的寬度。這個數據是把模定時器捕捉中斷程序里捕捉到的數直接拿來用還是要拿PID運算的數據來用?這由一個脈寬(決定此時飛機是否要豎直飛行的脈寬)決定,這里用到的是第7個脈沖的脈寬,也就是遙控器的第7通道,這個參數被命名為Helen,當Helen >1500(1.5ms)時就是操縱者要豎直飛行,要把PID運算的數據輸出;當Helen 1500時就是正常飛行,直接把模定時器捕捉中斷程序里捕捉到的數輸出就可以了。
要得到各個脈沖寬度,只要把從低到高的每個脈沖發生的時間做減法就可以了,這個減法運算也是在主程序里完成的。減法完成后還要對脈沖寬度進行出錯處理,要檢查一下,小于1ms的按1ms算,大于2ms的按2ms算,處理完了就可以調用發送中斷發送給輔助MCU了。調用方式是把數組排列好,把發送數據計數器清零,打開發送中斷允許位,這時發送緩沖區是空的,發送中斷一允許,它就立刻進中斷開始發送。
串口發送中斷程序:程序進入本中斷后首先把發送數據計數器指示的數送到發送緩沖區去發送,如發送完了就把發送中斷允許位清零,以防止正在發送的數據發送完后再次進入中斷;如沒發送完就直接退出,等待下次中斷。
輔助MCU程序流程圖見圖6。
串口接收中斷:輔助MCU程序的關鍵在串口接收中斷,接收到的數要存入指定的數組,這個容易實現,而把引導頭找出來就不那么容易了,因為作為引導頭的0xAA、0x55也有可能是數據,只有連起來的才是引導頭,判斷方法詳見圖6。
因為本MCU只有兩個定時器,但需要控制三路脈沖,所以有兩路脈沖用定時器的PWM功能實現,另外一路需要用軟件模擬,本文選用的方法是用一個20ms的中斷,進入中斷后把I/O口置位,然后在主程序里循環判斷定時器的值,當定時器的值大于要送的脈沖值時把I/O復位。
評論