Bauplan Schaltplan Spannungsgesteuerte RGB LED
LED's sind gerade auf breiter Front dabei, sich für Beleuchtungszwecke zu etablieren. Meistens werden die LED's dabei jedoch nur einfach ein oder ausgeschaltet. Im folgenden Projekt wird eine Software für den Atmel Tiny15Controller vorgestellt, welche 3 LED's mittels Pulsweitenmodulation entsprechend einer analogen Spannung von 0 bis 2.5 Volt ansteuern kann. Damit kann eine RGB LED für eine Vielzahl von Anzeigezwecken eingesetzt werden. Mögliche Einsatzbereiche sind Lüfterüberwachung, Temperaturüberwachung, Spannungsüberwachungen..

Das ASM-File zum Download gibts hier.

Das Programm verwendet eine Reihe von Techniken, welche auch in anderen Projekten benötigt werden, z.B.

Lesen und Schreiben des EEPROMs

Timer-Interrupt

Software-Counter

Auslesen des AD-Wandlers

Ein Moving Average Digitalfilter

Beschaltung des Controllers:

Schliessen Sie eine RGB-Led bzw. drei einzelne LED's an die Pins PB0 bis PB2 an (mit entsprechenden Vorwiderständen natürlich)

Ein Taster wird an PB3 angeschlossen, das Analogsignal wird an PB4 angelegt. Das Analogsignal sollte über einen RC-Tiefpass mit 100k/100nF zugeführt werden.

In der Hauptroutine des Programms wird das PWM Signal für die 3 Kanäle erzeugt. Über den Timer Interrupt wird der AD-Wandler ausgelesen, und über eine Nachschlagetabelle ein weitgehend lineares Anzeigeverhalten implementiert. Ein Moving Average Digitalfilter stellt dabei eine sehr ruhige und gleichmässige Anzeigecharakteristik sicher.

Dabei sind folgende Funktionen impementiert:

Durch Drücken des Tasters kann die Reihenfolge umgeschaltet werden, in welcher die LED's zu leuchten beginnen. Dabei gibt es 6 Möglichkeiten

ROT-GRÜN-BLAU

ROT-BLAU-GRÜN

BLAU-ROT-GRÜN

BLAU-GRÜN-ROT

GRÜN-ROT-BLAU

GRÜN-BLAU-ROT

Wenn der Taster länger als ca 3 Sekunden gedrückt bleibt, wird diese Einstellung dauerhaft abgespeichert.

Wenn der Taster während dem Anlegen der Betriebsspannung gedrückt ist, wird die Polarität des Ausgangssignales umgeschaltet. Dadurch können Treiberstufen leichter angeschaltet werden, bzw. LED's sowohl mit gemeinsamer Anode als auch mit gemeinsamer Kathode benutzt werden.

Das Programm wurde mit AVR Studio 4.10 erstellt.

Beim Programmieren bitte den OSCCAL-Wert in die EEPROM-Zelle $3f speichern!

Den vollständigen Quellcode gibts hier zum Download.

;Voltage Control RGB

;(C) 2004 Markus Vohburger

;Gewerbliche Nutzung untersagt

;Definitionen für Tiny15

.include "tn15def.inc"



;Programmvariablen

.def pwmcount = r01

.def pwmvalue_1 = r02

.def pwmvalue_2 = r03

.def pwmvalue_3 = r04

.def mode_1=r05

.def mode_2=r06

.def mode_3=r07

.def omod=r08

.def sbuffer=r09

.def temp1 = r16

.def temp2 = r17

.def output = r18

.def swcount=r19

.def mode=r20




;movin' average filter

.def adcold1 = r23

.def adcold2 = r24

.def adcold3 = r25


.equ EE_MODE = $00

.equ EE_OMOD = $01

.equ EE_OSCCAL = $3f



.equ timer_value = $80

;reset handler

.org $0000

rjmp main


;timer overflow interrut handler

.org T0OVAddr

rjmp T0OVHandler

.org $0010

main:

;read osccal byte

ldi temp1,EE_OSCCAL

rcall readeeprom

out osccal,temp1


ldi temp1,$07

out ddrb,temp1

;port b output LED's Off,, pullup on pb3

ldi temp1,$0f

out portb,temp1



ldi temp1,EE_MODE

rcall readeeprom

cpi temp1,$06

brlo mode_ok

ldi temp1,$00

mode_ok:

mov mode,temp1

rcall readsettings


ldi temp1,EE_OMOD

rcall readeeprom

cpi temp1,$00

breq omod_ok

cpi temp1,$07

breq omod_ok

ldi temp1,$00


omod_ok:

mov omod,temp1



;Taster an PB3 überprüfen

sbic pinb,pb3

rjmp no_omod_change

ldi temp1,$07

eor omod,temp1

;Mode umschalten

ldi temp1,EE_OMOD

mov temp2,omod

rcall writeeeprom






;port setup

;port pb0,1,2 outputs

no_omod_change:



notoggle:

;Timer zurücksetzen

ldi temp1,timer_value

out tcnt0,temp1


;Timer interrupts an

ldi temp1,(1<<toie0)

out timsk,temp1


;Timer starten

ldi temp1,0b00000100

out tccr0,temp1

rcall init_adc

clr swcount


sei


;Hauptschleife für PWM

loop:

;leds aus

ldi output,$0f



cp pwmvalue_1,pwmcount

brsh check_green

;leds an

and output,mode_1



check_green:

cp pwmvalue_2,pwmcount

brsh check_blue

;leds an

and output,mode_2

check_blue:

cp pwmvalue_3,pwmcount

brsh writeoutput

;leds an

and output,mode_3




writeoutput:

eor output,omod

out portb,output

inc pwmcount

brne loop

inc pwmcount

rjmp loop



;Timer Interrupt

T0OVHandler:

;Status sichern

in sbuffer,sreg

;AD-Wandler lesen

in temp1,adch

;dividieren

lsr temp1

lsr temp1

lsr temp1

;Moving Average Filter

mov temp2,temp1

add temp1,adcold1

adc temp1,adcold2

adc temp1,adcold3

mov adcold3,adcold2

mov adcold2,adcold1

mov adcold1,temp2


lsr temp1

lsr temp1




;pwm-Wert aus Tabelle lesen

clr r0

ldi zl,low(table_pwm_1<<1)

ldi zh,high(table_pwm_1<<1)

add zl,temp1

adc zh,r0

lpm

com r0

mov pwmvalue_1,r0

clr r0

ldi zl,low(table_pwm_2<<1)

ldi zh,high(table_pwm_2<<1)

add zl,temp1

adc zh,r0

lpm

com r0

mov pwmvalue_2,r0

clr r0

ldi zl,low(table_pwm_3<<1)

ldi zh,high(table_pwm_3<<1)

add zl,temp1

adc zh,r0

lpm

com r0

mov pwmvalue_3,r0



;Taster abfragen

sbic pinb,pb3

rjmp releasehandler

cpi swcount,$20

brsh exit_ovf0Handler

inc swcount

exit_ovf0Handler:

out sreg,sbuffer

reti


;wenn längere Zeit gedrückt, dann modus speichern

releasehandler:

cpi swcount,$20

breq writemode

;kurze Impulse ignorieren

cpi swcount,$02

brsh key_valid

clr swcount

rjmp exit_ovf0handler

Tabellen

Initialisierungsroutinen

etc...

Den vollständigen Quellcode gibts hier zum Download.

Bauteile für dieses Projekt - Anzeigen:
Aktive Bauelemente

Passive Bauelemente


Weitere Informationen,Grundlagen,Bauanleitung,Schaltplan, Links zum Thema
Anzeigen:

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1212316