<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 固定翼飛機豎直飛行控制系統的設計

固定翼飛機豎直飛行控制系統的設計

作者:廣東省東莞市大朗鎮洋烏工業(yè)區東冠電子廠(chǎng) 馬山 時(shí)間:2008-07-30 來(lái)源:中電網(wǎng) 收藏

軟件描述

本文引用地址:http://dyxdggzs.com/article/86409.htm

  主控部分,流程圖見(jiàn)圖5。

 

  ·讀取遙控信號:這個(gè)遙控信號見(jiàn)圖5右上角,是9個(gè)脈沖組成的脈沖串,每20ms一串,讀取的方法如下,由TPM捕捉到脈沖的上升沿進(jìn)入模定時(shí)器捕捉中斷程序后,先看是不是脈沖串里的第一個(gè),若是就把定時(shí)器清零,然后把捕捉值存入數組,這樣9次后,數組里就由低到高地存下了每個(gè)脈沖發(fā)生的時(shí)間,用減法一算,各脈沖寬度就出來(lái)了。為防止出錯,附加了脈沖數錯誤預防,就是對脈沖個(gè)數進(jìn)行計數,如果在一個(gè)脈沖串里讀到了多于9個(gè)脈沖就意味著(zhù)有干擾了,需要盡快把所有脈寬按中間值1.5ms處理。這樣雖然和遙控器發(fā)出的指令不一樣,但減少了出大問(wèn)題的機會(huì )。

  ·8ms定時(shí)中斷:系統有一個(gè)模定時(shí)器18ms中斷程序,因為正常的脈沖串9個(gè)脈沖不會(huì )超過(guò)18ms,所以可以讓定時(shí)器在第一個(gè)脈沖開(kāi)始時(shí)計數,計到18ms就認為一個(gè)脈沖串結束,把脈沖數計數器清零。模定時(shí)器捕捉中斷程序里看到這個(gè)計數器被清零了就知道下一個(gè)脈沖串開(kāi)始了。這個(gè)中斷還為PID的定時(shí)運算提供時(shí)間標志,每進(jìn)入一次中斷就把標志置位,主程序讀到標志被置位就進(jìn)行PID運算,這樣就保證了PID運算的周期是固定的。

  ·1.67ms中斷程序和A/D中斷程序:為了讀取MMA7260QT輸出的數據需要用A/D讀值,這里每1.6667ms進(jìn)入中斷一次設定A/D通道,讀完三個(gè)通道用時(shí)5ms,在兩個(gè)脈沖串的標準間隔20ms內可以各讀4次,用滑動(dòng)平均值算法后可以濾除干擾。

主程序介紹

  雖然傳感器都是水平放置的,但因為溫度電壓等的不同,三個(gè)軸的輸出和計算的輸出是不一樣的,會(huì )有少許偏差,為了解決這個(gè)問(wèn)題,在上電后先對三個(gè)軸的值連續讀64次后平均,把這個(gè)平均值作為飛機要穩定的目標值,這樣飛機就基本穩定了。

  提到穩定,PID功不可沒(méi),主程序里的PID有兩處要提一下。一是因為傳感器的穩定性問(wèn)題和飛機的抖動(dòng),A/D輸出值差2、3個(gè)數是很正常的,所以在主程序里要判斷一下,如果誤差值在3以?xún)?,則不進(jìn)行PID運算,這樣就減少了舵機無(wú)謂的抖動(dòng);二是因為飛機的前后左右重量不一致,所以在飛機前傾后仰左右擺動(dòng)時(shí)要用不同的P值計算。

  主程序每20ms更新一次數據,數據就是前后左右上下的控制脈沖的寬度。這個(gè)數據是把模定時(shí)器捕捉中斷程序里捕捉到的數直接拿來(lái)用還是要拿PID運算的數據來(lái)用?這由一個(gè)脈寬(決定此時(shí)飛機是否要豎直飛行的脈寬)決定,這里用到的是第7個(gè)脈沖的脈寬,也就是遙控器的第7通道,這個(gè)參數被命名為Helen,當Helen > 1500(1.5ms)時(shí)就是操縱者要豎直飛行,要把PID運算的數據輸出;當Helen < 1500時(shí)就是正常飛行,直接把模定時(shí)器捕捉中斷程序里捕捉到的數輸出就可以了。

  要得到各個(gè)脈沖寬度,只要把從低到高的每個(gè)脈沖發(fā)生的時(shí)間做減法就可以了,這個(gè)減法運算也是在主程序里完成的。減法完成后還要對脈沖寬度進(jìn)行出錯處理,要檢查一下,小于1ms的按1ms算,大于2ms的按2ms算,處理完了就可以調用發(fā)送中斷發(fā)送給輔助了。調用方式是把數組排列好,把發(fā)送數據計數器清零,打開(kāi)發(fā)送中斷允許位,這時(shí)發(fā)送緩沖區是空的,發(fā)送中斷一允許,它就立刻進(jìn)中斷開(kāi)始發(fā)送。

  串口發(fā)送中斷程序:程序進(jìn)入本中斷后首先把發(fā)送數據計數器指示的數送到發(fā)送緩沖區去發(fā)送,如發(fā)送完了就把發(fā)送中斷允許位清零,以防止正在發(fā)送的數據發(fā)送完后再次進(jìn)入中斷;如沒(méi)發(fā)送完就直接退出,等待下次中斷。

  輔助程序流程圖見(jiàn)圖6。

 

  串口接收中斷:輔助MCU程序的關(guān)鍵在串口接收中斷,接收到的數要存入指定的數組,這個(gè)容易實(shí)現,而把引導頭找出來(lái)就不那么容易了,因為作為引導頭的0xAA、0x55也有可能是數據,只有連起來(lái)的才是引導頭,判斷方法詳見(jiàn)圖6。

  因為本MCU只有兩個(gè)定時(shí)器,但需要控制三路脈沖,所以有兩路脈沖用定時(shí)器的PWM功能實(shí)現,另外一路需要用軟件模擬,本文選用的方法是用一個(gè)20ms的中斷,進(jìn)入中斷后把置位,然后在主程序里循環(huán)判斷定時(shí)器的值,當定時(shí)器的值大于要送的脈沖值時(shí)把I/O復位。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: MCU 控制系統 I/O口 固定翼飛機

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>