garfield

巧妙利用DMA来实现脉冲累加

0
阅读(2894)

Kinetis 系列 只有 一路 LPT 模块 ,要实现 多路脉冲累加 (不进入中断服务函数,不占用 CPU 资源),难道就没方法了吗?

就目前网上公开的资料来看,貌似还没有公开实现多路脉冲累加的方法吧?都是靠 FTM 的 输入捕捉 或者 GPIO 的触发中断,在中断函数里进来累加。

其实,Kinetis 的DMA模块,是 可以实现16路 15位 的 脉冲累加。 完全可以不进入中断服务函数,由硬件进行累加。彻底解决 Kinetis单片机不能多路脉冲累加的功能 ……

可通过增加个中断来实现拓展计数位数,几乎不影响CPU……
实测 30KHz 的PWM脉冲波 ,用PIT 来 1秒定时,读取到脉冲波:30012个 ,比 LPT误差还更小……
与 LPT 相比,我们的方法是巧妙借用了 DMA 每次传输,会自动减1 的功能 (硬件实现的)而 LPT 则是一个计数器 ,两种的原理是不一样的……实测 30KHz 的PWM脉冲波 ,用PIT 来 1秒定时,读取到脉冲波:30012个 ,比 LPT误差还更小……函数接口非常方便……

DMA_count_Init 初始化……
DMA_count_get 获取计数值……
DMA_count_reset 重新计数……

Baidu
map