Forum: Mikrocontroller und Digitale Elektronik PWM Singnalen mit Arduino


von LaLo (Gast)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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)

von Falk B. (falk)


Lesenswert?

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"

von AndyII (Gast)


Lesenswert?

Kommt drauf an wie viele Kanäle du brauchst...

von LaLo (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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?

von Einer K. (Gast)


Lesenswert?

LaLo schrieb:
> nun hatte ich Problemen mit die Einstellung von Register
> bei der Änderung der Frequenz und DutyCycle gleichzeitig.
Nein, du hast andere Probleme.

von LaLo (Gast)


Angehängte Dateien:

Lesenswert?

Also hier kann ich die Frequenzbereich ändern aber die bleibt einfach 
fest also ist es nicht variable .. das gleich bei DUty Cycle

von Einer K. (Gast)


Lesenswert?

Ja!
Du wirst dir eine art Protokoll/Menue bauen müssen.

Oder einfach https://github.com/thijse/Arduino-CmdMessenger
o.ä.

von LaLo (Gast)


Lesenswert?

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:

}

von LaLo (Gast)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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.

von max123 (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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)

von Beo Bachta (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Mr. Meeseeks look at me (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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"

von Mr. Meeseeks look at me (Gast)


Lesenswert?

PS.:
>Sinn in der ISR welche auch millis(); etc bedient SoftwarePWM zu realisieren

Das war Quark - keine PWM sondern PinToggle

von max123 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.