Ich kann derzeit vier PWM-Pins mit dem folgenden Code auf ungefähr 31 kHz einstellen:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
Ich habe dieses Setup irgendwo gefunden, weiß aber nicht, wie ich diese vier PWM-Pins stattdessen auf etwa 25 kHz einstellen kann. Wie ist das möglich?
Antworten:
Ich poste diese zweite Antwort, da mir klar wurde, dass es möglich ist, 4 PWM-Kanäle bei 25 kHz mit 161 Schritten auf einem einzelnen Arduino Uno zu haben. Dies beinhaltet das Ändern der Haupttaktfrequenz auf 8 MHz , was einige Nebenwirkungen hat, da das gesamte Programm halb so schnell läuft. Es beinhaltet auch die drei Zeitgeber neu zu konfigurieren, das heißt , die Zeitfunktionen Arduino verlieren (
millis()
,micros()
,delay()
unddelayMicroseconds()
). Wenn diese Kompromisse akzeptabel sind, gehen Sie wie folgt vor:Im Gegensatz zur anderen Antwort ist hierfür keine modifizierte Version erforderlich
analogWrite()
: Die Standardversion funktioniert einwandfrei. Es ist nur darauf zu achten, dass:analogWrite()
die Pins 6 oder 11 zu erreichen, liefert nicht nur keinen PWM-Ausgang, sondern ändert auch die Frequenz an Pin 5 bzw. 3.quelle
Sie können Timer 1 so konfigurieren, dass er im phasenkorrekten PWM-Modus mit 25 kHz läuft, und die beiden Ausgänge an den Pins 9 und 10 wie folgt verwenden:
Wenn Sie einen Wert von 0 mit schreiben
analogWrite25k()
, ist der Pin immer LOW, während 320 immer HIGH bedeutet. Der RegularanalogWrite()
sollte fast funktionieren, aber er interpretiert 255 genauso wie 320 (dh immer HIGH).Dieser Code setzt ein Arduino Uno oder ein ähnliches Board (ATmega168 oder 328 @ 16 MHz) voraus. Die hier verwendete Methode erfordert einen 16-Bit-Timer und verwendet daher Timer 1, da dies der einzige auf dem Uno verfügbare ist. Deshalb stehen nur zwei Ausgänge zur Verfügung. Das Verfahren könnte mit einem 16-Bit-Timer an andere AVR-basierte Karten angepasst werden. Wie Gerben bemerkte, sollte dieser Timer ein entsprechendes ICRx-Register haben. Auf dem Arduino Mega gibt es 4 solcher Timer mit jeweils 3 Ausgängen.
quelle
ICRx
Register haben. Sie können höchstens einen PWM-Pin pro Timer für die Timer 0 und 2 haben.COM4C1
inTCCR4A
? 2. Wenn dies nicht das Problem ist, lesen Sie Wie stelle ich eine gute Frage? Aktualisieren Sie dann Ihre Frage, indem Sie Ihren vollständigen Quellcode einfügen und klar angeben, was Sie von dem Programm erwarten und was es stattdessen tut („Ich sehe keinen Erfolg“ wird nicht als gültige Problemstellung angesehen).