举个例子,这个例子真实存在于51机上。
有对光耦电用于检测流水线上工件通过(不检测方向),平时无遮挡时,检测引脚为低电平,有遮挡时为高电平。
领导脑子抽抽,提出个要求,检测下工件是横放还是竖放(不讨论有什么意义)
我们的方案是:流水线速度是恒定的,只要检测工件遮挡光耦时长,就能判断工件长度,进而推算出横放或竖放。
程序流程如下:
检测引脚上升沿产生中断,开启一个1mS的定时器。
定时器中断里:
if(检测引脚为高)
计数器累加
else
关闭定时器,置检测完成标志。
主程序检测到完成标志,取计数器值。该值就是工件通过时长(1mS为单位)
这个应用实际上就是高级单片机里的定时器捕获功能。
STM32单片机里,我们给定时器一个预分频值(相当于前面例子开的1mS定时器),然后再给它一个装载值。指定检测上升沿还是下降沿。最后启动捕获。
然后有两个结果
一是产生捕获中断,读取捕获值。该值乘以预分频时间,就是从启动到捕获的时长。
二是产生举出中断。表示长时间没有捕获到引脚跳变。
要注意的是预分频,频率越高,检测精度越高。但负面影响是,产生溢出的时间短。
所以预分频值要结合实际情况选择。