I LED (Light Emitting Diode) sono sempre più presenti nella nostra quotidianeità. Sviluppati a partire dagli anni '60, essi si sono progressivamente imposti come sostituti ideali per molte fonti di illuminazione, anche al di fuori dello spettro visibile (es. IR, UV).
I vantaggi? Lunga durata, bassi consumi, colori saturi.
I vantaggi? Lunga durata, bassi consumi, colori saturi.
Oggi, troviamo i LED nelle automobili (interni, luci di posizione, stop, frecce), negli elettrodomestici (retroilluminazione di televisori LCD) e in tantissime altre applicazioni. Non possono quindi mancare anche nel nostro laboratorio!
Prima di proseguire, guardiamo insieme questo video che ho preparato per Voi. Giocheremo con i LED e altro.
Ecco lo schema elettrico del circuito a quattro canali PWM. Esso viene pilotato dalla Linux-Toolbox, che è il nostro sistema tuttofare.
(fare click sull'immagine per ingrandire)
Le porte di I/O LVCMOS sono state prelevate dal connettore DIN41612, come in figura:
Il codice Ansi C, per pilotare ogni I/O è:
/* this function generate four pwm signal */
void pwm(unsigned char p0, unsigned char p1, unsigned char p2, unsigned char p3)
{
int i, count;
/* set gpio 0-3 (PC10-PC13) */
for (i=0; i<256; i++) {
if (i >= p0)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C10;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C10;
if (i >= p1)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C11;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C11;
if (i >= p2)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C12;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C12;
if (i >= p3)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C13;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C13;
for (count=0; count<400; count++); //dummy delay
}
return;
}
int main(int argc, char **argv) {
/* locale variable */
int i;
unsigned char led_r = 0;
unsigned char led_g = 42;
unsigned char led_b = 137;
unsigned char led_g2 = 201;
init_pio(); //inizialize gpio pin
while(1) {
pwm(sinetable[led_r++],
sinetable[led_g++],
sinetable[led_b++],
sinetable[led_g2++]);
}
return 0;
}
Qui Pianeta Terra, a presto.
Il codice Ansi C, per pilotare ogni I/O è:
/* this function generate four pwm signal */
void pwm(unsigned char p0, unsigned char p1, unsigned char p2, unsigned char p3)
{
int i, count;
/* set gpio 0-3 (PC10-PC13) */
for (i=0; i<256; i++) {
if (i >= p0)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C10;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C10;
if (i >= p1)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C11;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C11;
if (i >= p2)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C12;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C12;
if (i >= p3)
*((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C13;
else
*((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C13;
for (count=0; count<400; count++); //dummy delay
}
return;
}
int main(int argc, char **argv) {
/* locale variable */
int i;
unsigned char led_r = 0;
unsigned char led_g = 42;
unsigned char led_b = 137;
unsigned char led_g2 = 201;
init_pio(); //inizialize gpio pin
while(1) {
pwm(sinetable[led_r++],
sinetable[led_g++],
sinetable[led_b++],
sinetable[led_g2++]);
}
return 0;
}
Qui Pianeta Terra, a presto.