根据Atmega328的数据表,可以通过将WGM02:00设置为011或111来选择 Timer0 快速PWM模式。 当我们使用111设置快速PWM模式时,TOP上设置TOV标志。 TOP也等于OCR0A。现在使用OCRA控制PWM的导通时间。发生比较匹配时,清除OCA0(COM0A1:COM0A0 = 10)并将其设置在底部。 现在我的问题是,如果TCNT在达到TOP后清除(这只是OCR0A),我们如何在WGM02:00 = 111时改变时间?我从数据表中不太清楚。即使波形也很容易混淆。或者,在这种情况下,无论TOV标志如何,TCNT始终从0x00到0xff进行计数?
答案 0 :(得分:1)
由于正在使用OCRA,您必须使用其他OC寄存器,例如OCRB。 OCA仍然会遵循COM0A给出的指示,但对此没那么有用。
答案 1 :(得分:0)
使用输出比较单元寄存器(OCR0A)定义计数器的最高值(WGM02:WGM00 = 111)时,只能在TCNT0与放大器之间的比较匹配时切换相应引脚(OCA0)的逻辑电平。 ; OCRA0发生。因此,您无法控制占空比(始终为50%)。这与ctc模式类似,只是在快速PWM模式下启用输出比较单元的双缓冲功能。请查看数据表,快速PWM模式描述的最后一段:
快速PWM模式下的频率(占空比为50%)波形输出可以 通过设置OC0x来切换每个逻辑电平来实现 比较匹配(COM0x1:0 = 1)。生成的波形将具有 当OCR0A设置为零时,f Ox0 = f clk_I / O / 2的最大频率。 此功能类似于CTC模式下的OC0A切换,除了 输出比较单元的双缓冲功能在 快速PWM模式。
但是,您可以使用定时器1来控制频率和占空比,通过设置输入捕捉单元寄存器(ICR1)来定义计数器的TOP值,然后输出比较单元寄存器(OCR1A)将是当比较匹配发生时,可以自由地使相应的引脚(OC1A)采取动作(设置或clr)。