acabou de chegar TLC5620 DAC com 4 saidas independentes, alguem já mexeu ?

Olá galera,

    De volta a meus estudos com DACs,  consegui com a ajuda do grande zé gustavo colocar o MCP4822 pra funcionar, com suas duas saidas,    mas queria mais,  dai mandei pegar o TLC5620 que tem 4 saidas,   bem.. ele acabou de chegar,  dei uma rapida fuçada na net,  mas tem pouquissimo material,   alguem aqui já mexeu com ele?

Ah!  e acabei de descobri que existe o TLC5628  putz,  8 saidas analogicas controladas por apenas 3 pinos,  fantastico,   assim que conseguir colocar pra funcionar o TLC5620 vou mandar pegar esse aqui. ( http://www.ti.com/lit/ds/symlink/tlc5628.pdf )

Mas por enquanto minha duvida continua:   alguem já mexeu com o tlc520 ?

Exibições: 670

Responder esta

Respostas a este tópico

Bom dia Weider, tudo bem ?

Minha primeira pergunta : o conversor DAC de 8 bits somente, atenderá a sua necessidade ?

Oito bits pemirtirá uma resolução muito baixa - somente 256 níveis .

Data sheet do TLC5620. QUADRUPLE 8-BIT DIGITAL-TO-ANALOG CONVERTERS

http://www.ti.com/lit/ds/symlink/tlc5620.pdf

Pino VDD - Alimentação - use 5V 

Interessante que ele possui uma entrada de tensão de referência para cada canal DAC. 

Mas não entendi porque a tensão máxima VREF é de VDD - 1,5V = 5 - 1,5 = 3,5 V ???

Sugiro que use uma tensão de 2,5 V nos pinos REFA, REFB, REFC e REFD 

http://ww1.microchip.com/downloads/en/DeviceDoc/21653C.pdf

A comunicação é serial :

CLK - entrada serial interface clock 

DATA - entrada de dados da Interface Serial. Cada bit de dado é enviado para o registrador de entrada durante a borda de queda do sinal de Clock. 

LOAD - entrada para a carga dos dados nos registradores dos DACs . Quando o outro pino LDAC estiver no nível baixo e a borda de queda do pulso LOAD ocorrer, os dados são enviados para os registradores de saída dos DACs. 

O pino LDAC serve para  controle das saídas de tensão dos DACs, enquanto estiver carregando os registradores. 

Nível alto - a  tensão na saída dos DACs é mantida, mesmo carregando os registradores dos DACs 

Nível baixo  para alto - as saídas são atualizadas com os registradores

Enviando os dados para o TLC 5620 :

Essa é a sequencia que deverá enviar os dados para o seu conversor TLC5620

MSB FIRST - bit mais significante primeiro 

A1 - A0 - RNG - D7 - D6 - D5 - D4 - D3 - D2 - D1 - D0 

RNG = 0 >  variação de tensão de saída entre VREF e GND ( por exemplo - entre 2,5 e 0V)  Se VREF = 2,5V 

RNG = 1 > variação de tensão de saída é dobrada ( por exemplo - entre 5,0V e 0V)  Se VREF = 2,5V

Esse é o endereçamento dos quatro DACs :

Rotinas de comunicação com o TL5620 :

Será que o nosso professor Rui Viana, PHD em Arduino poderá ajudar ?

Esses são os exemplos de referência da comunicação serial :

http://labdegaragem.com/profiles/blogs/tutorial-sobre-pcf8574-e-com...

http://labdegaragem.com/forum/topics/anatomia-do-ci-74xxx595

Será necessário serializar os bits e sincroniza-los através da linha de clock . 

As linhas LDAC e LOAD serão usadas só no final da comunicação . 

Oi JGAM, boa tarde.

O que você está sugerindo é um code que use este protocolo, e para envie dados para os TLC5620/TLC5628?

Rui

Exatamente caro Mestre ! 

Abraços .

Aos grandes mestres Zé gustavo e rui  Meu muito obrigado pela atenção.


Sim, zé gustavo,  8 bits tá otimo pra mim,  até porque se pensarmos bem esse é o padrão do arduino, ou seja, as saidas PWM que simulam saida digital apesar de internamente ser de 8 e 10 bits,  operam apenas como 8 bits ( 0 a 255).


O que estou fascinado é que ja tinhamos a expansão de portas como CI 74HC595, para digitais, ou algumas loucas entradas analogicas por interpolaçao a mais,  o CI tlc5940 para PWM, e agora estamos vendo CIS não so pra aumentar, mas para criar verdadeiras portas analogicas e em grande quantidade como o dac5628 usando simples 3 pinos do SPI,  isso é fantastico.
  Isso dá um poder de fogo enorme a um atmega328 que fica limitado apenas pelos 32k de memoria flash programavel que infelizmente não temos como expandir,  realmente uma pena.


   Eu dei uma lida no que vocês colocaram, e bem,  se pra o tlc5620 eu não achei muito,  pra o tlc5628 encontrei algumas coisas bem interessantes,  ainda não pude testar mas o que vocês diriam desse site aqui:

wiblocks.luciani.org/docs/app-notes/nb1a-dac.html

Weider , a unica diferença que eu encontrei é que  o TLC5620 trabalha com 5V e o TLV5620 trabalha com 3V . Eu ainda não li todo data sheet. 

Se a gente analisar o protocolo SPI, podemos encontrar grandes similaridades entre a Interface serial do TLC5620. Não vejo nenhum risco de fazer o teste. Veja que tem uma biblioteca chamada DAC que deve ser usada. 

Depois nos conte, se funcionou. 

Aêeeeee   funcionou direitinho.

   Sim, dá pra utilizar a biblioteca SPI ou bibliotecas prontas,  até pode simplificar a coisa,  mas limita o projeto, pois deixa você atrelado e fixada a aquilo.

   O grande legal do que descobri, foram paginas que ensinam sketchs que utilizam uma função anexada no fim do code, que faz todo o papel de comunicação binaria, dai simplifica pacas a coisa.

    Bem,  eu me utilizei do material de 3 paginas web, mas com foco em uma delas, enxuguei o code bastante,  e depois meti umas coisas pra criar o sketch base de teste, ao qual anexo abaixo.

    O graaaaaaaaande legal é que são 4 pinos quaisquer, escolhidos, deixando livre os pinos SPI padrão pra fazer o que quisermos.

    O resultado é incrivelmente estavel e preciso,  apesar que percebi que amperagem do sinal gerado é bem fraquinha, coisa pra sinal mesmo,  descobri isso quando coloquei um led junto e o simples consumo do led derrubava a tensão para metade da leitura.

/*
*** Code para funcionamento do DAC CI TLC5620 sem uso de bibliotecas ***

Funcionamento: um potenciometro gera um sinal analogico real que e lido
pelo pino A0, um botao ligado ao pino 8 escolhe qual das 4 portas do DAC
ira receber o sinal para gerar a saida.

PINAGEM:

TLC5620    ARDUINO
1          GND
2          DIVISOR DE TENSAO
3          DIVISOR DE TENSAO
4          DIVISOR DE TENSAO
5          DIVISOR DE TENSAO
6          2
7          3

8          4
9          A1
10         A2
11         A3
12         A4
13         5
14         5VCC

POTENCIOMETRO     A0

adaptacao por weider do code de Frank A. Dullinger ( bollwerk-essen.bplaced.net/?arduino_tlc5620 )
*/





#define PIN_DATA  2   // TLC5620 Pin 6
#define PIN_CLK   3   // TLC5620 Pin 7
#define PIN_LOAD  4   // TLC5620 Pin 8
#define PIN_LDAC  5   // TLC5620 Pin 13

int valanalog = 0;
int pinodavez = 0;
int fixaleitura = 0;
int fixpinodavez = 0;


void setup() {
  Serial.begin(9600);
  pinMode(PIN_DATA, OUTPUT);
  pinMode(PIN_CLK,  OUTPUT);
  pinMode(PIN_LOAD, OUTPUT);
  pinMode(PIN_LDAC, OUTPUT);
  pinMode(8, INPUT_PULLUP);
 
  writeTLC5620(0, 0);
  writeTLC5620(1, 0);
  writeTLC5620(2, 0);
  writeTLC5620(3, 0);
}

void loop() {
    valanalog = analogRead(A0) / 4;   
    writeTLC5620(pinodavez, valanalog);   // ( pino 0 a 3 , valor de 0 a 255)
   
    if(digitalRead(8)==0){pinodavez++;}
    if(pinodavez==4){pinodavez=0;}
 
  if(valanalog != fixaleitura  ||  pinodavez != fixpinodavez ){
    fixaleitura = valanalog;
    fixpinodavez = pinodavez;
   
    Serial.print("pinodavez:");
    Serial.println(pinodavez);
    Serial.print("valanalog:");
    Serial.println(valanalog);
   
    Serial.print("Valor A1:");
    Serial.print(analogRead(A1));
    Serial.print(" / ");
    Serial.println(analogRead(A1) /4 );
   
   
    Serial.print("Valor A2:");
    Serial.print(analogRead(A2));
    Serial.print(" / ");
    Serial.println(analogRead(A2) /4 );
   
   
   
    Serial.print("Valor A3:");
    Serial.print(analogRead(A3));
    Serial.print(" / ");
    Serial.println(analogRead(A3) /4 );

   
   
    Serial.print("Valor A4:");
    Serial.print(analogRead(A4));
    Serial.print(" / ");
    Serial.println(analogRead(A4) /4 );

   
    Serial.println("**********************************");
   
    delay(500);
   
  }
   
   
}




void writeTLC5620(int channel , int data) {
  int MSB;
  int LSB;
  int range=1; // mudar para 0 se quiser saida com metade do valor
  MSB = (channel & 0x03) 1 | (range & 0x01) 0;
  LSB = data;
  digitalWrite(PIN_LDAC, HIGH);
  digitalWrite(PIN_LOAD, HIGH);
  shiftOut(PIN_DATA, PIN_CLK, MSBFIRST, MSB);
  shiftOut(PIN_DATA, PIN_CLK, MSBFIRST, LSB);
  digitalWrite(PIN_LOAD, LOW);
  delayMicroseconds(10);
  digitalWrite(PIN_LOAD, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_LDAC, LOW);
  delayMicroseconds(10);
  digitalWrite(PIN_LDAC, HIGH);
}

    

/*
*** Code para funcionamento do DAC CI TLC5620 sem uso de bibliotecas ***

Funcionamento: um potenciometro gera um sinal analogico real que e lido
pelo pino A0, um botao ligado ao pino 8 escolhe qual das 4 portas do DAC
ira receber o sinal para gerar a saida.

PINAGEM:

TLC5620    ARDUINO
1          GND
2          DIVISOR DE TENSAO
3          DIVISOR DE TENSAO
4          DIVISOR DE TENSAO
5          DIVISOR DE TENSAO
6          2
7          3

8          4
9          A1
10         A2
11         A3
12         A4
13         5
14         5VCC

POTENCIOMETRO     A0

adaptacao por weider do code de Frank A. Dullinger ( bollwerk-essen.bplaced.net/?arduino_tlc5620 )
*/





#define PIN_DATA  2   // TLC5620 Pin 6
#define PIN_CLK   3   // TLC5620 Pin 7
#define PIN_LOAD  4   // TLC5620 Pin 8
#define PIN_LDAC  5   // TLC5620 Pin 13

int valanalog = 0;
int pinodavez = 0;
int fixaleitura = 0;
int fixpinodavez = 0;


void setup() {
  Serial.begin(9600);
  pinMode(PIN_DATA, OUTPUT);
  pinMode(PIN_CLK,  OUTPUT);
  pinMode(PIN_LOAD, OUTPUT);
  pinMode(PIN_LDAC, OUTPUT);
  pinMode(8, INPUT_PULLUP);
 
  writeTLC5620(0, 0);
  writeTLC5620(1, 0);
  writeTLC5620(2, 0);
  writeTLC5620(3, 0);
}

void loop() {
    valanalog = analogRead(A0) / 4;    
    writeTLC5620(pinodavez, valanalog);   // ( pino 0 a 3 , valor de 0 a 255)
    
    if(digitalRead(8)==0){pinodavez++;}
    if(pinodavez==4){pinodavez=0;}
 
  if(valanalog != fixaleitura  ||  pinodavez != fixpinodavez ){
    fixaleitura = valanalog;
    fixpinodavez = pinodavez;
    
    Serial.print("pinodavez:");
    Serial.println(pinodavez);
    Serial.print("valanalog:");
    Serial.println(valanalog);
    
    Serial.print("Valor A1:");
    Serial.print(analogRead(A1));
    Serial.print(" / ");
    Serial.println(analogRead(A1) /4 );
    
    
    Serial.print("Valor A2:");
    Serial.print(analogRead(A2));
    Serial.print(" / ");
    Serial.println(analogRead(A2) /4 );
    
    
    
    Serial.print("Valor A3:");
    Serial.print(analogRead(A3));
    Serial.print(" / ");
    Serial.println(analogRead(A3) /4 );

    
    
    Serial.print("Valor A4:");
    Serial.print(analogRead(A4));
    Serial.print(" / ");
    Serial.println(analogRead(A4) /4 );

    
    Serial.println("**********************************");
    
    delay(500);
    
  }
    
    
}




void writeTLC5620(int channel , int data) {
  int MSB;
  int LSB;
  int range=1; // mudar para 0 se quiser saida com metade do valor
  MSB = (channel & 0x03) 1 | (range & 0x01) 0;
  LSB = data;
  digitalWrite(PIN_LDAC, HIGH);
  digitalWrite(PIN_LOAD, HIGH);
  shiftOut(PIN_DATA, PIN_CLK, MSBFIRST, MSB);
  shiftOut(PIN_DATA, PIN_CLK, MSBFIRST, LSB);
  digitalWrite(PIN_LOAD, LOW);
  delayMicroseconds(10);
  digitalWrite(PIN_LOAD, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_LDAC, LOW);
  delayMicroseconds(10);
  digitalWrite(PIN_LDAC, HIGH);
}

Que ótima notícia ! 

Beleza, então tudo resolvido !

Grande zé,

    Na verdade não !

    A ideia era criar ampliando portas analogicas,  dai tentei colocar mais de um TLC5620 no mesmo arduino, mas usando poucas portas dele.

    O lance é que já consegui colocar outros produtos SPI, mais de um no mesmo barramento,  dai tentei colocar 2 tlc5620 e tentar repetir alguns pinos,  E NÁO ROLOU!  O dac é muito sensivel, dai rola oscilacoes em outras portas que não estou trabalhando.

   Eu até consegui fazer funcionar 2 em um só arduino,  mas cada um com todas as suas 4 portas independentes.

   Mas usar 8 portas de um microcontrolador que só tem 14 digitais é um luxo a depender da aplicação.

   Por hora, a solucao estara sendo adquirir o TLC5628, quero meter ele junto com 74hc595 ou TLC5960 para ampliar as digitais,  a ideia é testar os limites de um expansao de portas de um atmega328.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço