Hallo zusammen, Ich möchte mit dem Arduino Uno (Atmel328UP) 2 unabhängige PWM-Signalen erzeugen, dh. die Frequenz bzw. DutyCycle soll für jedes Signal einstellbar (zB per Seriell) und unabhängig von ein anderer sein. Hat vlt. jemand schon so was ähnliches gemacht? LG
LaLo schrieb: > Uno (Atmel328UP) Was ist das? ATMega328P ? Ich bitte um mehr Sorgfalt. Der UNO hat 3 Timer mit je 2 Kanälen. Frequenz in Stufen einstellbar. (das Datenblatt gibt gerne Auskunft)
LaLo schrieb: > Hat vlt. jemand schon so was ähnliches gemacht? Sicher, Tausende. Man nehme das Datenblatt und stelle die Register per Hand ein. Beitrag "Re: Arduino Mega 11 PWM-Pins mit 1kHz"
Hallo, Danke für eure Rückmeldungen, ja da habe ich es auch gelesen (DatenBlatt) nun hatte ich Problemen mit die Einstellung von Register bei der Änderung der Frequenz und DutyCycle gleichzeitig.
LaLo schrieb: > Hallo, > > Danke für eure Rückmeldungen, ja da habe ich es auch gelesen > (DatenBlatt) nun hatte ich Problemen mit die Einstellung von Register > bei der Änderung der Frequenz und DutyCycle gleichzeitig. Welche Probleme genau?
LaLo schrieb: > nun hatte ich Problemen mit die Einstellung von Register > bei der Änderung der Frequenz und DutyCycle gleichzeitig. Nein, du hast andere Probleme.
Also hier kann ich die Frequenzbereich ändern aber die bleibt einfach fest also ist es nicht variable .. das gleich bei DUty Cycle
Ja! Du wirst dir eine art Protokoll/Menue bauen müssen. Oder einfach https://github.com/thijse/Arduino-CmdMessenger o.ä.
Ich habe diese Konfiguration gemacht, und da kann ich beide Parameter (Frequenz und DutyCycle) ändern ... Nun haben die andere zwei Timer (Timer0 Timer2) diese Möglichkeit nicht, oder sehe ich das falsch? void setup() { // set all PWM pins to output! // timer 0 pinMode(6, OUTPUT); // OCR1A pinMode(5, OUTPUT); // OCR1B // timer 1 pinMode(9, OUTPUT); // OCR3A pinMode(10, OUTPUT); // OCR3B // timer 2 pinMode(11, OUTPUT); // OCR4A pinMode(3, OUTPUT); // OCR4B // manual setup for 16 bit timer 1 with flexible PWM frequency // OCR1A/B/C inverting mode, timer mode 10, phase correct PWM, TOP set by ICR1 TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11); // prescaler / 8 //TCCR1B = (1<<WGM13) | (1<<CS11); // prescaler / 1 TCCR1B = (1<<WGM13) | (1<<CS10); // prescaler / 1024 //TCCR1B = (1<<WGM13) | (1<<CS10) | (1<<CS12); // 10 Bit PWM ICR1 = 1024; // set PWM value OCR1A = ICR1*0.01*50; OCR1B = ICR1*0.01*50; } void loop() { // put your main code here, to run repeatedly: }
Ja gut ich habe bemerkt, dass die einzige Variable, die ich unabhängig ändern kann, ist der Duty Cycle ... Die Frequenz bleibt also gleich für beide Signale
LaLo schrieb: > Nun haben die andere zwei Timer > (Timer0 Timer2) diese Möglichkeit nicht, oder sehe ich das falsch? Jain! Bei Timer0 solltest du nicht unbedingt die Frequenz ändern. Denn das verändert millis(), delay() und ihre Brüder. Nimm Timer1 und Timer2, das reicht für deine 2 unabhängigen PWM Kanäle. Lese das Datenblatt. Dort steht geschrieben, wie diese Timer funktionieren und man sie besprechen muss.
LaLo schrieb: > Ja gut ich habe bemerkt, dass die einzige Variable, die ich unabhängig > ändern kann, ist der Duty Cycle ... Die Frequenz bleibt also gleich für > beide Signale Pro Timer... Wenn du also variable Frequenz haben willst, brauchst du für jede Frequenz einen extra Timer. Allerdings: es gibt nur vergleichsweise wenige Anwendungen, für die es sinnvoll wäre, die Frequenz einer PWM zu variieren...
Hallo, ich weiß nicht welchen Code du wirklich nimmst. In deiner .ino jedenfalls läuft was schief. Du nutzt den Fast-PWM Mode und die Timer zugehörigen Pins. Alles okay. Aber du darfst den Timercounter nicht selbst in der ISR nullen, der muss frei weiterlaufen. Eine ISR vom Timer benötigst du auch nicht. Danach änderst du nur noch das TOP Register für die Frequenz und das Compare-Register für das Duty Cycle im laufenden Programm. Wobei der Wert vom Duty Cycle nie größer wie TOP sein darf, sonst gibts Aussetzer. Nochwas, ganz wichtig bei Arduino, weil die Timer vorkonfiguriert sind. Bei Änderungen an den Timereinstellungen, ich meine die Initialisierung, erst den Timer stoppen, dann alle Register nullen, dann eigene Einstellungen vornehmen. Ist pauschal die sicherste Methode. Ansonsten kann das schief gehen und der Timer hat nicht die gewünschte Konfiguration.
:
Bearbeitet durch User
LaLo schrieb: > die Frequenz bzw. DutyCycle soll für jedes Signal > einstellbar (zB per Seriell) und unabhängig von ein anderer sein. Dazu legt man zu erstmal offen, in welchem Bereich konkret. Will man 2 unterschiedliche Frequenzen mit T1 erzeugen, geht das nur mit Reload in den beiden Timerinterrupts.
ufufs zitierrt LaLo schrieb: > >> Uno (Atmel328UP) >Was ist das? >ATMega328P ? >Der UNO hat 3 Timer mit je 2 Kanälen. >Frequenz in Stufen einstellbar. (das Datenblatt gibt gerne Auskunft) Der Timer 1 beim ATmega328 hat 3 Vergleichsregister.
max123 schrieb: > Der Timer 1 beim ATmega328 hat 3 Vergleichsregister. Interessant! Hier lernt man ja mehr, als im Datenblatt steht! > Two independent output compare units http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf Wenn du jetzt noch zeigst, wie man das dritte erreicht/nutzt.... --- Und vor allen Dingen, mit anderer Frequenz, als die anderen beiden, dann ist der TE bestimmt glücklich! (und ich auch)
Arduino Fanboy D. schrieb: > So lernt man ja mehr, als im Datenblatt steht! Die Weisheit des Internet ist grenzenlos. Alles was im Internet geschrieben steht ist wahr.
Beo Bachta schrieb: > Alles was im Internet geschrieben steht ist wahr. Das erinnert mich irgendwie an diese lustige Konstruktion: > Der nächste Satz ist falsch. > Der vorhergehende Satz ist wahr.
Man kann sich in gewissem Rahmen eine variable Frequenz zurechtbasteln. Was ich von mir gebe wird technisch nicht 100% stimmen, weil schon etwas her, aber das Prinzip kommt hin: Man nimmt einen Timer im CTC Modus und Toggle und schaltet dessen Outputpin auf den Pin eines anderen Timers und schaltet den auf externe Taktquelle. Da man sich dann auf Ebene von int-Auflösung bewegt, sollte man da keine Sweep-Wunder erwarten und wie sich das ganze bei Frequenzänderung im laufenden Betrieb verhält spielte für mich auch keine Rolle soweit ich mich erinnern kann. Mh... wenn man sich im Arduino-Universum bewegt - vielleicht macht es Sinn in der ISR welche auch millis(); etc bedient SoftwarePWM zu realisieren, mit der man dann auf den externen Taktquellenpin anderer Timer geht. Kenne Arduino nicht so gut um zu wissen, ob man bei dem "Systick" andere Nehmer anmelden kann, die dann von dem Takt leben.
Mr. Meeseeks look at me schrieb: > Kenne Arduino nicht so gut um zu wissen, ob man bei dem "Systick" andere > Nehmer anmelden kann, die dann von dem Takt leben. Das ist nicht vorgesehen/vorbereitet, aber recht leicht zu erreichen. Verändern der Arduino Core Dateien, der TOV ISR Alternativ: Nutzen der Vergleichsregister des Timer0, Compare ISR einführen Leider sagt der TO nichts über den geforderten Frequenzbereich und über die Genauigkeit, welche erreicht werden soll. So ist es ein "fischen im Trüben"
PS.:
>Sinn in der ISR welche auch millis(); etc bedient SoftwarePWM zu realisieren
Das war Quark - keine PWM sondern PinToggle
ok, ok Ihr habt recht. ATmega328, Timer 1 hat 2 Vergleichsregister. Ich habe in letzter Zeit mit dem AT-Megaplatine gearbeitet. Dieser Prozessor, ATmega2560, hat 3 Vergleichsregister. Daher die Verwechslung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.