Forum: Mikrocontroller und Digitale Elektronik mit Poti LEDs stufenlos ausgeben


von Djerun (Gast)


Lesenswert?

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.

von Mainboard (Gast)


Lesenswert?

Und nun?
Was erwartest Du?

von Djerun (Gast)


Lesenswert?

Damit man die LEDs per Micronctroller ansteuern kann und sie stufenlos 
hoch un runter gedimmt werden können

von Udo S. (urschmitt)


Lesenswert?

Na dann: Soft-PWM ist dein Zauberwort.

von Der kleine Nils (Gast)


Lesenswert?

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?

von Djerun (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von Christian B. (chbalnuweit)


Lesenswert?

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.

von Djerun (Gast)


Lesenswert?

Danke

von Karl H. (kbuchegg)


Lesenswert?

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
von Djerun (Gast)


Lesenswert?

Danke viel mal. Ich werde es versuchen ;)

von (Gast) (Gast)


Lesenswert?


von dirk h. (Gast)


Lesenswert?

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
}

von dirk h. (Gast)


Lesenswert?

die letzte zeile gehört noch raus...

ADCSRA  |=  (1<<ADSC);

von dirk h. (Gast)


Lesenswert?

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
}

von c-hater (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.