Die LED’s sollen anhand eines Potentiometer-Wertes leuchten. Dabei steht jedes LED für 12,5%. Das jeweils nächste LED soll stufenlos hoch, bzw. runtergedimmt werden. Zum leuchten bringe ich sie. Nur nicht Stufenlos.
Damit man die LEDs per Micronctroller ansteuern kann und sie stufenlos hoch un runter gedimmt werden können
Djerun schrieb: > Die LED’s sollen anhand eines Potentiometer-Wertes leuchten. Klar soweit. Djerun schrieb: > Dabei steht > jedes LED für 12,5%. Das jeweils nächste LED soll stufenlos hoch, bzw. > runtergedimmt werden. Jede LED steht für 12,5% und dann "stufenlos" passt nicht zu 100% in meine Welt. Sehe ich das richtig, dass die 12,5% das Poti in entsprechende Bereiche einteilen und innerhalb des Bereiches die jeweilige LED heller bzw. dunkler werden soll? Also wenn quasi der maximale Helligkeitsweit on LED X erreicht ist dann startet beginnt die nächste LED mit ihrer minimalen Leuchtkraft?
die erste LED soll bei einem Poti stand von 12.5% voll leuchten. die zweite LED bei 25% des Potis stand voll leucht. usw. und zwischen diesen werten soll immer die nächste led heller werden.
Djerun schrieb: > die erste LED soll bei einem Poti stand von 12.5% voll leuchten. > die zweite LED bei 25% des Potis stand voll leucht. usw. > > und zwischen diesen werten soll immer die nächste led heller werden. Gut. Dann kümmere dich mal darum, dass du deine unbekannte Anzahl von LED unabhängig voneinander dimmen kannst. Das Zauberwort 'Soft-PWM' ist ja schon gefallen. Und ja, du wirst einen Timer dazu brauchen. FAQ: Timer
:
Bearbeitet durch User
Ja wie bereits erwähnt: Soft-PWM! Dein AVR wird kaum 8 PWM-Kanäle haben ;-) AD-Wert des Poti einlesen und dann entsprechend die Pulsweiten berechnen und auf die LEDs geben.
Für eine LED an einem AVR könnte eine einfache Software-PWM zb so aussehen.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | #define LED_DDR DDRB
|
5 | #define LED_PORT PORTB
|
6 | #define LED1_PIN PB1
|
7 | |
8 | volatile uint8_t dimmLed1; |
9 | |
10 | ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector |
11 | {
|
12 | static uint8_t pwmCnt; |
13 | |
14 | pwmCnt++; |
15 | |
16 | if( dimmLed1 > pwmCnt ) |
17 | LED_PORT |= ( 1 << LED1_PIN ); |
18 | else
|
19 | LED_PORT &= ~( 1 << LED1_PIN ); |
20 | }
|
21 | |
22 | int main() |
23 | {
|
24 | LED_DDR |= ( 1 << LED1_PIN ); |
25 | |
26 | dimmLed1 = 128; // Helligkeit der LED |
27 | |
28 | TIMSK |= (1<<TOIE0); // den Overflow Interrupt des Timers freigeben |
29 | TCCR0 = (1<<CS00); // Vorteiler 1, jetzt zählt der Timer bereits |
30 | |
31 | |
32 | sei(); // und Interrupts generell freigeben |
33 | |
34 | |
35 | while( 1 ) |
36 | { // hier braucht nichts mehr gemacht werden. |
37 | } // der Timer selbst sorgt dafür, dass die ISR Funktion |
38 | } // regelmäßig aufgerufen wird |
:
Bearbeitet durch User
All you need auf dem Silbertablett, aber nur weil jetzt Wochenende ist :) http://www.mikrocontroller.net/articles/Soft-PWM http://www.mikrocontroller.net/articles/LED-Fading http://www.mikrocontroller.net/articles/AD-Wandler
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | uint16_t pwmtable[32]={ |
5 | |
6 | 0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23, |
7 | 27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255 |
8 | };
|
9 | |
10 | unsigned char ADC_value=0; |
11 | char brightness; |
12 | char pwm_count=0; |
13 | char LED; |
14 | |
15 | |
16 | |
17 | |
18 | ISR(TIMER0_OVF_vect) |
19 | {
|
20 | |
21 | pwm_count++; |
22 | |
23 | if(pwm_count<brightness) |
24 | {
|
25 | PORTB |=(1<<LED); |
26 | }
|
27 | else
|
28 | {
|
29 | PORTB &= ~(1<<LED); |
30 | }
|
31 | |
32 | }
|
33 | |
34 | |
35 | |
36 | int main(void) |
37 | {
|
38 | |
39 | ADMUX |=(1<<REFS0)|(1<<ADLAR)|(1<<MUX0); |
40 | ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADPS0)|(1<<ADPS2)|(1<<ADIF); |
41 | |
42 | TCCR0 |= (1<<CS00);//|(CS02); |
43 | TIMSK |= (1<<TOIE0); |
44 | |
45 | DDRB=0xff; |
46 | |
47 | sei(); |
48 | |
49 | //ADC_value=97;
|
50 | int x; |
51 | |
52 | while(1) |
53 | {
|
54 | ADC_value=ADCH; |
55 | |
56 | if(ADC_value<32){ PORTB=0x00; LED=0;} |
57 | if((ADC_value>=32)&&(ADC_value<32*2)){ PORTB=0x01; LED=1;} |
58 | if((ADC_value>=32*2)&&(ADC_value<32*3)){ PORTB|=0x03; LED=2;} |
59 | if((ADC_value>=32*3)&&(ADC_value<32*4)){ PORTB|=0x07; LED=3;} |
60 | if((ADC_value>=32*4)&&(ADC_value<32*5)){ PORTB|=0x0f; LED=4;} |
61 | if((ADC_value>=32*5)&&(ADC_value<32*6)){ PORTB|=0x1f; LED=5;} |
62 | if((ADC_value>=32*6)&&(ADC_value<32*7)){ PORTB|=0x3f; LED=6;} |
63 | if((ADC_value>=32*7)&&(ADC_value<32*8)){ PORTB|=0x7f; LED=7;} |
64 | |
65 | x=ADC_value%32; |
66 | |
67 | brightness=pwmtable[x];//ADC_value%32; |
68 | |
69 | |
70 | |
71 | ADCSRA |= (1<<ADSC); |
72 | |
73 | }
|
74 | |
75 | |
76 | |
77 | |
78 | }
|
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | uint16_t pwmtable[32]={ |
5 | |
6 | 0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23, |
7 | 27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255 |
8 | };
|
9 | |
10 | char ADC_value=250; |
11 | char brightness; |
12 | char pwm_count; |
13 | char LED=7; |
14 | int x; |
15 | |
16 | |
17 | |
18 | ISR(TIMER0_OVF_vect) |
19 | {
|
20 | |
21 | pwm_count++; |
22 | |
23 | if(pwm_count<brightness) |
24 | {
|
25 | PORTB |=(1<<LED); |
26 | |
27 | }
|
28 | else
|
29 | {
|
30 | PORTB&=~(255<<LED); |
31 | }
|
32 | |
33 | }
|
34 | |
35 | ISR(ADC_vect) |
36 | {
|
37 | |
38 | ADC_value=ADCH; |
39 | |
40 | LED=ADC_value/32; |
41 | |
42 | |
43 | brightness=pwmtable[ADC_value%32]; |
44 | |
45 | ADCSRA|=(1<<ADSC); |
46 | |
47 | |
48 | }
|
49 | |
50 | int main(void) |
51 | {
|
52 | |
53 | ADMUX |=(1<<REFS0)|(1<<ADLAR)|(1<<MUX0); |
54 | ADCSRA |= (1<<ADEN)|(1<<ADPS0)|(1<<ADPS2)|(1<<ADIE)|(1<<ADSC); |
55 | |
56 | |
57 | TCCR0 |= (1<<CS00); |
58 | TIMSK |= (1<<TOIE0); |
59 | |
60 | |
61 | DDRB=0xff; |
62 | |
63 | sei(); |
64 | |
65 | |
66 | ADCSRA|=(1<<ADSC); |
67 | |
68 | while(1) |
69 | |
70 | }
|
Djerun schrieb: > Zum leuchten bringe ich sie. Nur nicht Stufenlos. Tja, dann solltest du das vielleicht ändern, wenn "stufenlos" dein Ziel ist... Früher (tm) nannte man die dazu nötige Tätigkeit "programmieren". Solltest du vielleicht auch mal versuchen... Als Tipp: das ist was anderes, als fremden Quelltext per Copy&Paste zu übernehmen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.