打印
[Atmel]

Atmega16 16位定时器的快速PWM模式 疑问

[复制链接]
1483|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
ddllxxrr| | 2014-7-4 19:20 | 只看该作者
本帖最后由 ddllxxrr 于 2014-7-4 20:27 编辑

1) 这里OCR1A和OCR1x是否是同一个?
这个不一定,还有一个OCR1B
给你个图你就明白了,应该:

2) 如果是同一个 那什么时候改变top值,什么时候产生比较?


计数器计到计数序列的最大值时即达到TOP。TOP 值可以为固定值0x00FF、
0x01FF或 0x03FF,或是存储于寄存器 OCR1A或ICR1里的数值,具体有赖于工作
模式

当T/C 工作在12 种PWM 模式种的任意一种时, OCR1x 寄存器为双缓冲寄存器;而在
正常工作模式和匹配时清零模式(CTC) 双缓冲功能是禁止的。双缓冲可以实现OCR1x 寄
存器对TOP 或BOTTOM 的同步更新,防止产生不对称的PWM 波形,消除毛刺。
访问OCR1x 寄存器看起来很复杂,其实不然。使能双缓冲功能时,CPU 访问的是OCR1x
缓冲寄存器;禁止双缓冲功能时CPU 访问的则是OCR1x 本身。OCR1x( 缓冲或比较)
寄存器的内容只有写操作才能将其改变(T/C 不会自动将此寄存器更新为TCNT1 或ICR1
的内容),所以OCR1x 不用通过TEMP 读取。但是象其他16 位寄存器一样首先读取低
字节是一个好习惯。由于比较是连续进行的,因此在写OCR1x 时必须通过TEMP 寄存器
来实现。首先需要写入的是高字节OCR1xH。当CPU 将数据写入高字节的I/O 地址时,
TEMP 寄存器的内容即得到更新。接下来写低字节OCR1xL。在此同时,位于TEMP 寄存
器的高字节数据被拷贝到OCR1x 缓冲器,或是OCR1x 比较寄存器。

上边明确答了,在写入的时候,就开始记数。直到记值到TOP值。再在中断里写OCR1x ,就是TOP值。

s






使用特权

评论回复
板凳
SaberLion|  楼主 | 2014-7-4 20:58 | 只看该作者
ddllxxrr 发表于 2014-7-4 19:20
1) 这里OCR1A和OCR1x是否是同一个?
这个不一定,还有一个OCR1B
给你个图你就明白了,应该:

上边明确答了,在写入的时候,就开始记数。直到记值到TOP值。再在中断里写OCR1x ,就是TOP值。

也就是说溢出中断的时候,在这个中断函数中改变top值?
那和TCNT1匹配的值不是也被改变了么?

使用特权

评论回复
地板
ddllxxrr| | 2014-7-5 05:37 | 只看该作者
SaberLion 发表于 2014-7-4 20:58
上边明确答了,在写入的时候,就开始记数。直到记值到TOP值。再在中断里写OCR1x ,就是TOP值。

也就是说 ...

改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值。否则TCNT1与OCR1x
不会出现比较匹配。使用固定的TOP 值时,向任意OCR1x 寄存器写入数据时未使用的
位将屏蔽为"0”。
定义TOP 值时更新ICR1 与OCR1A 的步骤时不同的。 ICR1 寄存器不是双缓冲寄存器。
这意味着当计数器以无预分频器或很低的预分频工作的时候,给ICR1 赋予一个小的数值
时存在着新写入的ICR1 数值比TCNT1 当前值小的危险。结果是计数器将丢失一次比较
匹配。在下一次比较匹配发生之前,计数器不得不先计数到最大值0xFFFF,然后再从
0x0000 开始计数,直到比较匹配出现。而 OCR1A 寄存器则是双缓冲寄存器。这一特性决
定OCR1A 可以随时写入。写入的数据被放入OCR1A 缓冲寄存器。在TCNT1 与TOP 匹配后的
下一个时钟周期,OCR1A 比较寄存器的内容被缓冲寄存器的数据所更新。在同一
个时钟周期TCNT1 被清零,而TOV1 标志被设置。
使用固定TOP 值时最好使用ICR1 寄存器定义TOP。这样OCR1A 就可以用于在OC1A
输出PWM 波。但是,如果PWM 基频不断变化( 通过改变TOP 值), OCR1A 的双缓冲
特性使其更适合于这个应用。

使用特权

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

本版积分规则

18

主题

59

帖子

1

粉丝