Forum: Mikrocontroller und Digitale Elektronik LPC1769 PWM Probleme bei Dutycycle


von N. Müller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche mich seit zwei Tagen in den LPC1769 einzuarbeiten und gehe 
dazu die ganzen Beispiele die es dazu gibt durch und versuche diese zu 
verstehen bzw. zu ergänzen.
Soweit klappt dass eigentlich auch schon ganz gut (zumindest mit den 
I/O's, ADC, DAC und UART).

Momentan versuche ich mich gerade am PWM-Beispiel und habe damit ein 
bischen Probleme, wo ich hoffe dass ihr mir kurz auf die Sprünge helfen 
könnt.

Ich habe das vorhandene Beispiel verwendet und mache nun einen Sweep 
über das Tastverhältnis (zumindes habe ich das gedacht).
1
if ( match_counter1 >= 20 )  //10 Perioden ausgeführt
2
  {
3
   if(cycle<100)
4
     cycle=PWM_CYCLE;  //Duty auf Standardwert
5
6
    PWM_Set( CHANNEL_NUM, cycle, offset );
7
    cycle--;      //Dutycycle verringern
8
    match_counter1 = 0;  //Flag aus ISR zurücksetzen
9
10
  }

Aber anstatt das Tastverhältnis zu verändern verändert sich die 
Frequenz.
In der Funktion PWM_Set() wird hierzu nur der Cyclewert verändert und 
aktualisiert:
1
LPC_PWM1->MR0 = cycle;    /* set PWM cycle */
2
LPC_PWM1->LER = LER0_EN | LER1_EN | LER2_EN | LER3_EN | LER4_EN | LER5_EN | LER6_EN;

Bei den ATMELs wurde ja auch nur durch den Prescaler oder OC1A die 
Frequenz eingestellt und durch den OC1A/B das Tastverhältnis.
Habe ich da irgendwie einen Denkfehler?

Danke für eure Hilfe.

Grüße
N.Müller

von Michael G. (let)


Lesenswert?

Die Frequenz wird mit dem MR0 Register eingestellt. Wenn der Counter den 
Wert erreicht hat, beginnt ein neuer Durchlauf. MR1..MR6 bestimmen dann 
das Tastverhältnis für den jeweiligen Match-Ausgang. Die Werte in 
MR1..MR6 müssen also kleiner als MR0 sein.
PWM_Set() wird nur für die Initialisierung verwendet. Für deinen Sweep 
müsstest du dir eine eigene Funktion schreiben oder z. B. MR1 direkt in 
der Schleife setzen.

von N. Müller (Gast)


Angehängte Dateien:

Lesenswert?

Michael G. schrieb:
> Die Frequenz wird mit dem MR0 Register eingestellt.

Ja stimmt...danke, mir ist es gerade eben auch aufgefallen.
So ein blöder Fehler!
Ich hatte das am Anfang anderst interpretiert bis ich das Timing in 
Abbildung~120 gesehen habe.
Ist also doch wie bei Atmel.
MR0=OCR1A=Frequenz
MR1=OCR1B= Dutycycle (im Single-Edge-Mode)

Michael G. schrieb:
> PWM_Set() wird nur für die Initialisierung verwendet. Für deinen Sweep
> müsstest du dir eine eigene Funktion schreiben oder z. B. MR1 direkt in
> der Schleife setzen.

Habe das gerade nochmal für einen PWM-Ausgang umgestrickt (PWM1.1) und 
es funktioniert jetzt.

Viele Dank für Deine Antwort.

Grüße
N.Müller

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.