1. 首先介绍接收机的PWM输出类型。
通过示波器测量,可以知道:
1. 华科尔1002接收机的输出为PWM波,每个通道周期为22ms,高电平为3.3V。其中高电平的us数表示了该通道当前的舵量。比如说:当前俯仰通道默认中值为1500,该通道输出的PWM波的高电平即为1500us。
2. PWM转PPM的输出为PPM编码模式。其中高电平为5V左右(可能会有5.8V),具体的信号模式看PPM的编码介绍。在每个PPM帧之间有大于5ms的低电平时间表示帧的开始和结束。
具体如图所示:
图1 这是某通道输出舵量为1500时的PWM波形
图2 PPM波形图
2.输入捕获测试。
(1)先测试前四个通道的高电平捕获,引脚定义,采用TIM4(16位定时器)的四个通道,即CH1-PD12,CH2-PD13,CH3-PD14,CH4-PD15。
测试结果,成功。
(2)后测试后四个通道的高电平捕获,引脚定义,采用TIM3(16位定时器)的四个通道,即CH1-PA6,CH2-PA7,CH3-PB0,CH4-PB1。
注意:1.TIM7和TIM6无输入捕获功能。
2. 引脚设置为下拉模式——GPIO_PuPd_DOWN。
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
//定时器4输入捕获初始化函数
void TIM4_CH1_CH2_CH3_CH4_Cap_Init(u16 arr,u16 psc);
//定时器4中断函数
void TIM4_IRQHandler(void);
//定时器3输入捕获初始化函数
void TIM3_CH1_CH2_CH3_CH4_Cap_Init(u16 arr,u16 psc);
void TIM3_IRQHandler(void);
#endif
#include "timer.h"
#include "led.h"
#include "usart.h"
TIM_ICInitTypeDef TIM4_ICInitStructure;
TIM_ICInitTypeDef TIM3_ICInitStructure;
//定时器4通道1_通道2_通道3_通道4_输入捕获配置
//arr:自动重装值(TIM4是16位的!)
//psc:时钟预分频数
void TIM4_CH1_CH2_CH3_CH4_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //使能PORTD时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //GPIOD12/13/14/15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4); //PD12复用位定时器4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4); //PD13复用位定时器4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4); //PD14复用位定时器4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4); //PD15复用位定时器4
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
//初始化TIM4输入捕获参数
//初始化TIM4输入捕获参数 通道1
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM4_ICInitStructure);
//初始化TIM4输入捕获参数 通道2
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 选择输入端 IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM4_ICInitStructure);
//初始化TIM4输入捕获参数 通道3
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01 选择输入端 IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI3上
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM4_ICInitStructure);
//初始化TIM4输入捕获参数 通道4
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01 选择输入端 IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI4上
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM4_ICInitStructure);
TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);//不允许更新中断 ,允许CC1IE,CC2IE,CC3IE,CC4IE捕获中断
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreempti