PWM Singnalen mit Arduino

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

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.