AVR(调试)PWM生成

时间:2017-10-06 05:53:56

标签: c embedded avr

我写了一个简单的程序来生成占空比为50%的PWM波。然后我去AtmelStudio进行调试。除OCR0之外的所有寄存器都分配了各自的值。为什么OCR0没有分配任何值。 ATmega32,快速PWM。

#include <avr/io.h>
int main(void)
{
DDRB = (1 << PB3);
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01);
OCR0 = 127;
TCCR0 |= (1 << CS02);
return 0;
}

1 个答案:

答案 0 :(得分:1)

无论如何。

你正在使用Atmega32上的8位counter0。我们来看看你如何设置它:

// Set Pin B3 as output, others as input
DDRB = (1 << PB3);

// Set Clear on compare match + Fast PWM mode + Counter stopped
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01);

// Set comparator value to 127
OCR0 = 127;

// Enable clkIO/256 from prescaler, turning on the counter
TCCR0 |= (1 << CS02);

好。首先,一些事情:

  • 在初始设置时,您通常希望分配值而不是或它,以确定其状态。
  • 即使之后,设置它而不是它,也可以避免无用的读取。对此寄存器的行为没有影响,但可能会对性能有所改善。
  • 文档建议仅在正确设置后启用输出,以避免虚假输出。所以你应该最后一行移动。

我将从数据表的that version开始阅读。

现在,在快速PWM模式下,根据表38和40,计数器的行为如下:

  • 从BOTTOM到MAX(0到0xFF)计数。
  • OCR0仅用于切换OC0引脚,不用于重置计数。
  • OCR0具有双缓冲功能。它的实际值直到下一个周期才会更新。

这可能是你的问题。如果其中任何一个是真的:

  • 计数器无法正常启动(如果CS2-0由于或不正确而导致CS2-0不正确,可能会发生这种情况。)
  • 计数器提前停止(因为你的程序结束了,如果工作室检测到它,它可能会在那时禁用它 - 我不能使用工作室,所以我无法真正说出来。)

然后,您写入双缓冲区的值可能永远不会进入实际寄存器。数据表没有详细说明如何处理。它也不会告诉双缓冲激活时读取OCR0是否返回当前值或等待值。