PWM Singnalen mit Arduino

Gast #6034914
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:

}
Gast #6034935
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.
Gast #6034949
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...
#6035282
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.
Gast #6039280
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.
Gast #6039285
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)
Gast #6039495
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.
Gast #6039504
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"
Gast #6040082
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren