STM32一个定时器同时捕获4路PWM波

问题的提出:

最近需要用航模遥控器控制遥控车,32单片机做主控,需要用到4个通道即需要捕获4路PWM波。如果用四个定时器来捕获四路PWM波,就太浪费资源了。由于STM32单片机的定时器资源有限,故设想用一个定时器的4个通道同时捕获四路PWM波。

设计思路:

由于接收机输出的PWM波高电平最多就2ms,故可以让4个通道轮流使用定时器捕获PWM波

程序如下:

include "PWMin.h"
void TIM2_2PWMin_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFFF0000;
GPIOA->CRL|=0X00008888;
TIM2->ARR=arr;
TIM2->PSC=psc;
TIM2->CCMR1=0X0101;
TIM2->CCMR2=0X0101;
TIM2->CCER|=0X0001;
TIM2->DIER|=0X001f;
TIM2->CR1|=0x01;
MY_NVIC_Init(2,0,TIM2_IRQn,2);
}
u16 pwm1=1,pwm2=2,pwm3=2,pwm4=3;
u8 t1=0,t2=0,t3=0,t4=0;
u8 f=1;
void TIM2_IRQHandler(void)
{
u16 TSR;
TSR=TIM2->SR;
if(TSR&(1<<1))
{
if(t1==0)
{
t1=1;
TIM2->CCER|=1<<1;
TIM2->CNT=0;
}
else
{
t1=0;
pwm1=TIM2->CCR1;
TIM2->CCER&=~(3<<0);
f=2;
}
}
else if(TSR&(1<<2))
{
if(t2==0)
{
t2=1;
TIM2->CCER|=1<<5;
TIM2->CNT=0;
}
else
{
t2=0;
pwm2=TIM2->CCR2;
TIM2->CCER&=~(3<<4);
f=3;
}
}
else if(TSR&(1<<3))
{
if(t3==0)
{
t3=1;
TIM2->CCER|=1<<9;
TIM2->CNT=0;
}
else
{
t3=0;
pwm3=TIM2->CCR3;
TIM2->CCER&=~(3<<8);
f=4;
}
}
else if(TSR&(1<<4))
{
if(t4==0)
{
t4=1;
TIM2->CCER|=1<<13;
TIM2->CNT=0;
}
else
{
t4=0;
pwm4=TIM2->CCR4;
TIM2->CCER&=~(3<<12);
f=1;
}
}
else if(TSR&(1<<0))
{
TIM2->CCER&=~(1<<((f-1)*4));
if(f==1)
pwm1=0xffff;
else if(f==2)
pwm2=0xffff;
else if(f==3)
pwm3=0xffff;
else if(f==4)
pwm4=0xffff;
f++;
}
TIM2->CCER|=1<<((f-1)*4);
TIM2->CNT=0;
TIM2->SR=0;
}

你可能感兴趣的:(STM32)