mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software-PWM nicht störfest


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe ein Problem mit meiner Software-PWM-Lösung. Grundsätzlich 
funktioniert alles einwandfrei - ich erzeuge damit 3 voneinander 
unabhängige PWM-Signale, die direkt einen LED-Treiber ansteuern. Als 
Auflösung habe ich 8bit bei einer Frequenz von ca. 305Hz. Der uC 
empfängt nebenbei DALI-Signale und wertet diese aus. uc ist ein 
ATMega328p.
Nun zu meinem Problem: Wenn ich ein niedriges Dimm-Level eingestellt 
habe (ca. 10%) und ich viel Daten von der DALI-Schnittstelle 
hintereinander bekommen, dann flackern die LEDs ein bisschen. Es ist 
nicht so viel, aber genug, um als störend empfunden zu werden. Was 
könnte das sein? Die PWM-Erzeugung läuft ganz in einer Timer-Routine ab 
- sollte also in gleichmäßigen Abständen ausgeführt werden. Aber 
irgendetwas scheint da zu stören.
Mir ist klar, dass ihr mir keine Ferndiagnose stellen könnt, aber 
vielleicht hat von euch irgendwer Erfahrung damit und hatte schon so ein 
Problem.

Vielen Dank!

mfg Andy


PS: Hier noch meine Soft-PWM - vielleicht hilfts:

SIGNAL(TIMER0_OVF_vect)
{
  static uint8_t pwm,channelTmp[3];

  //PWM-Signale erzeugen
  pwm -= 1;
  if(pwm == 0)
  {
    LED_PORTD &= ~(0x60);
    LED_PORTB &= ~(0x08);
    pwm = PWM_RESOLUTION;
        for(uint8_t i=0;i<3;i++)
            channelTmp[i] = channel[i];
  }

  // CHANNEL 1
  if(pwm <= channelTmp[0])
    sbi(LED_PORTD, CHANNEL1);

  // CHANNEL 2
  if(pwm <= channelTmp[1])
    sbi(LED_PORTD, CHANNEL2);

  // CHANNEL 3
  if(pwm <= channelTmp[2])
    sbi(LED_PORTB, CHANNEL3);
}

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn der übrige Code größere Blöcke, die mit cli/sei oder 
ATOMIC_BLOCK gesperrt sind?

Aber auch wenn nicht: etwas Jitter ist immer bei soft-pwm, allein wg. 
der unterschiedlichen Ausführungszeit einzelner Opcodes.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Andy (Gast)

>Nun zu meinem Problem: Wenn ich ein niedriges Dimm-Level eingestellt
>habe (ca. 10%) und ich viel Daten von der DALI-Schnittstelle
>hintereinander bekommen, dann flackern die LEDs ein bisschen.

>könnte das sein? Die PWM-Erzeugung läuft ganz in einer Timer-Routine ab
>- sollte also in gleichmäßigen Abständen ausgeführt werden. Aber
>irgendetwas scheint da zu stören.

Sind noch andere Interrupts aktiv? Die können dein Timing beeinflussen.

>Mir ist klar, dass ihr mir keine Ferndiagnose stellen könnt, aber

Ach was?

>PS: Hier noch meine Soft-PWM - vielleicht hilfts:

Nö. Poste VOLLSTÄNDIGEN Code im ANHANG. Siehe Netiquette.

MFG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  ?rnst B? (ernst)

>Aber auch wenn nicht: etwas Jitter ist immer bei soft-pwm, allein wg.
>der unterschiedlichen Ausführungszeit einzelner Opcodes.

Ja, das sind beim AVR max. 3 Takte Jitter, die sieht kein Mensch an 
einer LED.

MFG
Falk

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
>>Aber auch wenn nicht: etwas Jitter ist immer bei soft-pwm, allein wg.
>>der unterschiedlichen Ausführungszeit einzelner Opcodes.
>
> Ja, das sind beim AVR max. 3 Takte Jitter, die sieht kein Mensch an
> einer LED.

Stimmt natürlich auch...

Beim Video-Signal-Erzeugen sieht man da öfter Tricksereien, um diesen 
Jitter loszuwerden, wär aber bei einer 300Hz LED PWM wohl wirklich 
overkill ;)

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten.
Ich kann leider nicht den gesamten Code posten (Teil eines 
Firmenprojekts).
Mit cli/sei bzw. ATOMIC_BLOCK ist nichts gesperrt.
Was ich mir nicht ganz erklären kann: Warum kann es durch anderen Code 
zu solchen Störungen kommen? Sollte ein Timer nicht immer gleichmäßig 
ausgeführt werden? Und der Code in der Timer-Interrupt-Routine ist doch 
auch nichts aufwändiges....
Gibt es vielleicht eine andere Methode, um störsicherer PWM-Signale zu 
erzeugen??

lg
Andy

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:
> Sollte ein Timer nicht immer gleichmäßig
> ausgeführt werden?

ja, aber nur so lange kein andere Interupt aktiv ist. Wenn du noch 
weiter interupts hast die eventuell zu lange brauchen dann könnte 
soetwas passieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:

> Mit cli/sei bzw. ATOMIC_BLOCK ist nichts gesperrt.

Das kannst nur du wissen.

> Was ich mir nicht ganz erklären kann: Warum kann es durch anderen Code
> zu solchen Störungen kommen? Sollte ein Timer nicht immer gleichmäßig
> ausgeführt werden?

Das tut er auch, solange man ihn lässt.

Wenn er es daher nicht tut, dann hat ihn anderer Code 'behindert'. Und 
das geht wiederrum nur wenn an den Konfigurationsregistern oder am 
globalen Interrupt Flag rumgespielt wird oder eine andere ISR zuviel 
Zeit gebraucht hat.

Aber da du den Code ja nicht herzeigst ...

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, das ist ein guter Hinweis. Kann man beim 328er Prioritäten vergeben, 
z.B. dass dieser Timer-Interrupt immer sofort ausgeführt werden muss??

lg

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:
> OK, das ist ein guter Hinweis. Kann man beim 328er Prioritäten vergeben,
> z.B. dass dieser Timer-Interrupt immer sofort ausgeführt werden muss??
>

Nein

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da der AVR keine Interruptprioritäten hat, verzögern alle anderen 
Interrupts Deine SW-PWM.

Welche Interrupts benutzt denn das Dali?
Du solltest versuchen, diese Interrupts so kurz wie möglich zu halten.
Also alles was geht, ins Main auslagern.

Das Attribut ISR_NOBLOCK ist leider bei UART, I2C usw. nicht möglich, da 
diese das Interruptflag nicht automatisch löschen und der Stack läuft 
sofort über.


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps.
Nebenbei werden noch 2 andere Timer-Routinen und ein externer Interrupt 
benutzt. Mal sehen, was sich da noch optimieren lässt...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.