概述
上一篇使用两个比较寄存器来测量信号频率和占空比,这次使用一个比较寄存器来实现该功能。目前只能测量一次,并不能循环测量。这里推荐使用一个按键来复位定时器,就可以实现多次测量。这里使用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);
}
}
}
结果测试:
最后
以上就是复杂大船为你收集整理的配置cubemx并利用输入捕获,使用一个比较寄存器CCR1实现对脉冲的频率和占空比测量的全部内容,希望文章能够帮你解决配置cubemx并利用输入捕获,使用一个比较寄存器CCR1实现对脉冲的频率和占空比测量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复