LED dimmen mit Fading oder lieber mit PWM

Gast #6802338
Lesenswert?

Hallo
Ich möchte mit einem Attiny eine LED dimmen (Fading). Habe schon den 
Beitrag dazu gelesen (LED Fading). Der läuft mit einem Atm 32. Habe 
versucht es auf den Attiny zu übersetzen, leider ohne Erfolg.
Wie kann man so was am besten machen. Mit PWM und Timer, aber wie genau. 
Leider ist im Beitrag nicht viel an Erklärung dabei.
Oder kennt jemand einen guten Beitrag dazu?
LG Klaus
Gast #6802384
Lesenswert?

Anscheinen musst du Grundlagen lernen. Ist dir klar, was PWM ist und wie 
man es benutzt?

Wenn nicht, worauf können wir aufbauen?

Zu diesem Thema gibt es zahlreiche Tutorial im Arduino Umfeld, 
vielleicht fängst du damit mal an. Z.B. 
https://starthardware.org/lektion-13-leds-dimmen-mit-der-analogen-ausgabe/

Wenn du diese Lektion 13 nicht verstehst, dann fange mit Lektion 1 an.
#6802420
Lesenswert?

Stefan ⛄ F. schrieb:
> Zu diesem Thema gibt es zahlreiche Tutorial im Arduino Umfeld,
> vielleicht fängst du damit mal an. Z.B.
> https://starthardware.org/lektion-13-leds-dimmen-mit-der-analogen-ausgabe/

Von Arduino hat Klaus nichts gesagt. Ich vermute mal, er will es "zu 
Fuß" machen. Dann sollte es sich mal in das Datenblatt des ATTiny zu PWM 
einlesen.
Vielleicht hilft auch das Tutorial 
https://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM.
Gast #6802440
Lesenswert?

Klaus schrieb:
> Mit PWM und Timer, aber wie genau.

Steht sehr detailiert im DB und der Family Reference wie die Register zu 
setzen sind.
Aber ohne English lesen und verstehen zu können kannst Du das komplette 
Thema Elektronik und Programmierung auch gleich sein lassen.
Ohne zu verstehen was Du da tust, reicht Copy Paste einfach nicht aus.
#6802441
Lesenswert?

Klaus schrieb:
> Hallo
> Ich möchte mit einem Attiny eine LED dimmen (Fading). Habe schon den
> Beitrag dazu gelesen (LED Fading). Der läuft mit einem Atm 32. Habe
> versucht es auf den Attiny zu übersetzen, leider ohne Erfolg.
> Wie kann man so was am besten machen. Mit PWM und Timer, aber wie genau.

Mann muss die Register passend einstellen.

> Leider ist im Beitrag nicht viel an Erklärung dabei.

Eine glatte Lüge!

> Oder kennt jemand einen guten Beitrag dazu?

Du suchst ein Hörbuch? Oder noch besser jemanden, der das für dich 
macht?

In jedem Datenblatt zu jedem AVR steht drin, wie man die Bits setzen 
muss, um einen PWM-Modus zu konfigurieren. In den Beispielen im Artikel 
LED-Fading sieht man das auch. Wenn dein Tiny keinen 16 Bit Timer 
hat, muss man es halt mit einem 8 Bit Timer machen. Aber das ist kein 
großes Problem, man muss nur 1-2 Register mit einer handvoll Bits 
korrekt setzen!
#6802550
Lesenswert?

Hallo,

man schaut sich die Timer Register im Manual an. Nimmt diese Lektüre 
https://www.mikrocontroller.net/articles/LED-Fading, passt ggf. die 
Register an und hat sein Led Fading.

Oder man schaut sich zuerst den Code rund um die Timerregister an, 
schaut was die Registereinstellungen vom Timer machen und überträgt das 
auf seinen anderen Ziel Controller.

Um eine Einarbeitung kommt man allerdings nie drumherum egal wie man es 
anstellt.
Gast #6802581
Lesenswert?

Apollo M. schrieb:
> Falk B. schrieb:
>> Wenn dein Tiny keinen 16 Bit Timer
>> hat, muss man es halt mit einem 8 Bit Timer machen.
>
> Auch eine glatte Lüge!

Eher nicht, da ist nichts Falsches darin, was Falk so schreibt.
Auch Du scheinst sowas zu brauchen:

Apollo M. schrieb:
> und einen 8bit HW counter für

Was Du allerdings mit dem Timer als Counter willst, bleibt verborgen, 
man könnte auch sagen Du bist hier aufgeschlagen um dem TE Blödsinn zu 
raten.

[sarkasmus]Man soll's diesen blutigen Anfängern einfach nicht zu leicht 
machen, einfach mal was Dummes zur Verwirrung geschrieben und schon ist 
des Anfängers Leben und Lernen interessanter.[/sarkasmus]

Erklär doch mal, wie betreibst Du den Counter, nimmst Du einen externen 
Oszillator dafür? Oder muss da noch ein Fluxkompensator dazwischen?
Gast #6802642
Lesenswert?

MWS schrieb:
> Erklär doch mal,

Das ist nicht schwer zu verstehen wie er das meint.
An / Aus über SW PWM, (halbwegs) konstante Zweit zwischen zwei 
++pwm_counter über den HW Timer.

Trotzdem eine völlig unbrauchbare Verquickung aus HW und SW PWM
Für eine flackerfreie PWM brauche ich bei LEDs 100Hz.
Wozu also die 16/32 bit Variable auf einen niedrig getakteten 8bitter?

In niedrigen Dimmstufen sieht man jede klitzekleine Abweichung in der 
Bearbeitungszeit einer SW PWM sofort.
Wenn schon per SW, weil z.B. nicht genug PWM Ausgänge zur Verfügung 
stehen, dann doch bitte PDM (Pulse Dichte Modulation).
Da komme ich mit sehr viel niedrigerer Frequenz hin, weil innerhab eines 
PWm Zyklus mehrfach ein/aus geschaltet wird.
Damit sieht man auch kleine Timing Abweichungen nicht mehr.

Aber nach dem derzeitigen Kenntnissstand des TO hilft dem das alles 
nicht weiter.
Wenn man die Sprache so garnicht beherrscht UND das DB nicht liest, ist 
einem eben kaum zu helfen.
Moderator Persönliche Seite #6803329
Lesenswert?

Man kann mit einem ATTiny durchaus eine 12Bit-PWM umsetzen. Man benutzt 
dafür eine 8Bit-Hardware-PWM und eine Timer-Overflow-ISR, in welcher man 
die oberen 4 Bit der PWM per Software macht.

Mit der 12Bit-PWM hat man dann 4096 Schritte, mit welchen auch 
problemlos noch eine Gamma-Korrektur für das menschliche Auge möglich 
ist. Auch in den unteren Helligkeitsbereichen ist damit ein stufenloses 
Fading möglich - zum Beispiel mit 3 PWM-Kanälen für RGB.

Ich selbst habe das damals gemacht für meine Equinox-Uhr, als die WS2812 
noch gänzlich unbekannt bzw. schweineteuer waren - mit 60 LEDs und 60 
ATTinys (ATTiny85), siehe Bild.

Thread dazu - mit Link auf Video: 
Beitrag "Equinox-Uhr mit 60 ATtinys"
Angehängte Dateien:
Gast #6803360
Lesenswert?

Bloss mal zur Klarstellung. Ich such kein "Hörbuch" oder einen des für 
mich erledigt. Ich suche auch kein fertiges Programm-
Was ich suche ist ein Tut oder eine Erklärung die man verstehen kann. 
Keine Doktorarbeit oder anderes kompliertes.
Ich arbeite mit C und nicht mit Arduino.
Es muss doch möglich als nicht Doktor sowas zu machen.
Moderator Persönliche Seite #6803375
Lesenswert?

Klaus schrieb:
> Ich arbeite mit C und nicht mit Arduino.

Gut. Mache ich auch so. :-)

> Es muss doch möglich als nicht Doktor sowas zu machen.

Man muss sich dafür da reinarbeiten. Zunächst lässt man die LED blinken. 
Dann schaut man sich im Datenblatt den Fast-PWM Mode an und lernt, wie 
man die Register TCCR0A und TCCR0B (für z.B. ATTiny85) bedienen muss, um 
eine PWM zu generieren.

Wenn man dann einen beliebigen 8-Bit-PWM-Wert erzeugen kann, versucht 
man, die LED zu faden, indem man mittels Timer die PWM von einem 
Startwert bis zu einem Stoppwert laufen lässt. Dazu inkrementiert (bzw. 
dekrementiert) man über die Timer-ISR den PWM-Wert, bis dieser den 
Stoppwert erreicht hat.

Das Ganze kann man dann noch mit einer Gamma-Korrektur versehen, damit 
die Helligkeitswerte an das Helligkeitsempfinden des menschlichen Auges 
angepasst werden.

Hier findest Du dazu alles, was Du brauchst: LED-Fading

Das ist für einen ATMega32, ist aber leicht auf einen ATTiny 
umzuschreiben.

Hat man eine RGB-LED, kann man das dann auf 3 PWM Kanäle erweitern. Hier 
lässt man die LED dann von einem Start-Tripel R,G,B zu einem 
Stopp-Tripel R,G,B laufen. Hier muss man dann 3 Werte erhöhen bzw. 
erniedrigen - mit einem geeigneten Inkrement-Wert für jeden Kanal, damit 
alle 3 Stopp-Werte gleichzeitig erreicht werden.

Die Königsklasse ist dann die Erweiterung der 8-Bit-HW-PWM auf 12 Bit, 
wobei hier der Timer-Overflow-Interrupt für das Erzeugen von 4 weiteren 
höherwertigen PWM-Bits genutzt wird. Diese ISR (TIMER1_OVF_vect) kann 
dann auch noch zusätzlich das Fading erledigen. Damit erschlägst Du 
direkt 2 Fliegen mit einer Klappe.

Ist Dir das als "Tutorial" genug, oder muss man Dir das noch in 
Einzelheiten vorkauen? Das Datenblatt zum ATTiny liefert Dir eigentlich 
alle nötigen Informationen dazu.

P.S.

Zu Deinem Threadtitel "LED dimmen mit Fading oder lieber mit PWM"

Man machts mit PWM. Fading ist eigentlich nur das Ändern der PWM über 
die Zeit.
Gast #6803384
Lesenswert?

Frank M. schrieb:
> Man machts mit PWM. Fading ist eigentlich nur das Ändern der PWM über
> die Zeit.
Das ist für mich eine klare Aussage. Mit dem PWM und den Timern werde 
ich angehen und lesen.
Hatte im Netz gelesen das es verschiedene Möglichkeiten geben soll. Bei 
einigen ist der Timer dazu auf verschiedene Teile des Programms 
"verstreut" oder man versucht es einfach zu "verschleiern". Grund genug 
für micjh es anzugehen. Danke für die Info.
LG Klaus
Gast #6803463
Lesenswert?

Stefan schrieb:
> das sind 2 unterschiedliche Methoden
> PMD 1== 1:puls/Zyklus 2:pulse/Zyklus ....
> Vorteil: man bekommt schnell hohe Frequenz
> Nachteil: man bekommt schnell hohe Frequenz

PDM ist eine sehr effiziente Methode per Software viele 'PWM' Ausgänge 
zu machen.
Warum das ein Nachteil sein soll, das ich trotz niedriger 
Bearbeitungsfrequenz auf eine flackerfreie Ansteuerung komme, da nicht 
nur einmal pro Zyklus geschaltet wird, sondern viel Male, müsstest Du 
aber mal erklären.

Zwingt mich ja keiner die Routine häufiger aufzurufen als ich für eine 
vernünftige Wiederholfrequenz benötige.

Mit PDM habe ich schon auf einem 8Mhz Silabs 8051 RGBW mit 10bit / 100Hz 
gesteuert, alle 300ms RS485 Protokolle empfangen und dekodiert, Fading, 
Temperatur- und Chargenkompensation des Farbortes und anderes 
Housekeeping gemacht, ohne das der am Limit war.
#6803464
Lesenswert?

Prokrastinator schrieb:
> Warum das ein Nachteil sein soll, das ich trotz niedriger
> Bearbeitungsfrequenz auf eine flackerfreie Ansteuerung komme, da nicht
> nur einmal pro Zyklus geschaltet wird, sondern viel Male, müsstest Du
> aber mal erklären.

Das ist ein Nachteil für Leistungsstufen, denn dort verursacht die 
Umschaltung satte Schaltverluste. Bei einer 8 Bit PWM gibt es unabhängig 
vom PWM-Wert nur 2 Schaltvorgänge/Periode. Bei PDM bis zu 256!

Bei LEDs und ähnlichem Kram spielt das keine Rolle.
Gast #6803467
Lesenswert?

Martin S. schrieb:
> Unter "dimmen" verstehe ich einmaliges "Regulieren" auf einen bestimmten
> Wert.
>
> Unter "faden" verstehe ich ein kontinuierliches "auf (und/oder) ab" der
> Intensität.

Egal was man unter welchem Begriff versteht - mit PWM wird man es so 
oder so machen. Das ist kein "oder".
#6803706
Lesenswert?

1
// ATtiny402, ATtiny412
2
// LED fade-in fade-out 10-bit PWM
3
// PWM output: Pin 7 (PA3)
4

5
#include <avr/io.h>
6

7
uint16_t pw[64] = {0,1,1,1,2,2,3,4,5,7,8,10,12,14,16,18,21,24,27,30,34,38,43,48,54,60,67,74,81,89,98,108,118,128,140,152,164,178,192,208,225,247,270,294,319,343,368,396,424,452,481,511,543,577,612,650,689,730,773,819,867,917,969,1023};      // pulse width
8
uint8_t i;                  // index
9
int8_t incr = 1;            // increment
10
uint16_t count;             // loop counter
11
uint16_t top = 2000;        // loop counter top
12

13
int main(void)
14
{
15
  _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, (CLKCTRL_PDIV_10X_gc | CLKCTRL_PEN_bm));  // main clock 2MHz
16

17
  PORTA.DIRSET = PIN3_bm;                                // output
18
  TCA0.SINGLE.CTRLB |= TCA_SINGLE_WGMODE_SINGLESLOPE_gc; // set PWM mode
19
  TCA0.SINGLE.PER  = 0x03FF;                             // PWM frequency: 1MHz/1024 = 977Hz
20
  TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV2_gc          // counter clock 1MHz
21
                    | TCA_SINGLE_ENABLE_bm;              // start timer
22
  TCA0.SINGLE.CTRLB |= TCA_SINGLE_CMP0EN_bm;             // enable compare channel 0, override PA3
23

24
  while (1)
25
  {
26
    TCA0.SINGLE.CMP0BUF = pw[i];                         // write pulse width value;
27
    count++;
28
    if(count == top)
29
    {
30
      count = 0;
31
      i += incr;
32
      if(i == 63)
33
      {
34
        incr = -1;
35
        top = 4000;
36
      }
37
      if(i == 0)
38
      {
39
        incr = 1;
40
        top = 2000;
41
      }
42
    }
43
  }
44
}
Gast #6803736
Lesenswert?

Prokrastinator schrieb:
> PDM ist eine sehr effiziente Methode per Software viele 'PWM' Ausgänge
> zu machen.
sehe ich genauso
> Warum das ein Nachteil sein soll, das ich trotz niedriger
> Bearbeitungsfrequenz auf eine flackerfreie Ansteuerung komme, da nicht
> nur einmal pro Zyklus geschaltet wird, sondern viel Male, müsstest Du
> aber mal erklären.
10-bit PDM verursacht schon über 1000 Schaltvorgänge

> Zwingt mich ja keiner die Routine häufiger aufzurufen als ich für eine
> vernünftige Wiederholfrequenz benötige.
aber verführt u.U. weil eine PDM bei 90% Rechenleistung trotzdem 
ausreichend Zeit für die Anwendung lässt d.h. kleine Drahtstücke können 
(vom Gefühl) schnell zu Sendern werden.
Gast #6803824
Lesenswert?

Wolfgang schrieb:
> Wie weit die Oberwellen reichen, hängt von der Steilheit der Flanken ab ;-)
bei der Reichweiten-theorie von (Ober)wellen dürfte eine besondere 
physikalische Begabung dabei sein, die immerhin ein lächeln hinterlässt

Prokrastinator schrieb:
> Mit PDM habe ich schon auf einem 8Mhz Silabs 8051 RGBW mit 10bit / 100Hz ...
mit einem versehentlichen Anschluss eines 14Mhz Quarzes und einpoligen 
langen Leitungen käme man bei 50% zumindest grob auf einen DCF77 
Störsender, der gleich zwei 48CH-PWM-Boards in der weiteren 
Entwicklung stört:
Beitrag "Re: Binäruhr mit STM32 Blue Pill Board"
Ohne Empfang wird fürs diskutieren über die Literatur von Frau Passig 
des Berliner BSDM bezahlt:
Beitrag "Re: Quelltext: Lesestoff gesucht"
==> Vorsicht mit solchen PDM
Gast #6804036
Lesenswert?

Stefan schrieb:
> ==> Vorsicht mit solchen PDM

Vorsicht mit solchen Postings.
Worte aneinanderzureihen die sich fachlich fundiert anhören, mit der 
Realität und projektspezifischen Umsetzung aber überhaupt nichts zu tun 
haben, sind einfach nur Text. Sonst nichts.
Gast #6804082
Lesenswert?

Prokrastinator schrieb:
> Worte aneinanderzureihen die sich fachlich fundiert anhören, mit der
> Realität und projektspezifischen Umsetzung aber überhaupt nichts zu tun
> haben, sind einfach nur Text.
Genau. Und deswegen wäre Klaus Board eine optimale Hilfe für die 
Lesestoff-Gruppe die unter:
Beitrag "Quelltext: Lesestoff gesucht"
Worte aneinanderreihen, aber bislang an einer projektspezifischen 
Umsetzung scheitern, weil Walter sein PWM-Entwicklungsboard geheim hält.
Gast #6806551
Lesenswert?

Klaus schrieb:
> Das ganze Bord besteht aus einer Platine mit vielen Löchern
> (Bredbord)
> und alle Teile sind einfach draufgesteckt.
> Fliegende Verdrahtung? Nennt sich das so?

Und was willst Du damit sagen? Es heißt übrigens “Breadboard”. Naja 🤷‍♂️
Welche Attiny verwendest Du denn? Und wie weit bist Du mit Deinem 
Programm?
Zeig’ doch mal was Du bislang implementiert hast

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