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)
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.
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.
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.
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"
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.