×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-06 发布时间:
|

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_IRQChannelPreemptionPriority=0;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、

TIM_Cmd(TIM4,ENABLE ); //使能定时器4

}



////////=================================================================================================================

////////=================================================================================================================

////////=================================================================================================================

//捕获状态

//[7]:0,没有成功的捕获;1,成功捕获到一次.

//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.

//[5:0]:捕获低电平后溢出的次数(对于16位定时器来说,1us计数器加1,溢出时间:65536us秒)

u8  TIM4CH1_CAPTURE_STA=0; //输入捕获状态    

u16 TIM4CH1_CAPTURE_UPVAL; //TIM4是16位定时器

u16 TIM4CH1_CAPTURE_DOWNVAL;


u8 TIM4CH2_CAPTURE_STA = 0; //通道2输入捕获标志,高两位做捕获标志,低6位做溢出标志

u16 TIM4CH2_CAPTURE_UPVAL;

u16 TIM4CH2_CAPTURE_DOWNVAL;


u8 TIM4CH3_CAPTURE_STA = 0; //通道3输入捕获标志,高两位做捕获标志,低6位做溢出标志

u16 TIM4CH3_CAPTURE_UPVAL;

u16 TIM4CH3_CAPTURE_DOWNVAL;


u8 TIM4CH4_CAPTURE_STA = 0; //通道1输入捕获标志,高两位做捕获标志,低6位做溢出标志

u16 TIM4CH4_CAPTURE_UPVAL;

u16 TIM4CH4_CAPTURE_DOWNVAL;


u32 CH1_HIGHLEVEL_TIME = 0; //捕获总高电平的时间

u32  CH2_HIGHLEVEL_TIME  = 0; //捕获总高电平的时间

u32  CH3_HIGHLEVEL_TIME  = 0; //捕获总高电平的时间

u32  CH4_HIGHLEVEL_TIME  = 0; //捕获总高电平的时间



u32 tim4_T1;

u32 tim4_T2;

u32 tim4_T3;

u32 tim4_T4;



//定时器4中断服务程序  

void TIM4_IRQHandler(void)

{    

//===================================================================================================

  if((TIM4CH1_CAPTURE_STA&0X80)==0)//还未成功捕获

{

if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) //捕获1发生捕获事件

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); //清除中断标志位

if (TIM4CH1_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM4CH1_CAPTURE_DOWNVAL = TIM_GetCapture1(TIM4);//记录下此时的定时器计数值

if (TIM4CH1_CAPTURE_DOWNVAL < TIM4CH1_CAPTURE_UPVAL)

{

tim4_T1 = 65535;

}

else

tim4_T1 = 0;

CH1_HIGHLEVEL_TIME = TIM4CH1_CAPTURE_DOWNVAL - TIM4CH1_CAPTURE_UPVAL

+ tim4_T1; //得到总的高电平的时间

TIM4CH1_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM4CH1_CAPTURE_UPVAL = TIM_GetCapture1(TIM4); //获取上升沿数据

TIM4CH1_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

//================================================================================

if ((TIM4CH2_CAPTURE_STA & 0X80) == 0) //还未成功捕获

{

if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET) //捕获2发生捕获事件

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC2); //清除中断标志位

if (TIM4CH2_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM4CH2_CAPTURE_DOWNVAL = TIM_GetCapture2(TIM4);//记录下此时的定时器计数值

if (TIM4CH2_CAPTURE_DOWNVAL < TIM4CH2_CAPTURE_UPVAL)

{

tim4_T2 = 65535;

}

else

tim4_T2 = 0;

CH2_HIGHLEVEL_TIME = TIM4CH2_CAPTURE_DOWNVAL - TIM4CH2_CAPTURE_UPVAL

+ tim4_T2; //得到总的高电平的时间

TIM4CH2_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM4CH2_CAPTURE_UPVAL = TIM_GetCapture2(TIM4); //获取上升沿数据

TIM4CH2_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

//========================================================================================

if ((TIM4CH3_CAPTURE_STA & 0X80) == 0) //还未成功捕获

{

if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET) //捕获3发生捕获事件

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC3); //清除中断标志位

if (TIM4CH3_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM4CH3_CAPTURE_DOWNVAL = TIM_GetCapture3(TIM4);//记录下此时的定时器计数值

if (TIM4CH3_CAPTURE_DOWNVAL < TIM4CH3_CAPTURE_UPVAL)

{

tim4_T3 = 65535;

}

else

tim4_T3 = 0;

CH3_HIGHLEVEL_TIME = TIM4CH3_CAPTURE_DOWNVAL - TIM4CH3_CAPTURE_UPVAL

+ tim4_T3; //得到总的高电平的时间

TIM4CH3_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM4CH3_CAPTURE_UPVAL = TIM_GetCapture3(TIM4); //获取上升沿数据

TIM4CH3_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

//========================================================================================

if ((TIM4CH4_CAPTURE_STA & 0X80) == 0) //还未成功捕获

{

if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET) //捕获4发生捕获事件

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC4); //清除中断标志位

if (TIM4CH4_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM4CH4_CAPTURE_DOWNVAL = TIM_GetCapture4(TIM4);//记录下此时的定时器计数值

if (TIM4CH4_CAPTURE_DOWNVAL < TIM4CH4_CAPTURE_UPVAL)

{

tim4_T4 = 65535;

}

else

tim4_T4 = 0;

CH4_HIGHLEVEL_TIME = TIM4CH4_CAPTURE_DOWNVAL - TIM4CH4_CAPTURE_UPVAL

+ tim4_T4; //得到总的高电平的时间

TIM4CH4_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC4PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM4CH4_CAPTURE_UPVAL = TIM_GetCapture4(TIM4); //获取上升沿数据

TIM4CH4_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC4PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

}



////////=================================================================================================================

////////=================================================================================================================

////////=================================================================================================================





//定时器3输入捕获初始化,引脚为CH1-PA6,CH2-PA7,CH3-PB0,CH4-PB1


void TIM3_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_TIM3,ENABLE);   //TIM3时钟使能    

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTB时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //GPIOA7/7

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(GPIOA,&GPIO_InitStructure); //初始化PA6,PA7

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //GPIOB0/1

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(GPIOB,&GPIO_InitStructure); //初始化PB0,PB1


GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); 

GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM3); 

GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3); 

GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM3); 

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(TIM3,&TIM_TimeBaseStructure);


//初始化TIM3输入捕获参数

//初始化TIM3输入捕获参数 通道1

TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上

    TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

    TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

    TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 

    TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

    TIM_ICInit(TIM3, &TIM3_ICInitStructure);

//初始化TIM3输入捕获参数 通道2

  TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 选择输入端 IC1映射到TI1上

    TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

    TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上

    TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 

    TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

    TIM_ICInit(TIM3, &TIM3_ICInitStructure);

//初始化TIM3输入捕获参数 通道3

  TIM3_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01 选择输入端 IC1映射到TI1上

    TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

    TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI3上

    TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 

    TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

    TIM_ICInit(TIM3, &TIM3_ICInitStructure);

//初始化TIM3输入捕获参数 通道4

  TIM3_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01 选择输入端 IC1映射到TI1上

    TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

    TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI4上

    TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 

    TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

    TIM_ICInit(TIM3, &TIM3_ICInitStructure);

TIM_ITConfig(TIM3,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);//不允许更新中断 ,允许CC1IE,CC2IE,CC3IE,CC4IE捕获中断

  


 

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、

TIM_Cmd(TIM3,ENABLE ); //使能定时器3


}




////////=================================================================================================================

////////=================================================================================================================

////////=================================================================================================================


//捕获状态

//[7]:0,没有成功的捕获;1,成功捕获到一次.

//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.

//[5:0]:捕获低电平后溢出的次数(对于16位定时器来说,1us计数器加1,溢出时间:65536us秒)

u8  TIM3CH1_CAPTURE_STA=0; //输入捕获状态    

u16 TIM3CH1_CAPTURE_UPVAL; //TIM4是16位定时器

u16 TIM3CH1_CAPTURE_DOWNVAL;


u8 TIM3CH2_CAPTURE_STA = 0; //通道2输入捕获标志,高两位做捕获标志,低6位做溢出标志

u16 TIM3CH2_CAPTURE_UPVAL;

u16 TIM3CH2_CAPTURE_DOWNVAL;


u8 TIM3CH3_CAPTURE_STA = 0; //通道3输入捕获标志,高两位做捕获标志,低6位做溢出标志

u16 TIM3CH3_CAPTURE_UPVAL;

u16 TIM3CH3_CAPTURE_DOWNVAL;


u8 TIM3CH4_CAPTURE_STA = 0; //通道1输入捕获标志,高两位做捕获标志,低6位做溢出标志

u16 TIM3CH4_CAPTURE_UPVAL;

u16 TIM3CH4_CAPTURE_DOWNVAL;


u32  TIM3_CH1_HIGHLEVEL_TIME = 0; //捕获总高电平的时间

u32  TIM3_CH2_HIGHLEVEL_TIME  = 0; //捕获总高电平的时间

u32  TIM3_CH3_HIGHLEVEL_TIME  = 0; //捕获总高电平的时间

u32  TIM3_CH4_HIGHLEVEL_TIME  = 0; //捕获总高电平的时间



u32 tim3_T1;

u32 tim3_T2;

u32 tim3_T3;

u32 tim3_T4;



void TIM3_IRQHandler(void)

{

//===================================================================================================

  if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获

{

if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) //捕获1发生捕获事件

{

TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); //清除中断标志位

if (TIM3CH1_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM3CH1_CAPTURE_DOWNVAL = TIM_GetCapture1(TIM3);//记录下此时的定时器计数值

if (TIM3CH1_CAPTURE_DOWNVAL < TIM3CH1_CAPTURE_UPVAL)

{

tim3_T1 = 65535;

}

else

tim3_T1 = 0;

TIM3_CH1_HIGHLEVEL_TIME = TIM3CH1_CAPTURE_DOWNVAL - TIM3CH1_CAPTURE_UPVAL

+ tim3_T1; //得到总的高电平的时间

TIM3CH1_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC1PolarityConfig(TIM3, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM3CH1_CAPTURE_UPVAL = TIM_GetCapture1(TIM3); //获取上升沿数据

TIM3CH1_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC1PolarityConfig(TIM3, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

//================================================================================

if ((TIM3CH2_CAPTURE_STA & 0X80) == 0) //还未成功捕获

{

if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) //捕获2发生捕获事件

{

TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); //清除中断标志位

if (TIM3CH2_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM3CH2_CAPTURE_DOWNVAL = TIM_GetCapture2(TIM3);//记录下此时的定时器计数值

if (TIM3CH2_CAPTURE_DOWNVAL < TIM3CH2_CAPTURE_UPVAL)

{

tim3_T2 = 65535;

}

else

tim3_T2 = 0;

TIM3_CH2_HIGHLEVEL_TIME = TIM3CH2_CAPTURE_DOWNVAL - TIM3CH2_CAPTURE_UPVAL

+ tim3_T2; //得到总的高电平的时间

TIM3CH2_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC2PolarityConfig(TIM3, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM3CH2_CAPTURE_UPVAL = TIM_GetCapture2(TIM3); //获取上升沿数据

TIM3CH2_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC2PolarityConfig(TIM3, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

//========================================================================================

if ((TIM3CH3_CAPTURE_STA & 0X80) == 0) //还未成功捕获

{

if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET) //捕获3发生捕获事件

{

TIM_ClearITPendingBit(TIM3, TIM_IT_CC3); //清除中断标志位

if (TIM3CH3_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM3CH3_CAPTURE_DOWNVAL = TIM_GetCapture3(TIM3);//记录下此时的定时器计数值

if (TIM3CH3_CAPTURE_DOWNVAL < TIM3CH3_CAPTURE_UPVAL)

{

tim3_T3 = 65535;

}

else

tim3_T3 = 0;

TIM3_CH3_HIGHLEVEL_TIME = TIM3CH3_CAPTURE_DOWNVAL - TIM3CH3_CAPTURE_UPVAL

+ tim3_T3; //得到总的高电平的时间

TIM3CH3_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC3PolarityConfig(TIM3, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM3CH3_CAPTURE_UPVAL = TIM_GetCapture3(TIM3); //获取上升沿数据

TIM3CH3_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC3PolarityConfig(TIM3, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}

//========================================================================================

if ((TIM3CH4_CAPTURE_STA & 0X80) == 0) //还未成功捕获

{

if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET) //捕获4发生捕获事件

{

TIM_ClearITPendingBit(TIM3, TIM_IT_CC4); //清除中断标志位

if (TIM3CH4_CAPTURE_STA & 0X40) //捕获到一个下降沿

{

TIM3CH4_CAPTURE_DOWNVAL = TIM_GetCapture4(TIM3);//记录下此时的定时器计数值

if (TIM3CH4_CAPTURE_DOWNVAL < TIM3CH4_CAPTURE_UPVAL)

{

tim3_T4 = 65535;

}

else

tim3_T4 = 0;

TIM3_CH4_HIGHLEVEL_TIME = TIM3CH4_CAPTURE_DOWNVAL - TIM3CH4_CAPTURE_UPVAL

+ tim3_T4; //得到总的高电平的时间

TIM3CH4_CAPTURE_STA = 0; //捕获标志位清零

TIM_OC4PolarityConfig(TIM3, TIM_ICPolarity_Rising); //设置为上升沿捕获  

}

else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值

{

TIM3CH4_CAPTURE_UPVAL = TIM_GetCapture4(TIM3); //获取上升沿数据

TIM3CH4_CAPTURE_STA |= 0X40; //标记已捕获到上升沿

TIM_OC4PolarityConfig(TIM3, TIM_ICPolarity_Falling);//设置为下降沿捕获

}

}

}



}




      3. TIM2,TIM5是32 位的!!


      4. TIM2-5,TIM9-14普通定时器;TIM1/TIM8高级定时器。





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于AT91M42800A的LED显示系统设计