目录
1.pwm_in.c
#include "pwm_in.h"
void TIM3_PWM_IN(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
float TIM3_CH1_Duty=0,TIM3_CH2_Duty=0;
u8 Number=0,CH_Flag=0;
u16 ReadValue1=0,ReadValue2=0;
u16 CH1_FRQ=0,CH2_FRQ=0;
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
if(CH_Flag==1) //在1ms定时中断中,100ms改变一次CH_Flag的值
{
if(Number==0)
{
TIM_SetCounter(TIM3,0);
Number=1;
TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);
}
else if(Number==1)
{
Number=2;
TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);
ReadValue1=TIM_GetCounter(TIM3);
}
else if(Number==2)
{
Number=0;
ReadValue2=TIM_GetCounter(TIM3);
CH1_FRQ=1000000/ReadValue2;
TIM3_CH1_Duty=ReadValue1*100/ReadValue2;
}
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
if(CH_Flag==0)
{
if(Number==0)
{
TIM_SetCounter(TIM3,0);
Number=1;
TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling);
}
else if(Number==1)
{
Number=2;
TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising);
ReadValue1=TIM_GetCounter(TIM3);
}
else if(Number==2)
{
Number=0;
ReadValue2=TIM_GetCounter(TIM3);
CH2_FRQ=1000000/ReadValue2;
TIM3_CH2_Duty=ReadValue1*100/ReadValue2;
}
}
}
}
2.pwm_in.h
#ifndef __PWM_IN_H
#define __PWM_IN_H
#include "stm32f10x.h"
void TIM3_PWM_IN(void);
extern float TIM3_CH1_Duty,TIM3_CH2_Duty;
extern u8 Number,CH_Flag;
extern u16 ReadValue1,ReadValue2;
extern u16 CH1_FRQ,CH2_FRQ;
#endif /* __PWM_IN_H */
3.捕获显示与100ms切换一次捕获通道
//TIM3输入捕获通道100ms切换一次
if(TIM3_Count==100)
{
TIM3_Count=0;
CH_Flag^=1;
Number=0;
}
sprintf((char*)DisBuff,"CH1_FRQ:%05d", CH1_FRQ);
LCD_DisplayStringLine(Line5,DisBuff);
sprintf((char*)DisBuff,"CH2_FRQ:%05d", CH2_FRQ);
LCD_DisplayStringLine(Line6,DisBuff);
sprintf((char*)DisBuff,"TIM3_CH1_Duty: %.2f",TIM3_CH1_Duty);
LCD_DisplayStringLine(Line7,DisBuff);
sprintf((char*)DisBuff,"TIM3_CH2_Duty: %.2f",TIM3_CH2_Duty);
LCD_DisplayStringLine(Line8,DisBuff);