打印
[定时器计数器]

用定时器测量PWM波

[复制链接]
3008|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linxuedao|  楼主 | 2016-10-19 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 linxuedao 于 2016-10-22 12:50 编辑

PWM输入连接在普通的IO口上

不使用定时器的输入捕获功能

PWM频率为50HZ,高电平时间为1-2ms

多路输入,多达14路,全部连接在普通IO口上

请问如何通过定时器来实现多路PWM的实时测量(多路不断变化),要求精度1US 晶振16M 单片机为ATMEGA328
如果有好的方案,和思路,能够实现的可适当有偿求助


目前我的思路是这样的 而且试验过测量一路是可行的 多路还没试验 但是一路有个问题 我在这里跟大家说明一下

PWM信号接在 单片机的 PCINT引脚 就是电平改变中断引脚 开启电平改变中断

一个8位定时器初始化为普通计数模式0-255  TCNT2 (使用的是定时器2)

然后定时器使能溢出中断,在溢出中断中将倍数标志pwm_in_time_multiple +1,

在引脚变化中断中 先判断引脚是高还是低 ,如果引脚是低变为高 就表示高电平来临 在中断中 记录 TCNT2的数值定义变量为(pwm_in_time_start),清零 pwm_in_time_multiple 然后退出中断

在下次进入中断中,判断引脚是否是低,如果是低表示 搞定平结束,中断中记录 TCNT2的数值,定义的变量为(pwm_in_time_stop),然后在记录 定时器2溢出中断中的 倍数值pwm_in_time_multiple,然后退出中断

在主程序中计算 高电平的时间: ((256-pwm_in_start)+(256*pwm_in_time_multiple-1)+pwm_in_time_stop)*0.0625  这样计算高电平的时间 *0.0625是因为定时器没有预分频 使用的是16M晶振 所以一次计数就是0.0625US

这样计算的结果就是 高电平时间 连续测量中会在一定的间隔中有一次错误,会少一个256次  应该是 pwm_in_time_multiple这个变量的问题

如果说进入中断先把TCNT2清零 然后开始计数 就不会有这个问题

想问下大家看明白了吗 想问下 如何避免这个错误的值出现

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝