LPC1769 PWM Probleme bei Dutycycle

Gast #2281933
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
Angehängte Dateien:
#2281968
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.
Gast #2282021
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
Angehängte Dateien:

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