AVR C 74hc595 multiplexación de matriz rgb y brillo

0

He construido una matriz de prueba 2 * 2 rgb LED, ánodo común. Conectó los ánodos en columnas, y los cátodos a través de resistencias 220R en filas R, G, B. Ambos van a dos registros de desplazamiento diferentes de 74hc595. Luego estoy utilizando este código para iluminar dos LEDs en diagonal desde una atmega48 conectada a los registros (abajo a la izquierda y arriba a la derecha).

/*
 * RGBMatrix.c
 *
 * Created: 15.12.2017 23:35:52
 * Author : Rando Hinn
 */ 
#define F_CPU 1000000UL
#include <avr/io.h>
#include "util/delay.h"
#define data_out PB2
#define shift_clock PB1
#define store_clock PB0

#define rgb_out PC5
#define rgbshift_clock PC4
#define rgbstore_clock PC3

#define SetBit(BIT, PORT) (PORT |= (1<<BIT))  
#define ClearBit(BIT, PORT) (PORT &= ~(1<<BIT))

void shiftOut(uint8_t data) {
    for(uint8_t i=0;i<8;i++) {
        if(data & 0b10000000) {
            SetBit(data_out, PORTB);
        } else {
            ClearBit(data_out, PORTB);
        }
        SetBit(shift_clock, PORTB);
        ClearBit(shift_clock, PORTB);
        data=data<<1;
    }
    SetBit(store_clock, PORTB);
    ClearBit(store_clock, PORTB);
    return;
}

void shiftOutRGB(uint8_t data) {
    for(uint8_t i=0;i<8;i++) {
        if(data & 0b10000000) {
            SetBit(rgb_out, PORTC);
        } else {
            ClearBit(rgb_out, PORTC);
        }
        SetBit(rgbshift_clock, PORTC);
        ClearBit(rgbshift_clock, PORTC);
        data=data<<1;
    }
    SetBit(rgbstore_clock, PORTC);
    ClearBit(rgbstore_clock, PORTC);
    return;
}

int main(void)
{
    DDRB|=((1<<shift_clock)|(1<<store_clock)|(1<<data_out));
    DDRC|=((1<<rgbshift_clock)|(1<<rgbstore_clock)|(1<<rgb_out));
    /*RCOL/LCOL*/
    //shiftOut(0b10111111);

    //shiftOutRGB(0b11010100);
    /*BOT_R/BOT_G/BOT_B/TOP_R/TOP_G/TOP_B/NA/NA active low*/
    while(1) {
        shiftOutRGB(0b01111111);
        shiftOut(0b01000000);
        _delay_us(60);
        shiftOutRGB(0b11111011);
        shiftOut(0b10000000);
        _delay_us(60);

    }
}

El problema aquí es que, si bien hago que los LED se enciendan, están increíblemente apagados. Cambiar los retrasos a ms, los hace más brillantes pero provoca un parpadeo visible. ¿Qué podría hacer para encender correctamente los LED?

    
pregunta Rando Hinn

1 respuesta

3

Parece que su programa tiene un problema con el efecto fantasma. No veo que se apague la unidad de ánodo antes de cambiar la unidad de cátodo.

En lo que respecta al brillo, me parece desde el punto de vista del código que tiene los LED encendidos todo el tiempo, por lo que el ciclo de trabajo es aproximadamente del 50% para los LED "encendidos". Verifique esto de alguna manera, preferiblemente con un osciloscopio.

En ese caso, tendría que aumentar la corriente (o utilizar LED mucho mejores). El 74HC595 no es excelente para la fuente de corriente y usted está solicitando la fuente de corriente para (ahora mismo) 7 LED, por lo que la carga es como un LED con 31 ohms en serie. Si solo enciende un único LED, probablemente verá mucho más brillo.

Puede agregar controladores de ánodo (por ejemplo, usar el 74HC595s para cambiar los MOSFET de canal P). A continuación, estará limitado por la corriente máxima de 70 mA GND de los 595. Si va a 60 mA, eso es 1,8 mA por LED en una matriz de 2 de 4. Tal vez sea suficiente con buenos LED, de lo contrario también tiene que agregar controladores de cátodo.

Como ha descubierto, el brillo no cambia significativamente con el tiempo hasta que cae por debajo de la frecuencia de fusión de parpadeo, es básicamente la corriente de LED promedio. No hay almuerzos gratis.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas