[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

MCP4822 - Formatando os bits

Exemplos de bits e bytes para o uso com o DAC:

========================================================

Gravando DAC A com o valor de saida 0V ( fundo de escala 2,048V) :   

0011 0000 0000 0000 =  hexa 30 00

Gravando DAC A com o valor de saida 1,024V ( fundo de escala 2,048V) :

0011 0011 1111 1111 = hexa 33 FF 

Gravando DAC A com o valor de saida 2,048V ( fundo de escala 2,048V) :

0011 1111 1111 1111 = hexa 3F FF 

=========================================================

Gravando DAC B com o valor de saida 0V ( fundo de escala 4,096V) :   

1001 0000 0000 0000 =  hexa 90 00

Gravando DAC B com o valor de saida 2,048V ( fundo de escala 4,096V) : 

1001 0011 1111 1111 = hexa 93 FF 

Gravando DAC B com o valor de saida 4,096V ( fundo de escala 4,096V) : 

1001 1111 1111 1111 = hexa 9F FF 

MCP4822 - usando com o Arduino UNO:

Veja a biblioteca mcp48X2.h. Ela será usada para configurar o chip. 

SPI_mode, velocidade da transmissão, DAC A ou B, ganho, etc.

https://github.com/mirdej/Arduino/blob/master/libraries/DAC_MCP48X2...

Esse é o Sketch para uso do MCP4822. Temos que testa-lo:

https://github.com/mirdej/Arduino/blob/master/MCP4822/MCP4822.ino

Interessante verificar a Biblioteca spi.h :

https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr...

Weider no meu caso, o DAC que tenho é o MCP4922. 

A única diferença é que ele usa tensão de referência externa. 

Eu encontrei esses Sketches bem interessantes. Talvez com algumas adaptações, você poderá usar com o MCP4822.

https://github.com/chipaudette/ArduinoWaveTableSynth/blob/master/wa...

https://github.com/wigman27/Tutorial-Using-Arduino-SPI/blob/master/...

Essa é a montagem de teste que farei para o meu DAC MCP4922. 

Ele usa as tensões de referências externas tanto para o DAC A quanto para o DAC B.

O chip MCP1541 fornecerá a tensão de referência de 4,096V. 

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

MCP4922 - registradores 

O MCP4922 tem alguns pinos e registradores a mais. 

O pino - SHDN é usado para desabilitar todos os DACs 

( se -SDHN = 5V , eles poderão ser desativados seletivamente através do registrador) 

            -SHDN = 0V  => DACs desabilitados 

            -SHDN = 5V  => DACs Ativos 

O registrador BUF é usado para habilitar um buffer na entrada da Tensão de Referência. 

Se o BUF for ativado, existirá uma grande impedância nas entradas dos pinos VREF. 

Bit 15    1 => grava DAC B 

             0 => grava DAC A 

Bit 14     Entrada VREF com buffer (BUF)

             1 => com buffer

             0 => sem buffer              

Bit 13    ganho de saída (GA)

             1 => ganho 1X (VOUT = VREF * D/4096)

             0 => ganho 2X (VOUT = 2 * VREF * D/4096)

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) 

Zé gustavo,

   Como sempre muito obrigado pela ajuda.

   Comecemos pelo mcp4725,    você tá certo,  cada modulo tem somente um conversor DAC, e que  tem que setar o pino A0 em high ou low pra poder colocar até 2 por barramento I2C.

   Porem, descobri que dá pra meter na  verdade até 4 e não 2,   desde que se use dois da Adafruit e 2 da Sparkfun, a razão é que os da sparkfun são setados nos endereços 0x60 e 0x61 e os da adafuit nos endereços 0x62 e 0x63.

   Mas mesmo assim estou achando isso muito limitativo, acho que vou apostar mais fortemente no estudo do 4822, ao qual não vi limitações ainda.

   Bem, com relação ao MCP4822 eu dei uma busca usando uns truquezinhos do google em toda github e encontrei diversas bibliotecas pra ele,   vou começar a testar e comento os resultados.

   Só mais uma duvida:   você cita vários outros modelos de conversores DAC,   qual foi a diferença que você percebeu entre eles?

Boas notícias ! 

Já testei o meu MCP4922 com sucesso !

https://github.com/wigman27/Tutorial-Using-Arduino-SPI/blob/master/...

Usei esse programa, fiz pequenas alterações e traduzi os comentários. 

Anexei o arquivo alterado e funcionando OK !   MCP4922WigA.ino 

Pode usar esse mesmo programa alterado por mim no seu MCP4822. Deve funcionar. 

Se não funcionar me avise, que a gente faz as correções. 

Só um pequeno detalhe - o meu DAC esta apresentando um erro de 2 mV (isso é muito pouco).

Creio que deve ser devido à linearidade da curva do DAC. 

Mas dá para corrigir a tensão de saída  enviando um valor menor ou maior de 2 mV. 

Bom demais !

Anexos

Seria interessante (se você concordar) alterar o nome do tópico para 

Tutorial Arduino - uso de conversores DAC 12 bits - interface SPI 

adicione por favor as tags - mcp4922, mcp4822, conversor, dac, spi, 12 bits

Obrigado e abraços !

MCP4922 - Integral non Linearity 

Veja a tabela do MCP4922. O Datasheet mostra que essa variação de +- 2 bits LSB é normal !

No meu caso corresponde aos 2 mV. 

Para eu conseguir 500 mV eu enviei o valor de 498. E para conseguir 1500 mV eu enviei 1502. 

Veja que na curva pode-se aumentar ou diminuir 2 mV. 

Matei a cobra e mostrei o pau ! KKKKKK

Parabens grande Zé gustavo,   só tô vendo agora e noite e todo meu material tá la no trabalho, amanha mesmo eu vou montar  e testar.

 Fiz as mudanças no topico como você pediu,  infelizmente como o forum do Lab de garagem é rotativo, logo, logo, ele sai das primeiras paginas e ai só na busca, mas coloquei as tags e tudo que você sugeriu.

   Outra coisa, como estava sem meu material(Cis), hoje eu aproveitei pra fazer o teste da conversão PWM com filtro  RC, porem, alterando a frequência do PWM do arduino.

   Primeiramente fiz um teste com componentes normais e sem mexer em nada de configuração do arduino, o resultado foi sofrível,  oscilou bastante, e não apresentou muita precisão.

    Porem, quando fiz o teste usando um resistor de precisão de 10k e um capacitor de 10uF, e utilizando o pino 5 do arduino com a frequencia de PWM alterada para 65Khz (ao inves dos tradicionais menos de 900hz),  rapaz, o resultado foi de impressionar,  baita estabilidade,  precisão incrível, ainda que obviamente com uma perda mínima,  mas o resultado foi de cair o queixo.

Mas te fiz uma pergunta e você não respondeu:   entre os modelos de DAC que você testou,  você percebeu alguma diferença entre eles? 

    Amanhã, vou colocar o MCP4822 pra funcionar e comparar os métodos.

  

Boa noite, Weider. 

Obrigado por ter alterado o título. Vamos ver se o Marcelo acrescenta esse tópico na lista de Tutoriais. 

Eu ainda não testei os outros DACs. 

Mas quanto maior o numero de bits, maior será a precisão da tensão de saída.

Luis Farias, uma matriz R2R tem baixa precisão. 

A precisão vai depender dos valores dos resistores. E outra desvantagem, cada bit usará um pino do Arduino. 

Não dá para fazer um DAC de 12Bits com Arduino. Somente se usar um outro chip adicional como registrador.

Não aprecio esse tido de DAC. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço