久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: Arduino解析航模遙控器PPM信號(hào) [打印本頁(yè)]

作者: gangguo    時(shí)間: 2018-4-29 21:30
標(biāo)題: Arduino解析航模遙控器PPM信號(hào)
PPM信號(hào)是航模遙控器輸出的一種標(biāo)準(zhǔn)信號(hào),從PPM信號(hào)中可以獲取7-9個(gè)通道的遙控指令數(shù)據(jù)。PPM看起來很像PWM,很多模型愛好者對(duì)于它們產(chǎn)生了誤解,有些朋友認(rèn)為PPM和PWM就是一回事,其實(shí)不然,下面我們先說明一下它們之間的區(qū)別和關(guān)系。
PWM,是英文Pulse Width Modulation的縮寫,意思就是脈沖寬度調(diào)制。脈沖就是由高、低電平組成的信號(hào)序列,其中高電平的時(shí)間就是這里所說的脈沖寬度,也就是高電平維持的時(shí)間,單位為微秒,范圍在500-2500微秒(us)內(nèi),或0.5毫秒-2.5毫秒(ms)。如下圖所示:

                                
這樣的一個(gè)脈沖通常用來控制一個(gè)通道,即一個(gè)舵機(jī),如要控制多個(gè)舵機(jī),則需要多個(gè)這樣的通道,例如:我們要控制一架固定翼模型飛機(jī),則我們至少需要四個(gè)通道來分別控制油門、副翼、升降舵、方向舵,各個(gè)通道的脈沖寬度控制各個(gè)舵機(jī)轉(zhuǎn)動(dòng)。
                                 
而PPM是英文Pulse Position Modulation的縮寫,意思是脈沖位置調(diào)制,又稱脈位調(diào)制,實(shí)質(zhì)上就是將多個(gè)通道的PWM放到“一根線”上進(jìn)行傳輸,一個(gè)完整的PPM信號(hào)幀包含了多個(gè)通道的PWM值,下面看一個(gè)圖解:
                           
圖中第一個(gè)波形為PPM信號(hào),第二個(gè)波形為一通道的PWM,它對(duì)應(yīng)到PPM信號(hào)的“K1”,第三個(gè)波形為二通道的PWM,它對(duì)應(yīng)到PPM信號(hào)的“K2”,依次類推,“K8”對(duì)應(yīng)到第八通道的PWM。K1的前面及K8后面還有一個(gè)比較“寬”的脈沖,它的寬度大于所有通道的脈沖寬度,這個(gè)也稱為“同步脈沖”,在這樣的一幀信號(hào)中,找出信號(hào)的“頭”很關(guān)鍵,就如同在SBUS信號(hào)解析的過程中,要找到數(shù)據(jù)的開頭,才能正確的解算出各通道的數(shù)據(jù)。PPM信號(hào)“同步脈沖”就可以作為“幀頭”來使用,只要判斷一個(gè)脈沖大于通道的“正常值”,那么接下來的一個(gè)脈沖就是1通道的數(shù)據(jù)。這里要注意的是:PPM中的通道脈寬比實(shí)際的PWM脈寬要“窄一點(diǎn)”,這里是由于在PPM信號(hào)中需要接入脈沖間隔,以區(qū)分通道,而PPM信號(hào)幀的總長(zhǎng)又不宜過長(zhǎng),因此把每個(gè)通道的脈寬“砍掉”一個(gè)同樣的寬度作為間隔,我們?cè)谟?jì)算通道PWM脈寬時(shí)還應(yīng)該把這個(gè)被砍掉的部分加上。
下面開始介紹我的解算思路。很顯然,PPM信號(hào)不能像SBUS解算那樣使用串口,因?yàn)镻PM就沒有“波特率”,它的實(shí)質(zhì)就是一序列串在一起的脈沖,要解算它實(shí)質(zhì)就是要把這些脈沖一個(gè)一個(gè)地采集進(jìn)來。在Arduino中有一個(gè)專門用于采集脈沖寬度的函數(shù):pulseIn(),這個(gè)函數(shù)可以用來完成PPM解析,但是用這個(gè)函數(shù)有一些弊端:1、它會(huì)“死等”脈沖的到來,也就是脈沖不來,它就會(huì)在那里永遠(yuǎn)等待;2、當(dāng)在執(zhí)行一個(gè)脈沖的采集時(shí),程序依然會(huì)停在那里等待采集完畢,這樣的話,整個(gè)解算過程即要等待8個(gè)通道及一個(gè)同步脈沖的總時(shí)間,加在一起是20毫秒,如果這個(gè)解算過程只是用于演示,那么我們可以接受,但如果是用于實(shí)時(shí)控制,比如四軸飛行器,這么長(zhǎng)的采集周期勢(shì)必會(huì)讓整個(gè)控制崩潰,因此,我們必須尋找其他的解算方法。(這里舉個(gè)例子,玩過APM飛控的朋友應(yīng)該知道,APM的遙控信號(hào)輸入是使用的是PWM通道獨(dú)立輸入,而采集這些信號(hào)的任務(wù)都不是有主控芯片mega2560來完成的,完成這個(gè)任務(wù)是由協(xié)處理芯片:mega32,它同時(shí)也是USB轉(zhuǎn)TTL芯片,這說明采集多路PWM確實(shí)是一個(gè)比較“繁瑣”的過程)。那么采用什么辦法來做呢?
單片機(jī)系統(tǒng)都有外部中斷,可以用中斷來處理這些“粘在一起”的脈沖。這次試驗(yàn)用的Arduino板為:NANO板,這個(gè)板(MEGA328)使用Arduino官方庫(kù)時(shí)有兩個(gè)外部中斷:D2及D3口,試驗(yàn)中使用了D2,即外部中斷0,觸發(fā)方式設(shè)置為“跳變”,即脈沖的上升沿及下降沿均觸發(fā)中斷,并在中斷處理函數(shù)中判斷觸發(fā)方式(上升沿或下降沿),然后分別記錄進(jìn)入中斷的時(shí)刻(使用Arduino的時(shí)間函數(shù):micros()),然后下降沿時(shí)刻減去上升沿時(shí)刻,即可得到一個(gè)脈沖的寬度(這個(gè)方法同樣可以用于單通道PWM的采集,或者超聲波測(cè)距)。
那么如何處理這一串脈沖呢?如何正確獲得通道PWM呢?我的方法是:連續(xù)采集20個(gè)脈沖寬度放在一個(gè)數(shù)組中,然后去數(shù)組中尋找“同步脈沖”,找到它之后,緊隨其后的8個(gè)數(shù)組元素就是我們需要的通道PWM數(shù)據(jù)。為什么一定要采集20個(gè)呢?因?yàn)槲覀儫o法確定第一次采集到脈沖是哪個(gè)通道的,除非“運(yùn)氣好”,一開始就獲取到了“同步脈沖”,因此,如果我們非常“小氣”地只采集9個(gè),幾乎不可能容易地從中找到正確完整的數(shù)據(jù),當(dāng)然也可以做一個(gè)比較細(xì)致、復(fù)雜的解算程序來完成(如果你是一個(gè)拼圖高手),而每次采集20個(gè),則保證了每一次采集到的脈沖序列中至少包含一幀完整的數(shù)據(jù),這樣就可以簡(jiǎn)化解算的過程,只需要找到“同步脈沖”,然后從它之后順序取8個(gè)脈沖,其余的數(shù)據(jù)丟棄,然后進(jìn)入下一輪采集。

本次試驗(yàn)中使用的遙控器仍為FUTABA T10CHG,試驗(yàn)中將發(fā)射模式設(shè)置為“2.4G 7CH”,就是飛模擬器使用的模式,然后用一個(gè)音頻接頭改裝連線,連接遙控器背面的PPM信號(hào)線及地線。PPM信號(hào)線連接到NANO板的D2口,地線就在NANO上找一個(gè)GND接上。
            
下面是中斷處理函數(shù)及通道更新函數(shù):
                                                                              

程序說明:在初始化中還必須將D2端口設(shè)置為輸入模式,并且設(shè)置中斷0:attachInterrupt(0,ppm_in,CHANGE)。其中ppm_flag用于控制采集脈沖的個(gè)數(shù),并且將這些脈沖序列按順序存放到數(shù)組ppm_date[]中;flag_in用于確保采集脈沖是從上升沿開始(因?yàn)樯仙睾拖陆笛囟紩?huì)觸發(fā)中斷),它在上升沿處理中被置1,在下降沿處理中被置0,達(dá)到的目的就是在沒有采集到上升沿時(shí)不對(duì)下降沿進(jìn)行處理,因?yàn)槲覀円杉氖歉唠娖降臅r(shí)間;flag_out用于判斷是否完成了脈沖采集和是否完成了通道解算,當(dāng)完成采集時(shí)它被置1,這個(gè)時(shí)候中斷函數(shù)停止數(shù)據(jù)采集,只有等通道更新完畢后,它才會(huì)被置0,中斷函數(shù)才會(huì)進(jìn)行新一輪的數(shù)據(jù)采集,而在它為0的期間,也就是在數(shù)據(jù)采集的期間,不會(huì)進(jìn)行通道更新。接下來從串口監(jiān)視器觀察原始數(shù)據(jù),即采集到的ppm_date[]:                           
上圖中,每一行數(shù)字即是完整ppm_date[]幀,從數(shù)據(jù)中可以看到,每一行都有兩個(gè)比較大的數(shù)字:大于3000,這個(gè)就是我們要找的“同步脈沖”,找到一個(gè)之后,后面跟的8個(gè)數(shù),就是要提取的通道數(shù)據(jù)。當(dāng)然,從數(shù)據(jù)中能夠看到,有時(shí)每?jī)蓚(gè)“同步脈沖”之間偶爾會(huì)出現(xiàn)不足8個(gè)有效數(shù)據(jù)的情況,但這個(gè)影響暫且可以接受,我們可以設(shè)計(jì)更嚴(yán)密的通道更新程序?qū)⑦@樣的數(shù)據(jù)幀丟棄。下面來看看1通道的數(shù)據(jù),在試驗(yàn)過程中可以保持一通道(副翼)搖桿在中立位置(所有微調(diào)歸0),此時(shí)可以看到得到的數(shù)據(jù)為1120左右,在這種情況下,該通道的實(shí)際輸出脈寬(PWM)應(yīng)為1520,這個(gè)我們可以對(duì)FUTABA接收機(jī)的一通道輸出PWM進(jìn)行采樣驗(yàn)證,因此從ppm中獲取的數(shù)據(jù)還應(yīng)該加上400,這個(gè)就是低電平的持續(xù)時(shí)間即上面提到的“被砍掉的那一部分”,當(dāng)然這個(gè)時(shí)間也可以用中斷去采集ppm的低電平間隔得到。在程序中我直接給每個(gè)通道加了400,通過與之前PWM采集的數(shù)據(jù)進(jìn)行對(duì)比,得出的結(jié)果是一致的。下面從串口監(jiān)視器觀察解算出來的通道數(shù)據(jù)channels[],channels[0]代表1通道,副翼通道:                           
至此,PPM信號(hào)解析完成,從實(shí)驗(yàn)中可以看出,F(xiàn)UTABA T10CHG的ppm輸出確實(shí)為7個(gè)比例通道,第8個(gè)通道保持在中立位。這個(gè)試驗(yàn)主要是針對(duì)FUTABA T10CHG,對(duì)于其他品牌的遙控器我將進(jìn)行進(jìn)一步的試驗(yàn),比如6通道的SPEKTRUM DX6I遙控器的PPM輸出,也許還是有差別的吧。希望各位大神批評(píng)指正,多多指導(dǎo)!


作者: 孫夏    時(shí)間: 2018-11-19 20:26
確實(shí)不錯(cuò)。很詳細(xì)。
作者: 舟3    時(shí)間: 2018-12-20 22:52
請(qǐng)問兩個(gè)“同步脈沖”之間偶爾會(huì)出現(xiàn)不足8個(gè)有效數(shù)據(jù)的情況的原因是什么呢?
作者: tccbj    時(shí)間: 2019-3-21 22:57
你這是從遙控器背面數(shù)據(jù)接口得來的數(shù)據(jù),如果從接收機(jī)獲取數(shù)據(jù)應(yīng)該怎么連接怎么處理?
作者: fay02    時(shí)間: 2019-3-23 22:52
這個(gè)不是有庫(kù)可以直接下載用嗎?
作者: 大貓8888    時(shí)間: 2019-6-28 16:34
fay02 發(fā)表于 2019-3-23 22:52
這個(gè)不是有庫(kù)可以直接下載用嗎?

有庫(kù)?能分享一個(gè)嗎謝謝
作者: wxdx8320    時(shí)間: 2020-6-3 15:27
學(xué)習(xí)了,謝謝樓主
作者: xiaoxx521    時(shí)間: 2020-6-4 13:51
學(xué)習(xí)了,謝謝樓主
作者: zhangli019    時(shí)間: 2021-11-3 15:04
大貓8888 發(fā)表于 2019-6-28 16:34
有庫(kù)?能分享一個(gè)嗎謝謝

同求,感謝樓主的分享




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 免费视频一区 | 久久精品综合 | 亚洲欧美视频一区 | 国产精品18久久久久久白浆动漫 | 精品国产一区久久 | 99久久久国产精品 | 亚洲三级在线 | 欧美一级在线 | 精品欧美乱码久久久久久1区2区 | 免费一级欧美在线观看视频 | 91网站在线看 | 亚洲精品视频免费看 | 亚洲v日韩v综合v精品v | 天天久久 | 国产精品久久国产精品久久 | 欧美成人精品一区二区男人看 | 一级h片| 色嗨嗨| 在线看成人av | 国产传媒毛片精品视频第一次 | 91视频.com| 久久精品91久久久久久再现 | 国产在线精品区 | 在线国产一区二区 | 一级片在线观看 | 精品视频一区二区三区在线观看 | 久久91| 国产成人在线视频播放 | 欧美成人精品激情在线观看 | 国产精品久久久久久久久久 | 男女网站免费 | 欧美一级片 | 久久久精品影院 | 殴美一级片| 久久人体 | 日韩一区二区在线视频 | 国产精品久久久久久久久免费高清 | 亚洲网站在线观看 | k8久久久一区二区三区 | 中文字幕99 | 日韩福利 |