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 ?
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por