STM32F407ZGT6实现输入捕获RX1002八路PWM信号

博客介绍了如何使用STM32F407ZGT6微控制器实现输入捕获功能,以读取华科尔1002接收机的八路PWM信号。通过示波器观察,每个PWM周期为22ms,高电平时间对应舵量值。采用TIM4和TIM3进行通道捕获测试,成功捕获前四个和后四个通道的高电平信号。
摘要由CSDN通过智能技术生成

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值