配置cubemx并利用输入捕获,使用一个比较寄存器CCR1实现对脉冲的频率和占空比测量

上一篇使用两个比较寄存器来测量信号频率和占空比,这次使用一个比较寄存器来实现该功能。目前只能测量一次,并不能循环测量。这里推荐使用一个按键来复位定时器,就可以实现多次测量。这里使用TIM2_CH1作为信号输入端。到这个文章为止都是属于数字频率计的范围,等之后会出文章关于利用adc和快速傅里叶变换(FFT)来实现测频。

原理部分:与上一篇类似,只是在一个通道内触发多次中断,并改变中断触发方式,就可以测量高(低)电平时钟脉冲总数。

cubemx配置如下:

 

 

代码部分分析:

各种初始化:

HAL_TIM_PWM_Init(&htim3);																						//PWM生成初始化
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
	
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);												 //开启TIM2通道1中断

while(1)循环中,flag为进入中断的次数,每进一次中断即有一种边沿被触发进入中断,并在每次进入中断时读取脉冲数,默认第一次触发为上升沿触发,在cubemx中TIM2配置中设置。

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		__HAL_TIM_SET_AUTORELOAD(&htim3, duty-1);				//设置频率
		__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, duty/2);  //设置占空比
		
		
		if(flag==1)
		{
			first=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
		}else if(flag==2)
		{
			
			second=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
			pul_high=second-first;										//信号高电平时钟脉冲数量
		}else if(flag==3)
		{
			
			third=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
			pul_num=third-first;											//1个周期信号时钟脉冲数量
		}
		
		
		d=100*(float)pul_high/pul_num;                              //计算占空比
		pul_frq = 80000000 /pul_num;						 //计算频率
		
		if(KEY_Scan(0)==1)
		{
			//HAL_TIM_Base_Start_IT(&htim2);//tim2开始中断
			duty+=100;
			if(duty>2000)
				duty=100;
			
		}
		
  }

中断回调函数中,当触发三次后便停止通道1的输入捕获中断。

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
			if(htim==&htim2)     //查询更新事件中断是否产生
			{
				flag++ ;//溢出次数加一
				if(flag==4)
				{
					
					flag=0;
					HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1);
				}
			}
			
			
}

结果测试:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值