TIM1输入捕获模式测量脉冲宽度和频率 和 PWM输入模式的使用
手里有一块传感器芯片,输出的信号是PWM脉冲信号, 输出频率不变,信号通过改变脉宽来输出.
需要检测的是位于高电平的脉冲宽度,由于频率不变,使用起来就简便很多.
下面是stm32cubemx针对stm32F407discovery板检测脉宽的配置,
首先是时钟配置,这里我利用先前帖子中的生成的usbhid的那个配置,这样就可以将计算好的脉宽通过hid端口输出到上位机
这里我用到了TIM1端口做检测输入口.可以看到下图中TIM1的时钟为96MHZ
配置定时器的输入捕获引脚,这里使用了channel1
配置TIM的参数,分频为24 ,这样采样的频率就是96M/24=4M = 0.25us,重载计数值我设定为40000,一次重载时间就为0.25*40000=10ms ,这里我说下为什么设定为10ms, 因为我用的这个传感器输出频率是固定的周期是4096us=4.096ms
这里我让计数器值大于这个值使他不至于每次输出脉冲都需要重载计数值,利于后面对脉宽的计算.
另外,因为我要测量高电平的脉宽,所以需要开启双边缘捕获,选择Both Edge.
二楼继续.
11 个回复
admin
赞同来自:
大家看到最下方有个滤波系数我设定的是3,意思是说滤除掉最多在3个内部时钟周期内的抖动.
设定,捕获所用的IO口速度最大.因为我传感器输出的是高低电平的脉冲,驱动能力很强,所以我选择OD模式,并且不使用内部上下拉
用到捕获那么就需要开启捕获中断,
然后我们在去中断表里调整下中断优先级.这里我捕获的频率高,所以我设定捕获的优先级最大,
好了,配置结束,编译生成代码,打开工程.
三楼继续.
admin
赞同来自: HeartBeaTs
开始编写代码:
因为我需要获取上升沿和下降沿的捕获值, 然后将两个值相减得出高电平的脉冲宽度,所以我需要定义三个变量
注意,这里定义的是32位,因为获取的捕获值是32位输出,下面还会有介绍.
然后找到main()函数,在这个函数里面添加开启输入捕获的指令
我们开启了之后,怎么使用呢?当然是利用中断回调.
然后我们就可以在usbhid的回调中发送这个 脉冲宽度值到上位机了.
另记:
可能有些人会问: 上面代码为什么要那样减?
我们在定时器tim1的里面设置了重载值,当按照分频之后的步长时间计数到了这个重载值,就会产生重载事件,这个事件会自动的重新把计数值从零开始计数, 这样 就类似一个 环形缓冲区 了,所以,如果第二次捕获在第一次之后,那就说明两个捕获之间产生了一个重载事件,所以........
ok,这次测试记录结束!
本站原创 原则上禁止转帖, 如果非要转载,请一定附上本站的地址!!! 大家都原创不易,谢谢!
附录一张测试时的上位机图片.
admin
赞同来自: jei8566
忘记记录一个东西了:
上面得到计算好的脉冲宽度值uwDiffCapture 之后,
怎么才能知道真实的脉宽呢?
上面说了,定时器分频之后的频率是0.25
所以,吧这个得到的值乘以0.25就可以了.
真实脉冲宽度 = 0.25 * uwDiffCapture
admin
赞同来自: 追wind少年 、一线彩虹 、smdzjl007 、hanbing333444 、Sokit2 、陪你在坑里看动漫 、hdsxjtu更多 »
继续研究:
看数据手册上有这么一个PWM输入模式的介绍
考虑如果利用这个特性,也许能更好的节省外部脉宽的计算时间(可以通过CCR2一次性的读取到取得的高电平的脉冲宽度)
下面配置pwm输入模式:
配置管脚和功能模式:
其他的配置和上面介绍的输入捕获模式一致...
然后生成代码:
在main.c文件中,添加打开通道CH2的中断,记得将原来写的那些注释掉不使用.
为什么不开启ch1的PWM通道捕获?
因为我只需要取得高电平脉宽,占空比啥的我不需要,如果你需要就同时开启CH1的通道
紧接着,将tim的callback注释掉原来的代码,改为:
测试效果和上面的输入捕获一致!!!
本次结束.
安静静的美美男
赞同来自: 蓝天映海洋
Licall郑
赞同来自: hdsxjtu
赞!
shuaige0908
赞同来自:
GOOD
陪你在坑里看动漫
赞同来自:
最后的才是正解。感谢分享。
xueding_edemao
赞同来自: hdsxjtu
您好,我想请教一下为什么STM32F103在配置定时器双边沿触发是只有上升沿或下降沿没有双边沿选项呀
hdsxjtu
赞同来自:
103不支持
小pp的烂借口
赞同来自:
假如我有16个独立的脉冲要检,是不是就不能用两个通道检上升沿和下降沿的方式,因为难免会通道重复