Ich würde gern an einem Uno/Nano (ATMega328p), die Frequenz des analogWrite erzeugten PWM Signal, ändern. Es geht darum einen Motor zu treiben, der an Pin 9 hängt. Dieser Motor hätte gern ein Signal in der Nähe von 100Hz.
Also mal erkundigt, welcher Timer welche Pins steuert. Wenn ich es richtig verstanden habe, ist
Pins 5 und 6: gesteuert durch Timer 0
Pins 9 und 10: gesteuert durch Timer 1
Pins 11 und 3: gesteuert durch Timer 2
zuständig.
Die Standard Frequenz an den Pins 3, 9, 10, 11 ist 490Hz
Die Standard Frequenz an den Pins 5, 6 ist 980Hz
Ich hatte die Idee einfach den Vorteiler zu ändern. Aber jetzt kommt das Fragezeichen. Welcher Vorteiler ist den standardmäßig hinterlegt?
Wenn ich den timer1 einfach ohne Vorteiler durchlaufen lasse, habe ich nach 65535 Takten ein Überlauf. Bei 16MHz dann also 244,14… Überläufe pro Sekunde. Da die Standard Frequenz aber höher ist, muss da ja vorher ein Match auslösen. Oder denke ich falsch? Denn jeder Vorteiler würde ja die Frequenz senken.
Wie sind denn die Standardeinstellungen des Timer1, das ein analogWrite auf Pin9 490Hz erzeugt?
Ziel ist es wenn möglich analogWrite zu verwenden, um nicht das ganze alte bestehende Programm zu überarbeiten. Was nicht heißt das es nicht möglich ist.
Bin dennoch gespannt was das auslesen der Register bringt.
analogWrite ändert OCR1A, aber mit einer Sonderbehandlung vom Wert 255. Außerdem brauchst Du bei neun Bit Auflösung 511 als maximalen Wert. Das haut also nicht hin.
Wenn Du analogWrite durch analogSchreiben ersetzt, geht es einfach.
Timer0 also im Mode 3, FastPWM, Überlauf bei 0xFF (255), Vorteiler 64
Timer1 also im Mode 1, PWM, phase correct, 8-bit, Überlauf bei 0x00FF (255), Vorteiler 64
Timer2 also im Mode 1, PWM, phase correct, Überlauf bei 0xFF (255), Vorteiler 64
Moin. Bei Phase Correct PWM ist mir noch etwas unklar. Und ich finde leider nicht die Antwort.
z.B. beim Timer1 kann man einstellen, das TOP feste Werte wie 0x00FF oder 0x01FF oder 0x03FF hat (8Bit, 9Bit, 10Bit Auflösung) Beim Erreichen des dazugehörigen Wert im Compare Registers, wird der dazugehörige Pin beim hochzählen HIGH/LOW (kann man vorgeben) gesetzt, und entgegengesetzt, wenn der Wert des Compare Registers beim runterzählen erreicht wird.
Nun kann man TOP auch den Wert von dem Compare Register übergeben (Mode 11). Aber wenn TOP gleich den Compare Register ist, dann wird doch der Pin nicht mehr angesprochen. Also kann man darüber nicht einen Pin direkt HIGH/LOW setzen lassen, sondern man kann nur ein Flag beim Erreichen von TOP und BOTTOM setzen lassen. Zur direkten PWM Erzeugung auf dem PIN also nicht nutzbar? Bzw. was ist dann der Unterschied zu Fast-PWM mit einstellbaren TOP gleich Compare Register. Es wird beim Erreichen von TOP auch ein Flag gesetzt. In der gleichen Zeit wo in FastPWM wieder TOP erreicht wird, ist in PhaseCorectPWM wieder BOTTOM erreicht. Es wird also Zeitgleich ein Flag gesetzt. Wo ist also der Unterschied? Und wozu braucht man diesen Modus?
Edit:
Ich denke ich habe die Antwort auf die Frage gefunden. Man kann OCR1A als TOP nutzen und OCR1B als Trigger zum steuern von Arduino Pin 10. Ein steuern von Arduino Pin 9 ist dann aber nicht möglich.
Man kann aber auch ICR1 als TOP verwenden (Mode 10, bei Phase Correct), wenn man diesen nicht anderweitig verwendet, und somit OCR1A als Trigger für Arduino Pin 9 und OCR1B als Trigger für Arduino Pin 10. Programmierung von 16 Bit Timer auf Atmega328 - Embedds
bevor ich wieder Aufsätze tippe stelle ich diesmal Gegenfragen die du dir sicherlich beantworten kannst. Wenn es keine Unterschiede geben würde, würden die Modi nicht unterschiedliche Bezeichnungen haben. Damit sind wir beim Punkt. Der Bezeichnung der Modi sagt die Kernaufgabe der Modi aus. Stichtwort syncrones Schaltverhalten. Zusätzlich sind die Compare Register dieser Modi gepuffert. Damit werden Änderungen nie zum falschen Zeitpunkt übernommen. Deswegen bevorzuge ich diese "correct" Modi solange die Wunschfrequenz damit erreichbar ist. Bei FastPWM hat man zudem mit Compare 0 Nadelimpulse, sauberes 0,000% Duty ist so nicht möglich.
Frage hierzu. Warum muss auf == 9 abgefragt werden? Die "Variante" der Funktion wird doch nur aufgerufen, wenn sie mit bpin aufgerufen wird. Und bpin stellt doch schon sicher, dass es sich um Pin 9 handelt. Oder habe ich da ein Gedankenfehler?