一、
PPM信号是将多个控制通道(一般10个控制通道)集中放在一起调制的信号。也就是一个PPM脉冲序列里面包含了多个通道的信息。如下图所示:
PPM和PWM的对应关系如下图:
上图中,第一行为PPM信号,下边几行分别是PWM通道信号。上图表达了多个通道与PPM信号编码的对应关系。
标准的PPM信号,以0.4ms的低电平为起始标识。后边以电平的上升沿的间隔时间来表达各个通道的控制量。一般排列10个上升沿后,电平保持高电平,直到重复下一个PPM信号。
PPM信号可以看做是一帧数据,它包含了8个通道的信息。每个上升沿间隔时间刚好等于PWM信号的高电平持续时间,也就1000us~2000us之间。
PPM的重复周期也为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()