[Tutorial] Uso de conversores DAC 12 bits - interface SPI no Arduino

Segue abaixo as pesquisas e descobertas do Grande José gustavo, sobre conversores DA ( digital para analogico ) ao qual temos a honra de compartilhar.

Esse topico esta se referindo aos conversores DA que se comunicam via SPI,  os que se comunicam por outros protocolos como I2C ficarão em aberto.

 

Exibições: 4064

Responder esta

Respostas a este tópico

ninguem?

Boa noite Weider , tenho os seguintes componentes, mas não os testei ainda. 

MCP4922     12-Bit DAC with SPI
MCP3201     12bit ADC - SPI interface
MCP3204     4  CH 12bit ADC - SPI interface
MCP3551     22 bit Delta sigma ADC
ADS7822P    12 bits 200 KHz ADC

Seu DAC MCP4822: Dual 12-Bit Voltage Output DAC ( são dois DACs em um chip). 

http://ww1.microchip.com/downloads/en/DeviceDoc/22249A.pdf

Esse usa a interface SPI.

Interessante que ele tem uma tensão de referencia interna de  2,048V. 

Ele é um pouquinho mais rápido do que o outro - fast settling time 4,5us.

Achei alguma coisa para os dois :

https://github.com/mirdej/Arduino

O DAC MCP4725 é unico (12bits DAC) e usa a interface I2C. 

http://ww1.microchip.com/downloads/en/DeviceDoc/22039d.pdf

Veja esse tutorial para o MCP4725 :

https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-a...

Esse tutorial é sobre DAC, se deseja consultar mais sobre ADC, favor abrir um novo tópico.

Você quer medir frequencia ou quer visualizar a forma de onda ?

Li numa referência da Tektronix sobre osciloscópio digitais que a frequencia de amostragem (sample rate)  deve ser no mínimo 5 vezes a frequencia medida.

 5 x 500 Khz = 2,5 Mhz 

Você precisará de um ADC com no mínimo 2,5 Mega samples/seg.

Vamos por partes. Vou aproveitar e testar o meu DAC também. 

A unica diferença do meu MCP4922 é que ele usa referência externa de tensão.

MCP4922 :

http://ww1.microchip.com/downloads/en/DeviceDoc/22250A.pdf

Vamos precisar de entender com funciona a interface SPI no Arduino. 

Referencias sobre SPI :

http://labdegaragem.com/profiles/blogs/tutorial-comunica-o-spi-seri...

https://learn.sparkfun.com/tutorials/serial-peripheral-interface-sp...

Biblioteca SPI 

https://www.arduino.cc/en/Reference/SPI

Pinos da Interface SPI  ( que vamos usar) 

Master(Mestre)  é o Arduino e Slave (escravo) é o DAC.

  • MOSI (Master OUT Slave IN) - Dados do Master para Slave;
  • SCK (Serial Clock) - Clock de sincronização para transmissão de dados entre o Master e Slave;
  • SS (Slave Select) - Seleciona qual Slave receberá os dados.

Essa é a minha sugestão de montagem do DAC - para efeito de testes :

(usei o programa ExpressSCH para desenhar o diagrama  - http://www.expresspcb.com/expresssch

O Datasheet recomenda o uso desses capacitores C1 e C2 no pino VDD para eliminar ruidos da fonte. 

O pino Latch DAC input (-LDAC) é usado para transferir os dados dos registradores internos para os dois DACs. Se esse pino for aterrado, os dados serão transferidos na borda de subida do pino -CS. 

Alimente o DAC com +5V ( o máximo é 6V ! ) .

Conectei os resistores R1 e R2 nas saídas dos dois DACs, somente para efeito de teste. Qual será o uso dessas saídas ?

Estava pensando sobre o uso do pino LDAC. 

Ele poder ser util se você precisar que os dois DACs liberem as tensões ao mesmo tempo. (sincronizados).

Pois se aterrar o pino LDAC, um DAC será carregado e depois no próximo ciclo de gravação, o outro DAC será carregado. 

Informações importantes sobre o MCP4822 ( obtive no DataSheet) 

O tempo para o DAC gerar a tensão de saída (settling time) é de 4,5us. Portanto é preciso um intervalo de tempo entre o envio de um valor e de outro. Minha sugestão é que tenha um delay de 5 us no mínimo.

Os amplificadores nas saídas dos DACs podem ter o ganho de 1X ou 2X - selecionável. Por isso a tensão de fundo de escala pode ser 2,048V ou 4,096V. Bem interessante isso ! Mas nunca igual a tensão de alimentação VDD (5V).

A Microchip afirma que esses DACs tem grande precisão e performance com baixo ruído. 

Pelo que eu entendi os pinos de entrada são compatíveis com o Arduino Uno (5V) e com o Arduino Due ou Mega (3,3v). 

Como o DAC tem 12 bits ( 2 elevado a 12 = 4096) :

Se o ganho for 1X - o bit LSB terá a tensão de 0,5 mV  ( 2,048 V /4096 = 0,0005 V ) 

Se o ganho for 2X - o bit LSB terá a tensão de 1,0 mV  ( 4,096 V /4096 = 0,001 V ) 

Zé gustavo,

   Cara, você é incrivel, muito obrigado.

   Curiosamente andei lendo sobre comunicação SPI vs I2C,  elas são bem parecidas, tendo como diferença que na SPI a indicação do escravo a ser comunicado é dado via pino fisico, enquanto que na I2C é por codigo.

   De inicio eu achava que SPI fosse mais facil , mas descobri que a bibliografia existente para biblioteca wire que já tem no arduino, a comunicação I2C é que é mais facil,  já a SPI  tudo que é exemplo que estou achando é muito direcionado.

    Vou dar uma olhada em bibliotecas especificas para o MCP4822,  até agora as coisas que vi utilizando SPI acabem sendo mais facil atraves de bibliotecas especificas, é o caso dos radios NRF24L01 que utilizam o SPI, e que podem ser programados na unha,  porem, as bibliotecas implementaram recursos e facilidades que seria muito dificil conseguir via codigo puro,  como por exemplo fazer o NRF24L01 transmitir audio (ainda não estudei, mas tá na pauta kkk )

Amanhã tem mais ....

Boa noite !

Zé uma duvida que coloquei no enunciado, mas que gostaria de aprofundar pra ver se voce consegue me ajudar.

  Na page  https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-a...   se lê:  First, be sure to call begin(addr) where addr is the i2c address (default is 0x62, if A0 is connected to VCC its 0x63)

   Ou seja, esses modulos MCP4725 que são setados via software no padrão I2C,  tem dois DAC em cada modulo, o primeiro para ser chamado usa-se o endereço 0x62 e o segundo 0x63.

    Ai fica a duvida:  E se eu quiser usar outros modulos MCP4725,  como vou chamar eles ?

Não é bem assim. Como eu já havia dito, o MCP4725 possui somente um DAC. 

Como ele tem um pino A0 de endereçamento, somente dois chips MCP4725 poderão ser conectados no mesmo barramento (BUS) da interface I2C. 

Se o pino A0 for isolado = endereço será 0x62

Se o pino A0 for conectado no 5V = endereço será 0x63

  • A0 allow you to change the I2C address. By default (nothing attached to A0) the address is hex 0x62. If A0 is connected to VDD the address is 0x63. This lets you have two DAC boards connected to the same SDA/SCL I2C bus pins.

O Datasheet especifica que internamente tem mais dois registradores de endereçamento. 

Mas deve ser requisitada uma gravação diferente para a Microchip. 

" The choice of A2 and A1 bits are provided by the customer as part of the ordering process. These bits are then programmed (hard-wired) during manufacturing" 

Se precisar usar vários MCP725 com o seu Arduino, terá que usar um chip adicional para fazer o endereçamento dos mesmos. Ou criar outros barramentos I2C virtuais.

Informações importantes sobre a interface SPI do  MCP4822 ( obtive no DataSheet) 

Esse chip suporta SPI mode 0,0 e SPI mode 1,1.

Comandos e dados são enviados pelo pino SDI. Os dados são enviados na borda de subida do sinal SCK.

A comunicação é unidirecional, portanto o Arduino só poderá enviar os dados, não conseguirá ler os dados do DAC.

O pino -CS deve ser mantido no nível baixo ( zero volts) enquanto os dados são gravados no DAC. 

O comando de Write(gravação) consiste de 16 bits, que são usados para configurar os registradores de dados e controle. 

Registradores do MCP4822:

Bit 15    1 => grava DAC B 

             0 => grava DAC A 

Bit 14     não é usado 

Bit 13    ganho de saída (GA)

             1 => ganho 1X (fundo de escala 2,048V) 

             0 => ganho 2X (fundo de escala 4,096V) 

Bit 12   SHDN - controle de desativação de saída 

             1  => VOUT ativo 

             0  => VOUT desabilitado 

Bits 11 até  0  => 12 bits do DAC ( mais significativo para o menos significativo) 

Essa é a carta de tempo da comunicação SPI do MCP4822 :

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço