Bascom Ledarbeitsleuchte Umschaltbar und Dimmbar

Matthiasab64

Mitglied
21. Feb. 2012
82
0
6
Brandenburg an der Havel, de
Sprachen
  1. BascomAVR
Led_Arbeitsleuchte Umschaltbar und Dimmbar

Hallo,

ich habe wieder einmal ein kleines Problem. Ich habe mir eine Arbeitsleuchte mit ca 260 led´s gebaut, die LED´s sind in 3 Gruppen unterteilt , innerer Ring, mittlerer Ring und äuserer Ring.

Ich möchte mit einen Attiny13 wählen können welche gruppe(n) Leuchten sollen, um Eingänge zu sparen möchte ich gern einen der Adc verwenden, da es bei den 3 Led gruppen 8 Kombinationsmöglichkeiten gibt würde ich die 1023 durch 8 Teilen und jedem Bereich eine Kombination zuweisen.

Des weiteren soll mit einem zweiten Poti die Helligkeit der LED´s eingestellt werden.

Beides getrennt funktioniert, aber wie gebe ich eine PWM auf den Port der gerade Aktiv sein soll.

Danke Matthias
10612804_10202216993921326_1674725021590697246_n.jpg
10645208_10202390744784989_2383305570819343488_n.jpg
 
.....aber wie gebe ich eine PWM auf den Port der gerade Aktiv sein soll.


Hallo Matthias!

Ich denke, du hast da ggf. ein Verständnisproblem. :wink:

Dein PWM-Signal liegt NUR an dem zuständigen Pin des Tiny13 an!
Wenn du nun verschiedene Gruppen mit dem Signal betreiben möchtest, dann musst du dies mit verschiedenen "Endstufen" realisieren.

Du führst z.B. das PWM-Signal einem Leistungs-PNP-Transistor zu, der alle LED`s mit der Betriebsspannung versorgen.
Mit drei weiteren Ausgängen des Tiny13 steuerst du drei NPN-Transistoren, die dann die LED-Gruppen mit GND Verbinden.


Ich bin aber jetzt schon gespannt, wie du später zwei ADC`s, einen PWM- und drei Schaltausgänge an einen Tiny13 bekommst. :wink:

Grüße,
Cassio
 
Hallo Cassio,

wenn man so will ist die Schaltung komplett fertig ich habe 3 Logiklevel Mosfets die ich gern mit PB0-2 ansteuern würde.

Aber ich hab im Moment denke ich ne Hardware PWM und damit auch nur an pb0 und pb1 ein pwm Ausgang.
Ich denke ich muss irgendwie eine Soft-PWM schreiben deren Ergebnis ich auf ein beliebigen Ausgang legen kann.

stell ich mir vor

ich les mich schon seit heute Morgen durchs Netz aber so richtig fündig bin ich noch nicht geworden

lg Matthias
 
Warum muß es zwingend der Tiny13 sein? Normalerweise sucht man den Controller doch anhand der Anforderungen heraus. Als 8-Beiner hat der Tiny25/45/85 4 HW-OC-Units (von denen aber nur 3 gleichzeitig nutzbar sind). Allerdings verbleiben dann nur noch 2 ADC-Eingänge (und der Reset), scheint für Dich ja zu reichen...

Statt das 10bit-ADC-Result durch 8 zu teilen, kannst Du Dich auch einfach auf das 8bit-Result beschränken, und von diesem nur die obersten 3 bit interpretieren. Jedes Bit schaltet dann einen der 3 HW-Output-Compare-Modes an oder aus (wobei die drei Pins im aus-Zustand dann via DDR/PORT so eingestellt sind, daß Deine LEDs aus sind),

das andere Poti wird auch via 8bit gemessen, und das Ergebnis direkt allen 3 Output Compare Registern zugewiesen...


Warum dimmst Du nicht einfach immer alle LEDs simultan?
 
Warum der Tiny13, weil ich den da habe

Ich glaube ich weiss was du meinst und denke des was ich die letzte Stunde(n) geschrieben hab kommt da in etwa hin.

Es ist sicher nicht sehr effektiv geschrieben aber es funktioniert wie es soll *freu*



Code:
$regfile = "attiny13.dat"
$crystal = 1000000
$hwstack = 10
$swstack = 17
$framesize = 0





Config Portb.0 = Output                                     'Pin5
Config Portb.1 = Output                                     'Pin6
Config Portb.2 = Output                                     'Pin7




Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Pwmt As Integer
Dim Pwmp As Integer
Dim Gruppe As Integer
Dim Ad_2 As Integer
Dim Ad_3 As Integer
Dim A As Bit

Declare Sub Led


Do

  Set A                                                     'impuls tast verhältnis durch adc2
  Call Led
  Waitus Pwmt
  Reset A
  Call Led
  Waitus Pwmp


Ad_2 = Getadc(2)                                            'Pin3 ADC2
Pwmp = 1024 - Ad_2
Pwmt = Ad_2 * 2

Ad_3 = Getadc(3)                                            'Pin2 ADC3
Gruppe = Ad_3


Loop

Sub Led                                                     'ausgabe select durch adc3

    If Gruppe > 900 Then

     Portb.0 = A
     Portb.1 = A
     Portb.2 = A
   Elseif Gruppe > 768 Then

     Portb.0 = 0
     Portb.1 = A
     Portb.2 = A
   Elseif Gruppe > 640 Then

     Portb.0 = A
     Portb.1 = 0
     Portb.2 = A
   Elseif Gruppe > 512 Then

     Portb.0 = A
     Portb.1 = A
     Portb.2 = 0
   Elseif Gruppe > 384 Then

     Portb.0 = 0
     Portb.1 = 0
     Portb.2 = A
   Elseif Gruppe > 256 Then

     Portb.0 = 0
     Portb.1 = A
     Portb.2 = 0
  Elseif Gruppe > 128 Then

     Portb.0 = A
     Portb.1 = 0
     Portb.2 = 0
   End If

End Sub

End

lg Matthias
 
Die Sache ist die, daß Bascom mit getadc immer mit vollen 10bit arbeitet - für deine 8 Kombinationen brauchst Du aber nur 3 Bit. Folglich käme man mit nur 8bit aus. (ADLAR, aber das wird Dir als Bascom-ler nichts sagen).

Der ADC erhält bei seiner Conversion ein 10-bit-Ergebnis, und muß das irgendwie in "einem" Ergebnisregister ablegen. Da die AVR aber 8bit-Controller sind, benötigt er dafür 2 Ergebnisregister: ADCH und ADCL. damit stehen aber 16bit bereit. Im ADC Multiplexer Selection Register kann nun mit ADLAR (ADC Left Adjust Result) festgelegt werden, ob die 10bit linksbündig oder rechtsbündig in diesen 2 Registern landen. Wenn rechtsbündig, landen die unteren 8bit im ADCL, und die letzten beiden im ADCH, getadc liest beide aus und weist sie 'ner 16bit-Variable zu.

Wenn ADLAR gesetzt ist, landen die oberen 8 Bits in ADCH, die letzten beiden in ADCL. Liest man jetzt also nur ADCH aus (in ein Byte), spart man sich das auslesen des 2ten Registers, kommt mit einem Ergebnisbyte aus, und hat defacto bereits durch 4 geteilt (binär zweimal nach rechts geschoben).

Jetzt mal zu Deinen Schaltgrenzen. Warum nicht konsequent:
128=0b00_1000_0000
256=0b01_0000_0000
384=0b01_1000_0000
512=0b10_0000_0000
640=0b10_1000_0000
768=0b11_0000_0000
896=0b11_1000_0000

linksorientiert wäre das dann immer ein viertel davon, auslesen würde man dann:
0b0010_0000
0b0100_0000
0b0110_0000
0b1000_0000
0b1010_0000
0b1100_0000
0b1110_0000

Im Deinem Soft-PWM kannst Du ja davon ausgehen, daß die LEDs vor dem (erneuten) anschalten generell aus sind (Du kannst ja auch immer alle 3 zusammen Abschalten), wenn man das Result also einmal linksschiebt, fällt das oberste Bit ins Carry. Dafür gibt es bedingte Sprungbefehle (jedes IF-Then läuft über sowas ab) - wenn das Carry nicht gesetzt ist, wird einfach die Instruktion übersprungen, die den Port-Pin anschaltet. Das ganze dann noch zweimal für die anderen beiden Bits, und Du kannst Dir den langen IF-Then-Elseif... sparen.

Wäre allerdings Assembler. Da Deine Lösung (zufriedenstellend) funktioniert, will ich Dir da allerdings nicht reinreden - aber vielleicht interessiert Dich, was da hinter getadc und so abläuft, und was eben Deine Ergebnisse sind...

Normalerweise würde man beim soft-PWM mittels Timer einen Takt generieren lassen, und mit diesem Takt eine Variable hochzählen und irgendwo zurücksetzen lassen. Sozusagen einen Software-Timer (der durch einen HW-Timer getaktet wird). Bei jedem inkrement des SW-Timers wird der Zählerstand des SW-Timers mit den PWM-Vorgabewerten verglichen und ggf der Ausgang umgeschaltet, beim Überlauf des SW-Timers wieder zurück. Damit hast Du aus dem SW-Timer einen SW-PWM gemacht - genau so, wie es auch der HW-Timer macht.
Wenn der Timer binär genauso "breit" wie das ermittelte ADC-Ergebnis ist (8 oder 10 bit), braucht man da auch nicht mehr rumrechnen, das ADC-Ergebnis ist dann halt der neue PWM-Vorgabewert.
 
Hallo LotadaC,

Geistig kann ich dir folgen und ich Weiß aus meiner Lehrzeit auch noch das Assembler vielseitiger ist als Bascom, ich hab so viele Hobbys das es mir schwer fällt mich da voll einzuarbeiten, es kommt alle halbe Jahr mal vor das ich was mit Mikrocontrollern mache. Aber vielleicht kommt des noch irgendwann :cool:

Des mit der if abfrage lässt sich sicher auch unter Bascom noch besser machen , ich dachte anfangs auch das es zu viel zeit braucht und die Geschichte vllt anfängt zu flimmern, aber alles ganz sauber und zwischen Mosfet überbrückt und PWM hell ist kaum ein unterschied(darum hatte ich pwmt verdoppelt)

Hab wenn ich voll aufdrehe jetzt ca. 2700lm ..... des reicht

ich hänge mal noch die Schaltung mit an...
(irlr2905)
lg Matthias

Unbenannt.PNG
 
Hi Matthias,

ich hänge mal noch die Schaltung mit an...
(irlr2905)
lg Matthias

Anhang anzeigen 6568

ähh ... die LEDs hast du doch wohl nicht wirklich ohne Vorwiderstände direkt parallel geschaltet oder :rolleyes:

LEDs parallel schalten ohne Widerstände die die kleinen Spannungsunterschiede ausgleichen können ist ... :p

Gruß
Dino
 
Hi Dino,

nein nein keine Angst, die zwei LED´s sind Stellvertretend für jede Gruppe 1.er ring 40 leds (2 leds 1R in reihe x 20 parallel) , zweiter ring 120 und dritter auch 120 (3led´s 1R in reihe x 40 parallel)

lg Matthias
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)