传统的遥控器接收机是采用多路PWM的方式进行输出的,遥控器中有多少个通道,接收机中就有多少路PWM输出,例如下图中的遥控器有6个可用通道,其接收机也有6个PWM输出通道与之对应:

此接收机除了PWM输出之外还有S.BUS协议输出方式,关于S.BUS我们已经在上一节中介绍过了,这里不再赘述。下面我们主要针对PWM信号输出来做讲解。

接收机的1-7个PWM输出通道,都是以PWM的形式输出的,这就需要飞控能够采集并解析这些PWM信号,并为飞控所用。我们知道PWM信号所表示的数值就是高电平持续时间占用整个周期时长的百分比,例如下图所示:

接收机输出的PWM与之前章节中讲述的电调需要接收的PWM完全一致。只不过我们需要使用飞控程序来读取接收机输出的PWM信号值。我们以第一个通道的PWM为例,讲述飞控程序对其处理的具体方法:

(1)检测引脚由低点平变为高电平的时刻,并记录当前时间t0,表示高电平开始;

(2)检测引脚由高电平变为低点平的时刻,并记录当前时间t1,表示高电平结束;

(3)继续检测引脚由低点平变为高电平的时刻,并记录当前时间t2,表示一个PWM周期结束;

(4)计算高电平时常 = t1 - t0;

(5)计算整个PWM周期 = t2 - t0;

(6)计算PWM占空比 = 高电平时常 / PWM周期

在STM32系列中,我们可以为GPIO引脚设置成PWM采集模式,并通过采集寄存器来读取当前PWM的周期和PWM占空比。

每一个遥控器通道都需要一个PWM采集器进行采集,但是对于STM32来说不可能使用多个定时器来采集多个通道的PWM,这对于STM32的资源来说十分浪费。因此采用的就是PPM编码。PPM编码是PWM的扩展协议,可以在一个管脚中传输多路PWM信号。

PPM的频率通常是50Hz,周期长度20ms,每一个周期中可以存放最多10路PWM信号,每一路PWM的周期为2ms,如下图所示:

使用STM32的管脚中断配合定时器中的计数可以准确的捕获一个周期内的PPM信号中的高低电平变化,每2ms就是一路PWM信号的周期。


推荐阅读:
相关文章