如何做一个大型网站,安装wordpress步骤,东莞同城招聘,软件开发的三个阶段上一篇博客我们提到了定时器产生PWM波#xff0c;现在#xff0c;我们尝试的想要捕获我们的PWM波#xff0c;测量它的频率#xff0c;我们应该怎么做呢#xff1f;答案还是回到我们的定时器上。
我们知道#xff0c;定时器是一个高级的秒表#xff08;参考笔者的比喻现在我们尝试的想要捕获我们的PWM波测量它的频率我们应该怎么做呢答案还是回到我们的定时器上。
我们知道定时器是一个高级的秒表参考笔者的比喻备考蓝桥杯嵌入式3产生PWM波-CSDN博客它可以根据我们的设置向主处理器发送中断所以我们的一个测量办法就是捕获其中的上升沿或者是下降沿两次上升沿的间隔就是我们的方波周期如何知道上升沿或者是下降沿到来呢答案是使用中断我们将上升沿捕获进来度量其中的CNT变化了多少这个时候我们就获得了相对于自身的频率我们的PWM方波的频率是自身工作的频率的倍数。 我们让自身的CNT为0再下一次捕获的时候得到CNT减去0就是CNT个度量的单位时间其中单位的度量时间笔者上一篇博客已经给出这里不再给定最终的结果就是 这里笔者建议进行预分频因为我们需要保证我们的计次不会击穿我们的接受CNT的值的变量范围否则就会出错。
代码实战
笔者以PA7作为捕获来接受上一博客中笔者设置的PA1引脚产生的PWM波形。办法是配置PA7为输入捕获模式且设置分频为80。 其他的部分可以不设置。我们采取的是上升沿的捕获记得使能一下定时器的中断我们生成MDK5工程下一步就是我们来看看如何完成软件的部分。
显然我们的时钟输入捕获需要按照使能中断的方式进行开启
HAL_TIM_IC_Start_IT(htim17, TIM_CHANNEL_1);
重要的是我们需要捕获我们的上升沿其回调函数是
uint32_t frequency, capture_value;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim-Instance TIM17){capture_value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);TIM17-CNT 0;frequency HAL_RCC_GetSysClockFreq()/((htim-Init.Prescaler 1) * capture_value);}
}
我们按照管理获取我们的捕获值当然如果要追求迅速可以直接将htim-Instance-CCR1抓出来赋值来进行加速。笔者的建议是不要这样除非有明显的效率提升否则可读性不好。
我们在主循环中调用一个时时刻刻进行刷新的display函数
char value[20];
void display_current_captured_freq(void)
{snprintf(value, 20, frequency:%d, frequency);lcd_middledisplay(Line0, value);
}
关于LCD的使用和笔者进行的小幅度的修改参考笔者的博客备考蓝桥杯嵌入式2使用LCD完成显示-CSDN博客
现在我们将PA7和PA1使用杜邦线或者是导线连接。再将我们的代码上传上去。笔者采用的是1000HZ的PWM方波这里的显示稍有误差