AVR-PWM-Timer-Frequenz

Ich lerne, wie man einen Attiny84 benutzt. Ich habe ein schnelles PWM-Signal erzeugt. Ich habe es geschafft zu verstehen, wie das geht:

#include <avr/io.h>

int main(void)
{
  // setup timer0
  TCCR0B |= _BV(CS00);  // use clk_i/O without prescalers as clock source.
                        // also enables TIMER0

  // set fast PWM mode
  TCCR0A |= _BV(WGM01) | _BV(WGM00);  // Mode 3
  TCCR0A |= _BV(COM0A1) | _BV(COM0A0);  // set OC0A on compare match, clear on BOTTOM

  OCR0A = 0xff / 2;  // 50% PWM

  // set PB2 as output. This should enable OC0A
  DDRB |= _BV(PB2);

  for (;;) {
  }
}

Ich verstehe jedoch nicht, warum ich nur ~ 30 kHz auf dem Oszilloskop habe. Ich habe die CKDIV8-Sicherung deaktiviert und meinen CKSEL auf "Calibrated Internal RC Oscillator 8MHz" gesetzt.

Ich dachte, ich könnte mindestens 8 MHz PWM-Frequenz haben. Ich kann in der Dokumentation nicht finden, wie clk_i/o und clk_cpu zusammenhängen. Gibt es eine Möglichkeit, eine höhere PWM-Frequenz zu erreichen?

NB: Ich brauche keine bestimmte PWM-Frequenz, ich teste nur den Chip und versuche, seine Grenzen zu verstehen.

Antworten (1)

Sie haben einen 8-MHz-Takt, aber 8-Bit-PWM. Daraus ergibt sich eine Ausgangsfrequenz von 8MHz/256=31,25kHz. Wenn Sie eine höhere Ausgangsfrequenz benötigen, können Sie stattdessen Modus 7 verwenden, auf Kosten der PWM-Signaltiefe.