PWM mit nur 8 Bit schreiben? (Timer2)

7

Ich habe ein Problem mit der Servobibliothek.

Ich muss ein PPM-Signal lesen und ein PWM-Signal für jeden Kanal erstellen. Das Problem ist, dass PPM eine höhere Auflösung als PWM hat, daher möchte ich den 16-Bit-Timer1 zum Lesen von PPM verwenden. Die Servobibliothek, die das PWM-Signal schreibt, verwendet jedoch auch Timer1.

Ist es möglich, ein PWM-Signal mit 8 Bit / Timer2 zu erzeugen? Und hat jemand ein Beispiel oder eine Erklärung gegeben, wie das geht?

betion
quelle
1
Ja, es gibt ein Beispiel in diesem Tutorial
Putu
Verwenden Sie die Servobibliothek möglicherweise so wie sie ist, und führen Sie die PPM-Zählung mit timer2 mit etwas Überlaufbehandlung durch.
Dave X

Antworten:

1

Hier ist ein einfaches Beispiel von meiner Seite über Timer für die Verwendung von Timer 2 zur Ausgabe einer Rechteckwelle von 50 kHz:

const byte LED = 3;  // Timer 2 "B" output: OC2B

const long frequency = 50000L;  // Hz

void setup() 
 {
  pinMode (LED, OUTPUT);

  TCCR2A = bit (WGM20) | bit (WGM21) | bit (COM2B1); // fast PWM, clear OC2B on compare
  TCCR2B = bit (WGM22) | bit (CS21);         // fast PWM, prescaler of 8
  OCR2A =  ((F_CPU / 8) / frequency) - 1;    // zero relative  
  OCR2B = ((OCR2A + 1) / 2) - 1;             // 50% duty cycle
  }  // end of setup

void loop()
  {
  // do other stuff here
  }
Nick Gammon
quelle
1

Ja, die Arduino Servo-Bibliothek verwendet Timer1 (und andere, abhängig von Arduino-Karten ), um FastPWM über Software-Interrupts zu verwalten. Timer2 wird von der Funktion ton () verwendet: Seien Sie vorsichtig, wenn Sie diese Funktion verwenden.

Ein gutes Beispiel für die Verwendung von Timer2 zum Generieren von PWM ist die Infrarot-Remote-Bibliothek für Arduino . Wenn IR_USE_TIMER2 definiert ist, wird Timer2 verwendet. Der Schlüsselcode befindet sich in IRremote.cpp, wo der ISR verwaltet wird.

Caligari
quelle