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;
}

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于STM32微控制器,可以使用同一个定时器模块实现输入捕获和输出PWM功能。下面是一个简单的示例,演示了如何使用定时器2来实现这两种功能: 1. 配置定时器2为输入捕获模式: ```c // 启用定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器2配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 输入捕获配置 TIM_ICInitTypeDef TIM_ICInitStructure; 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(TIM2, &TIM_ICInitStructure); // 启用输入捕获 TIM_Cmd(TIM2, ENABLE); ``` 2. 配置定时器2为输出PWM模式: ```c // 启用定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器2配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000; // PWM周期 TIM_TimeBaseStructure.TIM_Prescaler = 71; // PWM频率 = 72MHz / (TIM_Prescaler + 1) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // PWM输出配置 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // PWM占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); // 启用PWM输出 TIM_Cmd(TIM2, ENABLE); ``` 以上代码示例将定时器2配置为输入捕获模式和输出PWM模式,并分别使用了通道1进行配置。需要根据具体的需求进行参数配置,例如PWM周期、频率、占空比等。 希望这能帮助到你!如果有任何疑问,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值