Go Down

Topic: Multiplexing con TLC5940 (Read 119 times) previous topic - next topic

stefa168

Jun 03, 2015, 12:46 am Last Edit: Jun 03, 2015, 12:49 am by stefa168
Ciao a tutti. Di recente sto lavorando a un piccolo progettino che richiede l'uso di 8*8 LED RGB.
Avevo già posto una domanda riguardo a questo progetto in un altro topic; ora la domanda è diversa.

Vi spiego la situazione:
Al momento ho 8 righe e 8 colonne. Ho pensato di controllare le 8 colonne con 2 TLC5940 (Sarebbero 8 LED * 3 catodi = 24 collegamenti) e invece le righe attraverso 8 transistor PNP BC327 controllati dal secondo TLC che ha esattamente 8 uscite libere.

Ecco uno schema di quello che sto facendo:



La libreria che sto utilizzando è quella di Alex Leone, che anche se è vecchiotta funziona ancora molto bene.

Infine, lo sketch che utilizzo è questo: (è stato tutto programmato da me)
Code: [Select]
#include "Tlc5940.h"
#define ROWS 8
#define COLUMNS 8

#define BAUDRATE 115200

struct led {

  uint8_t red;
  uint8_t green;
  uint8_t blue;
};

#define SV 0

uint8_t actualRow = 0;

led data[ROWS][COLUMNS];

uint8_t power = 16;

void setup() {

  Serial.begin(BAUDRATE);

  for (byte i = 0; i < ROWS; i++) {
    for (byte j = 0; j < COLUMNS; j++) {
      data[i][j] = {255, 255, 255};
    }
  }

  if (power > 16) {
    power = 16;
  }

  Tlc.init(SV);
  startXLATCallback();
  Tlc.update();

}

void loop() {



}


/** Sezione Multiplexing TLC5940 */

volatile void myXLATCallback() {
  // Imposta i dati da inviare
  setData();
  //Invia i dati
  Tlc.update();
  set_XLAT_interrupt(); // Così la funzione verrà chiamata sempre.

}

// Funzione per far cominciare il ciclo richiamato ogni volta che viene terminato un ciclo XLAT.
void startXLATCallback() {
  // La funzione interna della libreria richiamerà la nostra funzione.
  tlc_onUpdateFinished = myXLATCallback;
  myXLATCallback();
}

void setData() {

  if (actualRow >= 8) {
    actualRow = 0;
  }

  for (uint8_t i = 0; i < COLUMNS * 3; i++) {
    if(i<8)
      Tlc.set(i, data[actualRow][i].red * power);
    else if (i >= 8 && i < 16)
      Tlc.set(i + 1, data[actualRow][i].green * power);
    else
      Tlc.set(i + 2, data[actualRow][i].blue * power);
  }

  for (uint8_t i = 24; i < 32; i++) {
    Tlc.set(i, ((i - 24 ) == actualRow) ? 4095 : 0);
  }

  actualRow++;

}


Il problema che ho, è che i led non si illuminano molto, a differenza di quando hanno l'anodo direttamente collegato ai +5V.

Quà sono con l'anodo direttamente collegato ai +5V

Come posso risolvere questo problema?
Venite a provare il mio nuovo sito web! Contribuite anche voi se volete!
www.twebble.it

uwefed

#1
Jun 03, 2015, 01:17 am Last Edit: Jun 03, 2015, 01:19 am by uwefed
Devi usare la libreria giusta, quella per multiplexing.
http://www.thebox.myzen.co.uk/Hardware/Mini_Monome.html
e www.thebox.myzen.co.uk/Hardware/Mini_Monome_files/Arduino_Firmware.zip

Sei sicuro che non é meglio usare dei WS2812?

Ciao Uwe

cyberhs

#2
Jun 03, 2015, 08:05 am Last Edit: Jun 03, 2015, 08:06 am by cyberhs
Hai usato un resistore da 2.2k sul pin IREF calcolato con la formula R = V / I * 31.5 ove V = 1.24 ed I è la corrente che intendi far passare nei LED.

La corrente può variare tra 5 e 120mA: usando 20mA il resistore deve essere da 2k.

Tuttavia è presente anche la caduta di tensione dei transistore PNP che vale 0.7V che probabilmente riduce la corrente effettiva.

Per ridurre questa caduta di tensione potresti usare dei MOSFET P oppure ridurre la R (ad esempio 1.8k)

stefa168

Devi usare la libreria giusta, quella per multiplexing.
http://www.thebox.myzen.co.uk/Hardware/Mini_Monome.html
e www.thebox.myzen.co.uk/Hardware/Mini_Monome_files/Arduino_Firmware.zip
Il problema è che secondo lo schema del mini monome le righe sono collegate direttamente ai pin dell'arduino, mentre io ho bisogno del maggior numero di pin disponibili...

Sei sicuro che non é meglio usare dei WS2812?
Il problema è che ho già delle PCB che mi sono fatto fare, pronte per lavorare in multiplexing, quindi sarebbe un po' un lavoraccio doverle modificare manualmente...

La corrente può variare tra 5 e 120mA: usando 20mA il resistore deve essere da 2k.
In casa non avevo resistenze da 2K, tuttavia come luminosità massima va già benissimo con quelle da 2.2K, almeno non rischio di bruciare i LED  ;)

Tuttavia è presente anche la caduta di tensione dei transistore PNP che vale 0.7V che probabilmente riduce la corrente effettiva.

Per ridurre questa caduta di tensione potresti usare dei MOSFET P oppure ridurre la R (ad esempio 1.8k)
Non mi sembra di notare particolari cambiamenti tra una riga che è alimentata attraverso il transistor e direttamente ai 5V, tuttavia oggi controllo perchè di sicuro cambia come dici tu.
Riguardo ai mosfet non me ne intendo (mai usati) ma dovrei avere a casa dei 2N7000... possono servire?
Venite a provare il mio nuovo sito web! Contribuite anche voi se volete!
www.twebble.it

uwefed

Quote
Vi spiego la situazione:
Al momento ho 8 righe e 8 colonne. Ho pensato di controllare le 8 colonne con 2 TLC5940 (Sarebbero 8 LED * 3 catodi = 24 collegamenti) e invece le righe attraverso 8 transistor PNP BC327 controllati dal secondo TLC che ha esattamente 8 uscite libere.
Studiati bene il datasheet del TLC5940. Vedrai che il pilotaggio é abbastanza complicato e che il multiplexing deve essere sincronizzato col pilotaggio del PWM senó Ti trovi mezze righe illuminate.

Ciao Uwe


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy