PWM输入捕获(只使用一路定时器通道)

前言

上一篇文章介绍了使用《STM32参考手册》上 PWM 输入模式捕获的 PWM 波,这种方法简单且准确,但是它占用的资源太多了,因为它使用定时器的两个通道,且这两个通道映射在一个通道上,同时配置一路捕获为触发定时器复位,所以只能使用通道1,2来捕获。

所以这种方式,捕获一个 PWM 波就占用了一个定时器的资源。虽然也实现了捕获 PWM 的功能,但是代价也太大了,且很难同时捕获多个 PWM ,那有没有更好的方法呢?

本文介绍了另一种捕获 PWM 的方法,只使用任何一路定时器的输入捕获,就可以测 PWM 的频率和占空比。

一、捕获PWM原理

                                               图1 两路输入捕获 PWM 波形

上一篇文章使用的就是这个原理,利用两路输入捕获上升沿和下降沿,就能很简单的测出 PWM 频率和占空比。

                                        图2 一路输入捕获 PWM 波形

分析图2,图中,最开始捕获上升沿,在上升沿到来后开始捕获,然后转为捕获下降沿,捕获接下来的两个下降沿,依据两个下降沿之间计数的差值即可计算出 PWM 的总脉宽,从而计算出 PWM 频率,然后由第一个下降沿的计数值可以计算得出 PWM 高电平的脉宽,即可计算出 PWM 的占空比。

有的人可能会问,那我为什么不可以以上升沿开始捕获,然后连续捕获下降沿和下一个上升沿呢?

理论上这样是绝对没问题的,但是你想过没有,既然可以这样,那么 《STM32参考手册》上为什么要用两路输入捕获来测PWM?问题就在于 PWM 的占空比以及频率。当 PWM 频率很快的时候,上升沿和下降沿切换的速度很快,而用一路输入捕获在很短的时间内切换捕获上升沿以及下降沿,很可能导致上升沿或者下降沿没捕捉到的情况。

就比如 PWM 高电平的时间很短,你刚捕获到上升沿,然后切换捕捉下降沿,结果 PWM 的下降沿已经过去了。

使用我的方法测 PWM 波的时候,从图2 可以看到,至少两个下降沿的捕获是不会有问题的,也就是说,PWM 频率的测量是不会出错的。而在从捕获上升沿到切换捕获下降沿的时候,上述捕获不到的问题依然可能发生,那为什么我的方法就可以而其他方法就不行呢。原因就在于,上面已经提到过,我的方法 PWM 脉宽测量是没问题的,那么我就可以比较第一个下降沿时的计数值 CNT1 和 CNT2 (PWM 脉宽的计数值),如果 CNT1 大,那表示遗漏了一个下降沿,那么高电平的计数值为 CNT1 - CNT2 ,反之高电平的计数值为 CNT1 。

                                              图3 使用1路捕获的结果实测

一路输入捕获的配置比两路的配置简单,就是普通的输入捕获。

具体的代码这里就不贴出来了,可以去参考我上一篇文章。这里把关键的捕获中断服务函数贴出来:

代码如下:

u8  TIM5CH1_CAPTURE_STA=0;	//输入捕获状态
static u16 TIM5CH1_CNTTIME=0;
u32	TIM5CH1_CAPTURE_VAL=0;	//输入捕获值
u32 TIM5CH1_CAPTURE_HIGHVAL=0;
 
//定时器5中断服务程序	 
void TIM5_IRQHandler(void)
{
 	if(!(TIM5CH1_CAPTURE_STA&0X80))//还未成功捕获	
	{
		if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
		{
			if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
			{
				TIM5CH1_CAPTURE_VAL+=65536;
			}
			TIM_ClearITPendingBit(TIM5, TIM_IT_Update); //清除中断标志位
		}
		if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
		{
			if(TIM5CH1_CAPTURE_STA&0x20)           //捕获到第二个下降沿 		
			{
				TIM5CH1_CAPTURE_STA|=0X80;
				TIM5CH1_CAPTURE_VAL+=TIM5->CCR1-TIM5CH1_CNTTIME-TIM5CH1_CAPTURE_HIGHVAL;
				if(TIM5CH1_CAPTURE_HIGHVAL>TIM5CH1_CAPTURE_VAL)
					TIM5CH1_CAPTURE_HIGHVAL-=TIM5CH1_CAPTURE_VAL;
				else if(TIM5CH1_CAPTURE_HIGHVAL==TIM5CH1_CAPTURE_VAL)
					TIM5CH1_CAPTURE_HIGHVAL=0;
				TIM5->CCER &= ~(1<<1);         //CC1P=0 设置为上升沿捕获
			}else if(TIM5CH1_CAPTURE_STA&0X40)		//捕获到第一个下降沿 		
			{
				TIM5CH1_CAPTURE_STA|=0X20;		//标记成功捕获到一次下降沿
				TIM5CH1_CAPTURE_HIGHVAL=TIM5CH1_CAPTURE_VAL+TIM5->CCR1-TIM5CH1_CNTTIME;
			}else                  					//还未开始,第一次捕获上升沿
			{
				TIM5CH1_CNTTIME=TIM5->CCR1;
				TIM5CH1_CAPTURE_VAL=0;
				TIM5CH1_CAPTURE_STA|=0X40;		//标记捕获到了上升沿
				TIM5->CCER |= (1<<1);            //CC1P=1 设置为下降沿捕获
			}
			TIM5->SR&=0xfffd;
//			TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中断标志位
		}
 	}
	else
		TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
 

 


总结

本文介绍了一种只需一路输入捕获即可精确的测量 PWM 频率和占空比的方法,测试精度与定时器的频率有关。

由于是刚写文章不久,如有问题,欢迎指正!

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值