一、概念理解
PWM输入捕获模式是输入捕获模式的特例。
1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。
2. 同一个TIx输入映射了两个ICx信号。
3. 这两个ICx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM
时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)
7. 由此可以计算出PWM的时钟周期和占空比了
frequency=f(TIM时钟频率)/n。
duty cycle=(高电平计数个数/n),
若m为高电平计数个数,则duty cycle=m/n
若m为高电平计数个数,则duty cycle=(n-m)/n
注:因为计数器为16位,所以一个周期最多技术65535个,所以测得的 最小频率= TIM时钟频率/65535。
二,TIM配置
脉冲信号接入到TIM3_CH1上,定时器内部将TI1映射到IC1,IC2上,当上升沿到来时,将TIM3_CNT清零,等待下降沿到来时,将此时CNT值存入CCR1中(即为占空比),
当下一个上升沿到来时,将此时CNT存入CCR2中(脉冲周期),同时复位CNT。
static void tim3Ch1CapInit()
{
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period=65535;
TIM_TimeBaseStructure.TIM_Prescaler=35999;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ICStructInit(&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 = 0x04;
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_Cmd(TIM3, ENABLE);
}
三,获取脉冲频率
从TIM3_CCR1中获取占空比,TIM3_CCR2获取周期,此过程由CPU硬件完成
uint16_t DcMotorSpeedGet()
{
uint32_t temp;
if(!(TIM3->SR & 0x0004)){
TIM3->SR &= 0xf9f9;
return 0;
}
else
{
if(TIM3->CCR2 == 0)
{
return 0;
}
temp = (uint32_t)2826/(TIM3->CCR2);
return (uint16_t)temp;
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』