Ich habe einen Arduino Nano als PWM-Controller für ein Heizelement verwendet.
Ich verwende derzeit D11 (PB3). Ich könnte ändern, obwohl alle Pins mit PWM verwendet werden, und würde ein erneutes Schreiben und Verdrahten erfordern.
Dies erzeugt ein Signal mit ~ 490 Hz, aber ich würde gerne damit experimentieren, dies zu ändern eine höhere Frequenz.
Ich nehme an, es ist möglich, die Frequenz zu ändern, indem der Divisor von seinem Standardwert 64 geändert wird.
In meiner Skizze wird Verwendet http://playground.arduino.cc/Main/SevenSegmentLibrary und ruft millis () auf – wirkt sich eine Änderung des PWM-Divisors auf beide aus?
HINWEIS Ich habe die Dokumentation setPwmFrequency
gelesen, finde jedoch, dass „den normalen Betrieb stört“ nicht hilfreich – ich bin tatsächlich nach einer Erklärung des konkreten Effekts. Ich verwende nur millis()
, um die Zeit zu drücken und eine LED zu blinken, die nicht zeitkritisch ist.
Bitte beachten Sie, dass sich durch Ändern der PWM-Frequenz die ändert Atmegas Timer und Störungen des normalen Betriebs vieler Funktionen, die auf Zeit (delay (), millis (), Servobibliothek) beruhen.
Ich habe einige weitere Studien durchgeführt. http://playground.arduino.cc/Code/PwmFrequency Zustände Änderungen an den Pins 3, 5, 6 oder 11 können die Verzögerung () und Millis () verursachen. ) Funktionen, um die Arbeit zu beenden.
Andere Referenzen sagen 3, 11 verwenden timer 2
also Sie wirken sich auf millis()
oder nicht aus, da andere Referenzen behaupten, dass timer 0
für diese verwendet wird.
Kommentare
- Ja und Nein, abhängig vom verwendeten PWM-Timer.
Antwort
Ich weiß nicht, woher diese Fehlinformationen stammen … Die Antwort lautet no Bei der Neukonfiguration von Timer 2 wird nicht beeinflussen millis()
noch delay()
, da diese Funktionen auf Timer 0 basieren. AFAIK Der Arduino-Kern verwendet Timer 2 überhaupt nicht. Beachten Sie jedoch, dass es möglicherweise andere Arduino-Bibliotheken oder Bibliotheken von Drittanbietern gibt, die auf Timer 2 basieren.
Hier sehen Sie den -Quellcode von und delay()
.
Wie MITU RAJ in seiner Antwort korrekt angibt, wird das PWM-Signal an Pin 11 von bereitgestellt Timer 2, damit Sie ihn sicher verwenden können.
Kommentare
- Die Fehlinformationen stammen vom Spielplatz .arduino.cc / Code / PwmFrequency . Ich bin sicher, dass ich nicht der einzige Benutzer bin, der irregeführt wurde. Die andere Antwort hat gerade einen Auszug aus der irreführenden Dokumentation veröffentlicht.
Antwort
Die Antwort lautet NO Das Ändern des PWM-Teilers für Pin 11 hat keine Auswirkungen auf die Funktion millis()
(noch delay()
).
Erläuterung:
Der Arduino Nano verwendet den ATMega328P-Mikrocontroller, genau wie der Arduino Uno . P. >
Die PWM von Pin 11 wird von Timer 2 gesteuert. Standardmäßig hat Timer 2 eine Vorskala von 64 (dh Einstellung 0x04). Die Grundfrequenz von Timer 2 beträgt 31372,55 Hz, was zu einer Frequenz von 490,2 Hz führt (dh. 31372.55 / 64 = 490.1961).
Andererseits der Mikrosekunden-Timer (dh der von millis()
, micros()
, delay()
und delayMicroseconds()
) werden vom Timer 0 gesteuert.
Also Das Ändern des Vorteilers von Timer 2 wirkt sich nicht auf millis()
aus.
Es ändert jedoch die PWM-Frequenz von Pin 3.
Zurück zu Ihrer Frage:
Die möglichen PWM-Frequenzen von Pin 11 (höher als 488 Hz) sind:
31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz
Wobei 32, 8, 1 der Vorteiler sind.
Was entspricht auf einen Einstellwert von 0x03, 0x02 & 0x01.
Fügen Sie diese Codezeile hinzu:
TCCR2B = TCCR2B & 0b11111000 | setting;
Wobei setting
der Wert der Einstellung für den jeweiligen Prescaler ist.
============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================
Quellcode : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
Kommentare
- Nur Nitpicking, aber … die Grundfrequenz des Timers ‚ im phasenkorrekten PWM-Modus ist F_CPU / 510 (31373 Hz), nicht F_CPU / 512: Das Zählen dauert 255 Zyklen f von 0 bis 255, dann 255 mehr, um auf Null zurück zu zählen. C.f. die Gleichung für die PWM-Frequenz im Datenblatt.
- @EdgarBonet Guter Punkt. Die Antwort wurde jetzt korrigiert.
- Wäre es möglich, einen Schritt langsamer auf 15,31 Hz abzusteigen?
Antwort
Hängt von dem Pin ab, den Sie für die PWM verwendet haben.
Die Arduino UNO / NANO-Spezifikationen sagen Folgendes aus:
Die Grundfrequenz für die Pins 3, 9, 10 und 11 beträgt 31250 Hz.
Die Grundfrequenz für die Pins 5 und 6 beträgt 62500 Hz.
Die verfügbaren Teiler an den Pins 5, 6, 9 und 10 sind: 1, 8, 64, 256 und 1024.
Die an den Pins 3 und 11 verfügbaren Teiler sind: 1, 8, 32, 64, 128, 256 und 1024.
PWM-Frequenzen sind in Stiftpaaren miteinander verbunden. Wenn einer in einem Paar geändert wird, wird auch der andere entsprechend geändert.
Die Pins 5 und 6 werden auf Timer0 gepaart.
Die Pins 9 und 10 werden auf Timer1 gepaart.
Die Pins 3 und 11 sind auf Timer2 gepaart.
Änderungen an den Pins 3, 5, 6 oder 11 können die Verzögerung verursachen () und millis () funktionieren nicht mehr. Andere zeitbezogene Funktionen können ebenfalls betroffen sein.
Kommentare
- Da Sie ‚ zitiert die Spezifikationen, wäre es ‚ schön, wenn Sie auch auf sie verlinken könnten? 🙂