Edoardo Vignali
TCL5940 PWM port expander
Tutorials -
Lunedì 03 Maggio 2010 09:19
Scritto da Edoardo Vignali

Come interfacciare il TCL5940 e Arduino

Introduzione

Il TCL5940 è senza dubbio uno degli integrati prodotti dalla Texas Instruments, più utiliti per un hobbista. Questo integrato vi permetterà di espandere il vostro port pwm di ben 16 pin, ma la sua forza è che se ne possono connettere in serie un numero elevato, quindi con un bus di 2 fili potremo espandere il nostro port di svariati pin pwm.

Il TCL5940 è indispensabile se si vogliono pilotare molti LED o Servimotori oppure motori DC di bassa potenza (in questo caso si dovrà mettere dei diodi di protezione per evitare di danneggiare l'integrato a causa dei picchi di corrente dovuti alla frenata del motore.)

TLC5940

Caratteristiche tecniche

  • 16 bit di port pwm
  • Pwm con risoluzione a 12bit
  • Dot correction: programmabile su una eeprom embedded oppure utilizzando la 6bit correction.
  • Iout max: 60mA se VCC3.6.
  • Alimentazione led fino a 17V
  • 30MHz di Data Transfer Rateù
  • Package: HTSSOP, QFN e PDIP.
  • Individuazione di Errori:
    • LOD: (LED Open detection) led rotto
    • TEF: (Thermal error flag)  flag che si alza quando si supera la soglia termica critica

Dimensionamento dell'integrato

Imax = (Viref/Riref)*31.5

La massima corrente di uscita è programmabile scegliendo una resistenza che va dal pin IREF a massa, deve assumere un valore compreso tra 5mA e 120mA. La Viref ha un valore fisso pari a 1.24V. La IREF sarà la corrente in uscita dei pin OUT0...OUT15.

PD = (Vcc x Icc) + (Vout x Imax x (DCn/63) x dPWM x N)

La potenza dissipata si calcola con questa formula, le variabili di questa equazione sono

Vcc: V di alimentazione

Icc: Corrente assorbita

Vout : Tensione sulle n uscite quando si pilotano LED.

Imax : Settata dall utente

DCn: La massima il valore massimo di Dot Correction per ogni OUTn.

N: numero di OUTn che pilotano Led

dPWM: duty cycle definito dal pin BLANK o nel GS PWM value.

Pin info

  • XERR: bit di flag che indica quando l'integrato ha raggiunto la temperatura critica oppure quando un led si è rotto. Possiamo ignorare questo pin.
  • SOUT: Serial Data OUT. Serve per connettere più TLC5940 in cascata (Daisy Chain), quindi antrà connesso con il SIN del TCL5940 successivo.
  • DCPRG: Scegliere se DC è connesso alla EEPROM o al DCREGISTER. Generalmente si pone a '1'. Può essere impostatato per programmare la EEPROM.
  • XLAT: Si usa per shiftare i dati in uscita.
  • SCLK: Si usa per sincronizzare la comunicazione.
  • SIN: Ingresso dei dati seriali da Arduino al TLC5940.
  • VPRG: Si utilizza questo pin per selezionare o la modalità dell'integrato, che può essere GSMODE: (192bit di PWM) oppure DCMODE (96bit di PWM con dot correction).
  • GSCLK: Clock per il pwm. Dato che la libreria per gestire questo integrato con arduino utilizzerà i pin 11 e 3, questi 2 pin non avranno più la frequenza nativa di PWM.
  • BLANK: Segna la fine del ciclo di PWM e svuota l'uscita.

GREYSCALE vs DOTCORRECTION

La modalità greyscale di gestione degli output consiste nell'inviare in uscita un segnale di tipo PWM. L'utilizzo di 12bit da la possibilità di avere una sensibilità maggiore nella suddivisione del periodo di PWM, infatti lo potremo dividere in 4096 step.

grayscale

Quando VPRG è a massa, l'integrato prende dati direttamente dai registri di greyscale per mandarli in uscita sul pin desiderato appena abbiamo un fronte di salita sull XLAT. Questa modalità si usa per un controllo in tensione.

La modalità dot correction ha la possibilità di regolare indipendentemente le correnti di uscita dei pin OUT0 ... OUT15. La dot correction permette di correggere manualmente eventuali deviazioni di luminosità(in caso si pilotino dei led). Ogni canale può essere programmato con una word di 6-bit. Ogni canale può essere tarato con 64steps dallo 0% al 100% della massima corrente di uscita Imax.

IOUT=IMAX x DCn/63

DCn può variare da 0 a 63 e la IMAX è quella calcolata qualche paragrafo sopra.

dot correction

Quando il pin VPRG è posto a Vcc allora il TLC5940 entra in dot correction mode, la lunghezza dello shift register diventa 92bit e sul fronte di salita di XLAT i dati vengono mandati sul port di uscita.

Interfacciarsi al TLC5940 tramite Arduino

Potete trovare la libreria TLC5940 a questo link (libreria in fase di sviluppo, qui trovate gli aggiornamenti).

Gestione della progmem

Dopo aver incluso #include "tlc_config.h" potremo scegliere come gestirci la progmem.

  • void tlc_setGSfromProgmem(prog_uint8_t* gsArray)

Setta l'integrato in Grayscale mode.

  • void tlc_setDCfromProgmem(prog_uint8_t*dcArray)

Setta l'integrato in Dot Correction mode.

es.

#include "tlc_progmem_utils.h"
prog_uint8_t dcArray1[NUM_TLCS * 12] = {
DC_QUARTET(32, 63, 32, 63), DC_QUARTET(32, 63, 32, 63),
DC_QUARTET(32, 63, 32, 63), DC_QUARTET(32, 63, 32, 63),
};

// sometime after Tlc.init()
tlc_setDCfromProgmem(dcArray1);

Questa funzione setterà ogni altro canale in modalità dot correction 32. L'array dovrà essere espanso se il numero dei tlc sarà maggiore di 1.

Funzioni che richiedono VPRG a VCC

  • void tlc_setDCfromProgmem(prog_uint8_t*dcArray)

già vista prima, se vogliamo settare tutti gli array della progmem come dotcorrection basterà chiamare

  • Tlc.setAllDC(uint8_t value(0-63))

Parametri:

  • value è il valore a cui settare ogni array della DotCorrection appartenente al port di uscita.
  • void Tlc.init();

Pin I/O e inizzializza i timer.

  • void Tlc.clear(),

Cancella tutti i dati i dati precedentemente immessi negli array di Greyscale apparenenti al port di uscita, questa funzione non shifta e ha bisogno di un update dopo che è stata chiamata

  • uint8_t Tlc.update()

shifta i dati negli array di greyscale nei dati accessibili da SOUT

  • void Tlc.set(TLC_CHANNEL_TYPE channel, uint16_t value);

Setta il canale channel al valore value dell'array di dati Grayscale

  • uint16_t Tlc.get(TLC_CHANNEL_TYPE channel)

Restituisce il valore dell'array di grayscale a cui un determinato canale channel è stato settato.

  • void Tlc.setAll(uint16_t value);

Setta tutti i canali allo stesso valore value dell'array di Greyscale.

  • void Tlc.setAllDC(uint8_t value);

Setta tutti i canali allo stesso valore value dell'array di DotCorrection.

  • uint8_t Tlc.readXERR();

Controlla se ci sono led rotti, resituisce 1 in caso ci sia un errore.

 

Funzioni della libreria estesa

  • uint8_t tlc_add_Fade(TLC_CHANNEL_TYPE channel, int16_t startValue, int16_t endValue, uint32_t startMillis, uint32_t endMillis);

Parametri:

  • channel è il canale di output in cui si vuol fare il fading
  • startValue è il valore dell'inizio del fade
  • endValue è il valore finale del fade
  • startMillis() quando far iniziare il fade
  • endMillis() quando far finire il fade

Restituisce zero quano dil fade buffer è pieno.

  • uint8 tlc_addFade(struct Tlc_Fade * fade)

Parametri

  • fade valore di fade che sarà copiato nel relativo buffer

resistuisce 0 quando il buffer è pieno

  • uint16 tlc_angleToVal (uint8 angle)

converte un angolo nel valore di pwm da inviare a un servo.

  • volatile void tlc_animationXLATCallback (void)

Chiama un interrupt su XLAT ogni ciclo di pwm

  • uint8_t tlc_getServo(TLC_CHANNEL_TYPE channel)

Ottiene l'angolo a cui è stato settato un servo sul canale channel

Parametri:

  • channel: canale da cui ottenere l'angolo del servo
  • uint8_t tlc_isFading(TLC_CHANNEL_TYPE channel)

controlla se stanno avvenendo dei fade sul port del canale

Parametri

  • channel: canale da controllare

Restituisce 1 se c'è un fade sul buffer su quel determinato canale

  • void tlc_playAnimation(prog_uint8_t*animation, uint16_t frames,uint16_t periodsPerFrame);

Produce animazioni immagazzinate nella progmem

Parametri:

  • animation: accede alla progmem e carica dati, corrispondenti alla posizione del valore che si vuole mandare in uscita, dall array  di greyscale. La larghezza dell'array animation è NUM_TLCS*24*frames. Prima di chiamare questa funzione è necessario che non ci siano update in corso.
  • frames numero di frame dell'animazione
  • periodsPerFrame numero di periodi PWM da aspettare per ogni frame (0 vuol dire che l'animazione deve essere velocissima). Il periodo pwm di default è 16MHz.
  • uint8_t tlc_removeFades(TLC_CHANNEL_TYPE channel)

rimuove ogni fade dal buffer relativo a quel canale

Parametri:

  • channel canale in cui si trovano i fade da rimuovere

Restituisce il numero di fade rimossi

  • void tlc_setGSfromProgmem (prog_uint8_t* gsArray)

Setta gli array di Grayscale con i dati provenienti dalla progmem

Questa istruzione non shifterà nessun dato

es:

#include "tlc_progmem_utils.h"
prog_uint8_t gsArray1[NUM_TLCS * 24] = {
GS_DUO((4095 * 16)/16, (4095 * 15)/16), GS_DUO((4095 * 14)/16, (4095 * 13)/16),
GS_DUO((4095 * 12)/16, (4095 * 11)/16), GS_DUO((4095 * 10)/16, (4095 * 9)/16),
GS_DUO((4095 * 8)/16, (4095 * 7)/16), GS_DUO((4095 * 6)/16, (4095 * 5)/16),
GS_DUO((4095 * 4)/16, (4095 * 3)/16), GS_DUO((4095 * 2)/16, (4095 * 1)/16),
};
// sometime after Tlc.init()
tlc_setGSfromProgmem(gsArray1);
Tlc.update();

Queste istruzioni setteranno una rampa di valori dall uscita OUT0 a OUT15. L'array dovrà essere espanso se NUM_TCLS !=1.

  • void tlc_setServo(TLC_CHANNEL_TYPE channel, uint8_t angle)

setta un servo a un dato angolo

Parametri:

  • channel è il canale in cui si trova il servo
  • angle angolo da settare
  • uint16_t tlc_shiftDown(uint16_t topValue)

Shifta tutti i dati nei canali di uno verso il basso (es: OUT15->OUT14) e ha bisogno di Tlc.update(); dopo aver chiamato la funzione.

Parametri

  • topValue il valore da inserire in OUT16

Restituisce il valore shiftato shiftato fuori di OUT0.

  • uint16_t tlc_shiftUP(uint16_t seroValue)

Shifta tutti i dati nei canali in alto (quindi OUT0->OUT1) e ha bisogno di un Tlc.update() dopo aver chiamato la funzione.

Parametri

  • zeroValue il valore da inserire in OUT0

Restituisce il valore di OUT15 shiftato fuori.

  • uint8_t tlc_updateFades(uint32_t currentMillis)

Aggiorna ogni fade in corso

  • currentMillis è il tempo millis() in quell'istante, può essere chiamata anche senza specificare l'argomento della funzione.

Restituisce 0 se non sono rimasti più fade nelle code di buffer.

  • uint8_t tlc_valToAngle (uint16_t value)

converte un valore da 4095 a 0 in un angolo.

 

NOTE

[1]uint8_t è un byte di 8 bit, uint16_t è un byte di 16 bit e così via.

Collegamenti

Per un solo TLC5940

breadboard tlc5940

Per più di un TLC5490

breadboard due tlc5940

Liberamente tratto dal playground inglese di Arduino.

CC

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi