Forum: Mikrocontroller und Digitale Elektronik Dimmbares Lauflicht


von Nils R. (nxls)


Lesenswert?

Hi Leute,

wie ihr auch bin ich ein interessierter Bastler. Vor geraumer Zeit habe 
ich angefangen mich in Sachen Bascom und Mikrocontrollern zu probieren.

Die Erfolge blieben nicht aus und so haben Sachen wie ein einfaches 
Lauflicht mit 3 LED oder eine PWM, mithilfe eines Atmega8, schnell 
funktioniert.

Nun sollte es aber etwas interessanter werden:
Wieder geht es um eine Art Lauflicht (nur das es diesmal nicht von 
alleine läuft) mit 3 Kanälen. Jedoch hat jeder dieser Kanäle nun 
wiederum 3 LED. Schaltet man die Schaltung ein, ist der erste Kanal 
"an". Bei diesem leuchtet aber wiederum erst die 1., dann die 2., 3. LED 
und dann alle. Wird nun ein Taster gedrückt, so ist der 2. Kanal "an" 
und die ganze Prozedur mit den drei LED geht von vorne los. Bei erneutem 
drücken des Tasters dann für den 3. Kanal, nochmaliges drücken soll 
wieder zum 1. Kanal führen. Alle LED sollen sich dabei noch über ein 
Potenziometer in der Helligkeit regeln lassen (Auswertung über ein ADC 
und Wiedergabe über die PWM).

Das erstmal zur Theorie. Mir ist dabei klar das für jeden Kanal eine 
Variable steht. Entsprechend dieser Variablen müssen jeweils die 
Lauflichter für die 3 LED programmiert werden, diese dürfen jedoch nur 
einmal ablaufen, da dann alle 3 LED leuchten sollen. Und genau hier 
liegt mein Problem: Wie kann ich dem Mikrocontroller sagen das dieses 
Lauflicht nur einmal ablaufen soll, dann alle 3 LED leuchten sollen und 
er auf den nächsten Tastendruck wartet, bei welchem das Ganze für den 
nächsten Kanal abläuft. Bei der Regelung der Helligkeit habe ich im 
Moment leider noch überhaupt keine Idee, da der Atmega8 nur 3 Pins hat 
über welche ein PWM Signal ausgegeben werden kann, ich aber theoretisch 
9 davon bräuchte.

Ich bedanke mich schon im Voraus für eure Hilfe.

MfG

: Verschoben durch Moderator
von Frank S. (_frank_s_)


Lesenswert?

Hallo Nils,
als Gedankenstoß werfe ich mal PWM per Software ins Rennen.

MfG von der Spree
Frank

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Andere µC haben deutlich mehr PWM Ausgänge.
Renesas, NXP, ST

z.B. kann der STM32 je nach Typ locker 30 PWM Kanäle. Damit kann man 
schon mal einiges machen.

von GHD (Gast)


Lesenswert?

Markus M. schrieb:
> Andere µC haben deutlich mehr PWM Ausgänge.
> Renesas, NXP, ST
>
> z.B. kann der STM32 je nach Typ locker 30 PWM Kanäle. Damit kann man
> schon mal einiges machen.

Come on - ein Lauflicht ergo 6 Bit PWM. Da wirst du doch keinen 32 
bitter für 10€ empfehlen. Das geht mit einem 8 bit uC bis pinende. Ich 
würde aber vermutlich eher in Richtung WS2812 oder APA101 LEDs mit 
integrierter Logik gehen. Dabei lernt man noch richtig was und ist nicht 
gleich von 500 Seiten Datenblatt, 1800 Seiten Refence Manual und 2000 
Seiten Programming Manual für eine 32 Bit ARM erschlagen.

von Marc (Gast)


Lesenswert?

>mit 3 Kanälen. Jedoch hat jeder dieser Kanäle nun
>wiederum 3 LED.

Das sind dann also 9 LED?
Soll jede einzelne in der Helligkeit steuerbar sein oder jeweils 3 
zusammen?

von Nils. R. (Gast)


Lesenswert?

Es sollen sich alle 9 LED insgesamt über ein Poti in der Helligkeit 
regeln lassen.

Lassen sich die Controller die ihr vorgeschlagen habt per Bascom 
programmieren?

MfG

von Markus S. (acepilot)


Lesenswert?

Es wurden ja nicht nur Controller vorgeschlagen. Ein STM32 Controller 
kannst du nicht in BASCOM programmieren. Die anderen Vorschläge wie 
WS2812 und APA101 sind LED's die direkt Logik eingebaut haben und mit 
einem definiertem Protokoll gesteuert werden können, dafür brauchst du 
wiederum einen Mikrocontroller.

Verwende doch einfach deinen ATMega weiter und beschäftige dich damit 
wie du eine Software PWM realisieren kannst. Später noch einen Poti 
anklemmen, diesen per ADC auslesen und damit die Software PWM 
beeinflussen ist dann auch kein Problem mehr.

Ansonsten kann ich dir nur empfehlen darüber nachzudenken auf C um zu 
steigen. Das eröffnet dir meiner Meinung nach eine viel größere Welt von 
Möglichkeiten. Das ist zumindest meine Erfahrung. Habe nämlich selber 
mit ATMega, Attiny und Bascom angefangen und bin mittlerweile nur noch 
bei C und STM32 Controllern, auch wenn man die Leistung von denen in 
vielen Fällen nicht benötigt.

von Michael B. (laberkopp)


Lesenswert?

Nils R. schrieb:
> Mir ist dabei klar das für jeden Kanal eine Variable steht.

Nö. Klar ist ehekr daß dein System 9 Zustände hat (und einen 10. wenn 
alles aus sein kann, davon hast du aber bisher nichts geschrieben).

Nils R. schrieb:
> da der Atmega8 nur 3 Pins hat über welche ein PWM Signal ausgegeben werden kann

Man braucht für so etwas anspruchsloses wie LED dimmen keine 
Hardware-PWM, das kann man mit Software machen.

Nils R. schrieb:
> Wie kann ich dem Mikrocontroller sagen das dieses
> Lauflicht nur einmal ablaufen soll, dann alle 3 LED leuchten sollen und
> er auf den nächsten Tastendruck wartet, bei welchem das Ganze für den
> nächsten Kanal abläuft

State machine ist das Schlüsselwort.

Nils. R. schrieb:
> Lassen sich die Controller die ihr vorgeschlagen habt per Bascom
> programmieren?

Es ist eigentlich völlig wurscht welchen Controller, für 9 LEDs sind 
alle tauglich die zumindest 1 Eingangspin für den Taster und 9 
Ausgangspins haben (oder 6 wenn man multiplext).

: Bearbeitet durch User
von Marc (Gast)


Lesenswert?

>Es ist eigentlich völlig wurscht welchen Controller, für 9 LEDs sind
>alle tauglich die zumindest 1 Eingangspin für den Taster und 9
>Ausgangspins haben (oder 6 wenn man multiplext).

Du hast den ADC für das Poti vergessen.

Aus der Beschreibung, wie die Einstellung der Helligkeiten funktionieren 
soll, bin ich aber nicht ganz schlau geworde.

von Nils. R. (Gast)


Lesenswert?

Die Helligkeit aller 9 LED wird über ein einziges Potenziometer geregelt 
(welches einen Spannungsteiler bildet und am ADC hängt), sprich also 
alle haben immer dieselbe Helligkeit.


In Sachen State Machine werde ich mich mal etwas belesen. Wie lässt sich 
dann aber die PWM in das Ganze "implementieren"?

MfG

von Robin S. (der_r)


Lesenswert?

Markus S. schrieb:
> Ansonsten kann ich dir nur empfehlen darüber nachzudenken auf C um zu
> steigen. Das eröffnet dir meiner Meinung nach eine viel größere Welt von
> Möglichkeiten. Das ist zumindest meine Erfahrung. Habe nämlich selber
> mit ATMega, Attiny und Bascom angefangen und bin mittlerweile nur noch
> bei C und STM32 Controllern, auch wenn man die Leistung von denen in
> vielen Fällen nicht benötigt.


Absolute Zustimmung, habe das auch so gemacht! Ich würde für kleine 
Projekte bei Atmel AVR bleiben, aber das Atmel Studio zu verwenden macht 
einfach deutlich mehr Spaß und in C hat alles seine Logik, was in Basic 
nur bedingt der Fall ist.

Kann ich nur wärmstens empfehlen.

von Nils. R. (Gast)


Lesenswert?

Stimme euch da ja ebenfalls zu, benutze das Atmel Studio schon seit 
einiger Zeit zum Flashen. Hab bisher nur noch leider keine Zeit gefunden 
mich mit C zu befassen. Aus dem Grund möchte ich dieses Projekt noch mit 
Bascom abschließen.

MfG

von Nosnibor (Gast)


Lesenswert?

Nils R. schrieb:
> Bei der Regelung der Helligkeit habe ich im
> Moment leider noch überhaupt keine Idee, da der Atmega8 nur 3 Pins hat
> über welche ein PWM Signal ausgegeben werden kann, ich aber theoretisch
> 9 davon bräuchte.

Wenn immer nur eine Dreiergruppe gleichzeitig PWM braucht, würde ich die 
LEDs als Matrix schalten. Drei beliebige Ausgangspins wählen aus, welche 
Gruppe gerade leuchten darf, und die drei PWM-Pins bestimmen die 
Helligkeit. Aufpassen muß man nur mit dem Strom, denn die Auswahlpins 
müssen den dreifachen LED-Strom vertragen können; da wären dann ggf. 
noch Transistoren nötig.

von Nils. R. (Gast)


Lesenswert?

Wie würdest du dabei die PWM in die LED Matrix mit einbringen, dabei 
müsste man die PWM ja ständig an und abschalten an den 3 ausgewählten 
Pins? Oder habe ich hier was missverstanden?

MfG

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

hier ein Beispiel für Software-PWM.

Beitrag "Software_PWM - Verständnisproblem am Beispiel Moodlight - Erlärbär gewünscht"

Mit freundlichem Gruß

von Marc (Gast)


Lesenswert?

>Wieder geht es um eine Art Lauflicht (nur das es diesmal nicht von
>alleine läuft) mit 3 Kanälen. Jedoch hat jeder dieser Kanäle nun
>wiederum 3 LED. Schaltet man die Schaltung ein, ist der erste Kanal
>"an". Bei diesem leuchtet aber wiederum erst die 1., dann die 2., 3. LED
>und dann alle. Wird nun ein Taster gedrückt, so ist der 2. Kanal "an"
>und die ganze Prozedur mit den drei LED geht von vorne los.

Ich verstehe das so:

T=1s
        LED1 LED2 LED3
Kanal 1    X
Kanal 2
Kanal 3

T=2s
        LED1 LED2 LED3
Kanal 1         X
Kanal 2
Kanal 3

T=3s
        LED1 LED2 LED3
Kanal 1              X
Kanal 2
Kanal 3

T=4s
        LED1 LED2 LED3
Kanal 1    X    X    X
Kanal 2
Kanal 3

von Nils. R. (Gast)


Lesenswert?

Wenn du mit T=1s bis T=4s ausdrücken willst das ich quasi 4 Schritte bei 
jedem Kanal im Lauflicht habe, nehmlich: die Erste, dann die Zweite, die 
Dritte und dann alle LED in diesem Kanal,  ist das so richtig.

MfG

von Martin S. (led_martin)


Lesenswert?

GHD schrieb:
> ein Lauflicht ergo 6 Bit PWM.

6 Bit PWM würde ich nicht nehmen, das ist, in den unteren 
Helligkeitsstufen zu grob, plane mindestens mit 8 Bit oder mehr. Da Du 
ja die Helligkeit für alle LEDs gemeinsam einstellen willst, ist das mit 
der Software-PWM nicht schwierig, es wird halt nicht nur ein Portpin 
gesteuert, sondern 9, überlagert von der Information, welche LED 
überhaupt leuchten soll. Multiplexing, oder Ähnliches würde ich bei 9 
LEDs nicht machen, das ist unnötiger Aufwand. Ein 8-Bit AVR schafft das 
locker, ich habe hier einen ATmega644, getaktet mit 10 MHz, laufen, der 
erzeugt 25 PWM-Signale per Software, mit 10 Bit und einer PWM-Frequenz 
von 2400 Hz, und das mit unterschiedlichen Helligkeits-Werten für die 
Kanäle.

Mit freundlichen Grüßen - Martin

von posti (Gast)


Lesenswert?

Hi

Die Anfrage war doch, wie das Problem mit einem ATmega erschlagen werden 
kann.
Von Bascom habe ich keinen Plan, aber immerhin.
Du hast eine Variabel Gruppe (int, 0-255 reicht 'gerade so')
Du hast eine Variabel Maske (int, 0-255, dito)

Gruppe wird von 1-3, zurück auf 1 und so weiter gezählt.
Damit bestromst Du jeweils einen Transistor, Der Dir jeweils eine 
3er-Gruppe LEDs mit +5V versorgt.
Die Gruppe Maske zählst Du
-1 (Binär 001)
-2 (Binär 010)
-4 (Binär 100)
-7 (Binär 111)
und legst diesen Wert direkt auf das Port, wo die 'Minusse' der LEDs 
(also die drei 1er, die drei 2er, die drei 3er) angeschlossen werden 
bzw. wieder ein Transistor angesteuert wird, Der Diesen 'Spalten' den 
Minus zuschaltet.

Nach der 7 wartest Du auf den Tastendruck, zählst Gruppe+1, bei 4 -> 
Gruppe=1 und beginnst wieder bei 0 (also zählst wieder 1,2,4,7)

Parallel dazu lässt Du einen Timer als Counter von 0-255 hochzählen, 
also inclusive Überlauf, daß Dieser wieder bei 0 anfängt.

Dein ADC liest Du als 8-bit ein.

Wenn Dein ADC-Wert größer als der Counter-Wert ist, schaltest Du eine 
der Seiten auf Eingang -> LED aus.
Springt der Counter wieder auf 0 zurück, schaltest Du diese Seite wieder 
auf Ausgang.

Sollte funktionieren, wenn's bestimmt auch schönere Lösungen gibt

So, Essen fertig
MfG

von Nosnibor (Gast)


Lesenswert?

Nils. R. schrieb:
> Wie würdest du dabei die PWM in die LED Matrix mit einbringen, dabei
> müsste man die PWM ja ständig an und abschalten an den 3 ausgewählten
> Pins? Oder habe ich hier was missverstanden?
Matrix beschreibt nur die Schaltung; die muß man nicht unbedingt 
multiplexen.
Vielleicht habe ich den geplanten Ablauf falsch verstanden. Ich stelle 
mir das so vor:
Tastendruck: Auswahlpin für Kanal 1 geht aktiv, die anderen sind aus. 
PWM-Pins spielen ihr Lauflicht, bis alle drei LEDs an sind.
Nächster Tastendruck: Auswahlpin für Kanal 2 geht aktiv, Kanal 1 wieder 
aus. Dann sind natürlich auch die ersten drei LEDs wieder aus (da bin 
ich mir jetzt unsicher, ob das so richtig ist). Die PWMs spielen jetzt 
wieder das Lauflicht ab, bis alle drei LEDs (die von Kanal 2 natürlich) 
an sind.
Nächster Tastendruck: dasselbe für Kanal 3.

von Nils. R. (Gast)


Lesenswert?

Ok, fest steht also das es eine "softwaremäßige" PWM wird. Und das ich 
das Lauflicht mithilfe des State machine - Befehls realisiere.

Das Signal ob die LED dann an oder aus ist wird ja dann vom PWM Signal 
überlagert, aber wie funktioniert dies, da die LED ja auch ganz aus sein 
soll?

MfG Nils

von Phil E. (mieper)


Lesenswert?

Schau dir mal den PCA9685 an. 16 Kanäle oder mehr mit nur zwei Pins.

von Nils. R. (Gast)


Lesenswert?

Ja genau so war es gemeint Nosnibor.

von Michael B. (laberkopp)


Lesenswert?

Marc schrieb:
> Du hast den ADC für das Poti vergessen.

Stimmt.

Nils. R. schrieb:
> dabei müsste man die PWM ja ständig an und abschalten

Ja und ?

Nils. R. schrieb:
> Wie würdest du dabei die PWM in die LED Matrix mit einbringen

http://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM

So ungefähr, ist aber mein erstes BASCOM Programm, wird noch falsch sein
1
$regfile = "m8def.dat"
2
$crystal = 8000000
3
Config PortB.0 = Output ' --R--*--|<|--+ *--|<|--+ *--|<|--+
4
Config PortB.1 = Output ' --R--*--|<|--+ *--|<|--+ *--|<|--+
5
Config PortB.2 = Output ' --R--*--|<|--+ *--|<|--+ *--|<|--+
6
Config PortB.3 = Output ' -------------+         |         |
7
Config PortB.4 = Output ' -----------------------+         |
8
Config PortB.5 = Output ' ---------------------------------+
9
Config PortB.6 = Input ' Taster nach VCC, Widerstand nach GND
10
Config PortC.0 = Input ' Poti zwischen VCC und GND
11
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
12
dim gedrueckt as bit
13
dim taster as bit
14
dim pwm as byte
15
dim intensity as byte
16
dim row_led(3) as byte
17
dim leds_pin(3) as byte
18
row_led(1)=6
19
row_led(2)=5
20
row_led(3)=3
21
leds_pin(1)=8
22
leds_pin(2)=24
23
leds_pin(3)=56
24
portb = 0
25
pwm = 0
26
row = 1
27
leds = 1
28
taster = PortC.0
29
Do
30
  IF pwm = 255 THEN ' PWM erzeugen
31
    IF row < 3 THEN row = row + 1 ' weiterschalten der LEDs
32
    pwm = 0
33
  ELSE
34
    pwm = pwm + 1;
35
  END IF
36
  if pwm < intensity then ' Helligkeit je nach PWM
37
    PortB = row_led(row) + leds_pin(leds)
38
  else
39
    PortB = 0
40
  end if
41
  intensity = GETADC(0) \ 4 ' Intensitätywert holen
42
  gedrueckt = PortB.6
43
  IF gedrueckt <> taster THEN ' eigene Entprellung weil schneller als DEBOUNCE
44
    IF gedrueckt THEN
45
      leds = leds + 1
46
      IF leds > 3 THEN leds = 1
47
      row = 1
48
    END IF
49
    taster = gedrueckt
50
  END IF
51
Loop
52
End

von posti (Gast)


Lesenswert?

Hi

Die Definitionen der Reihen und Spalten sehen nicht korrekt aus.
Die Kathoden sind ja auf den Ports PB0-PB2, wären somit 1,2,4
Die Anoden liegen auf PB3-5, wären 8,16,32

Oder verstehe ich das Listing völlig falsch?

row_led(1)=6              4 2
row_led(2)=5              4    1
row_led(3)=3                2  1
leds_pin(1)=8           8
leds_pin(2)=24      16  8
leds_pin(3)=56   32 16  8

Aah, Die LEDs summieren sich hier, laufen also voll.
Dachte, zuerst läuft eine LED durch und darauf werden alle angeschaltet.

Wenn Du bei den Spalten negiert arbeiten willst, also alle Bits High nur 
das Bit Low, wo's leuchten soll - dann sind Deine Dioden falsch rum.

Für weitere Analysen bin ich schon zu lang im Bett ... eigentlich seit 
~2 Stunden ... kann fast schon hören, wie der Wecker bereits Luft holt 
:)

MfG

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.