Micropython 飛控 驅(qū)動(dòng) 5.PPM信號(hào)解析

一、
PPM信號(hào)是將多個(gè)控制通道(一般10個(gè)控制通道)集中放在一起調(diào)制的信號(hào)。也就是一個(gè)PPM脈沖序列里面包含了多個(gè)通道的信息。如下圖所示:


PPM和PWM的對(duì)應(yīng)關(guān)系如下圖:

上圖中,第一行為PPM信號(hào),下邊幾行分別是PWM通道信號(hào)。上圖表達(dá)了多個(gè)通道與PPM信號(hào)編碼的對(duì)應(yīng)關(guān)系。

標(biāo)準(zhǔn)的PPM信號(hào),以0.4ms的低電平為起始標(biāo)識(shí)。后邊以電平的上升沿的間隔時(shí)間來(lái)表達(dá)各個(gè)通道的控制量。一般排列10個(gè)上升沿后,電平保持高電平,直到重復(fù)下一個(gè)PPM信號(hào)。

PPM信號(hào)可以看做是一幀數(shù)據(jù),它包含了8個(gè)通道的信息。每個(gè)上升沿間隔時(shí)間剛好等于PWM信號(hào)的高電平持續(xù)時(shí)間,也就1000us~2000us之間。

PPM的重復(fù)周期也為20ms,也是50hz的刷新頻率。

二、代碼

import pyb
import micropython
micropython.alloc_emergency_exception_buf(100)

# Futaba PPM decoder
# http://diydrones.com/profiles/blogs/705844:BlogPost:38393
class Decoder():

    def __init__(self, pin: str):
        self.pin = pin
        self.current_channel = -1
        self.channels = [0] * 20 # up to 10 channels
        self.timer = pyb.Timer(2, prescaler=83, period=0x3fffffff)
        self.timer.counter(0)
        # clear any previously set interrupt
        pyb.ExtInt(pin, pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, None)
        self.ext_int = pyb.ExtInt(pin, pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, self._callback)

    def _callback(self, t):
        ticks = self.timer.counter()
        if ticks > 5000:
            self.current_channel = 0
        elif self.current_channel > -1:
            self.channels[self.current_channel] = ticks
            self.current_channel += 1
        self.timer.counter(0)

    def get_channel_value(self, channel: int) -> int:
        return self.channels[channel]

    def enable(self):
        self.ext_int.enable()

    def disable(self):
        self.ext_int.disable()


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容