MCP3424, como ler canais em paralelo?


9

Sobre esta pergunta

Eu não tenho formação em engenharia eletrônica, e esse é um dos meus primeiros desafios com a comunicação via I2C e com a gravação em um registro; portanto, não assuma muito conhecimento do meu lado. Estou programando um Arduino.

Ao perguntar sobre um componente / chip eletrônico específico, presumo que as pessoas não possam experimentar / testar para me dar uma resposta correta. Eu também espero que as pessoas nem conheçam esse componente. Portanto, tentarei adicionar muita informação nesta pergunta.

Por favor, deixe-me saber se você precisar de mais informações.

O componente possui quatro ADCs

Estou usando o componente de 4 canais, MCP3424 ( datasheet ). Ele vem em dois pacotes. Estou usando o MCP3424 E / SL, versão SOIC de 4 canais, não a versão MCP3422 ou MCP3423 de 2 canais.

Eu acredito que tem quatro ADCs. No RS-Online, parece que a versão E / SL possui 4 ADCs ( link direto ), enquanto o E / ST possui apenas um ( link direto ). insira a descrição da imagem aqui

Suponho que isso deva significar que ele pode fazer amostragem em vários canais simultaneamente. Não vejo outro motivo para colocar mais de um ADC no componente.

Estou certo?

Comunicação via I2C

A comunicação ocorre enviando um byte de configuração, aguardando o término da amostragem e lendo o resultado.

Formato do Byte de Configuração

insira a descrição da imagem aqui

Os interessantes são:

  • bit três da esquerda, contando de 1: amostragem contínua
  • bit um e dois da esquerda, contando de 1: Endereço

Mais informações sobre o byte de configuração podem ser encontradas na página 18 da folha de dados, também mostrada aqui .

Formato do resultado da leitura

Meus exemplos serão apenas com uma resolução de 18 bits (bits 5 e 6 definidos como 1). O resultado da leitura de volta será de quatro bytes: os três primeiros que contêm o valor e o quarto que contém o byte de configuração.

No entanto, o bit mais à esquerda,! RDY, informa se o valor é "novo", ou seja, se é uma nova leitura, desde a última leitura. Na primeira vez que lê um resultado, o valor é 0 e, para os subsequentes, é 1, até que o ADC esteja pronto com um novo valor de amostra.

Como usá-lo sem amostragem em paralelo

Eu sei perfeitamente bem como fazer isso. E todos os exemplos que encontrei online, também são simples. Basta escrever um byte de configuração no componente e ler um valor novamente.

Como definir cada canal para amostrar automaticamente de forma contida e ler os canais em paralelo

O pseudo-código pode ser como

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

Minha melhor tentativa

Portanto, espero que o seguinte defina cada ADC para amostrar continuamente. Este é o código do Arduino.

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

Então, como leio um canal específico. Se eu apenas pedir ao componente o resultado, ele retornará o resultado do canal no registro. Com a configuração acima, eu pegaria a leitura do canal 4. Mas digamos que eu queira a leitura do canal 2. De alguma forma, só preciso dizer, que quero o resultado do canal 2. Não quero peça para ele provar qualquer coisa, ele deve continuar fazendo uma amostragem contínua, e eu só quero a amostra mais reenviada que ela criou enquanto faz a amostragem automaticamente.

Abaixo está o meu melhor palpite

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

Então, meu melhor palpite é. Se eu quiser ler o canal 2, escrevo um byte de configuração exatamente igual ao que usei para iniciar o canal de amostragem 2.

Entretanto, isso não funciona. Não há amostra pronta, mesmo que tenha tido mais do que os 375ms necessários.

Como faço para conseguir isso?

Tentei fazer o melhor possível para descrever o resultado desejado e o que tentei, mas sei que não é fácil de ler.

Você poderia me dar conselhos sobre como permitir que todos os ADCs coloquem amostras em paralelo e depois os leiam, sem interferir?


Bom começo. A única coisa que falta é um link para a folha de dados do MCP3424, que eu adicionei.
JRE

O MCP3424 vem em dois pacotes, não em versões, e ambos são 4 canais. ST é TSSOP, SL é Soic. Existem os 2 canais MCP3422, endereço fixo, MCP3423, 2 canais, endereço ajustável e 4 canais MCP3424.
transeunte

+1 Pergunta muito completa e bem escrita. Infelizmente esse chip é um único ADC. Isso é ilustrado em sua folha de dados no "Diagrama de blocos funcionais". Você leu os canais de entrada como significando ADCs. Ter muitos canais de entrada permite que um ADC seja usado para amostrar muitos sinais diferentes (sequencialmente). O ADC é muito mais caro do que um multiplexador analógico (que seleciona o canal), e a amostragem de múltiplos sinais é um requisito comum. Portanto, os chips ADC geralmente funcionam dessa maneira. Andy aka respondeu à sua pergunta, mas talvez aguarde antes de aceitar, pois você pode obter mais informações.
gbulmer

Eu acreditava que tinha 4 ADCs, porque RS-Online disse que E / SL tinha 4, e E / ST tinha 1. Eu adicionei à descrição
Mads Skjern

2
@MadsSkjern ignora RS, Microchip e sua folha de dados é rei. Isso é um erro no RS. Erros nos sites dos distribuidores são bastante comuns.
transeunte

Respostas:


11

Eu tenho o último com quatro ADCs. Suponho que isso deva significar que ele pode fazer amostragem em vários canais simultaneamente.

Infelizmente não. Existe apenas um ADC e, para converter mais de um canal, isso deve ser feito sequencialmente, abordando o multiplexador interno, "lendo" outro canal. Infelizmente, não há amostragem simultânea: -

insira a descrição da imagem aqui

Observe que o multiplexador de entrada seleciona apenas um dos quatro canais por vez. Esse é um método bastante comum usado para ler vários canais, mas existem ADCs de amostragem simultânea por aí. Tente examinar os portfólios de tecnologia linear, TI ou ADI.


+1, você me venceu :-) Pode valer a pena mencionar o fato de que é bastante comum para uma amostra de vários canais ADC, porque pode amostrar diferentes sinais analógicos, o que é um caso comum.
gbulmer

Além disso, se as taxas de amostragem baixas são chamados para, multiplexação / intercalação muitas vezes é bom o suficiente
Scott Seidman

Aprimorando melhorias, senhor.
gbulmer

@gbulmer você é muito gentil senhor !!
Andy aka

5

O MCP3424 é um único ADC com um multiplexador no front-end.

Este diagrama da folha de dados mostra isso claramente

Arquitetura MCP3424

A folha de dados confirma isso com a introdução:

4.1 Visão geral

Os dispositivos MCP3422 / 3/4 são conversores diferenciais multicanal de 18 bits Delta-Sigma A / D de baixa potência e uma interface serial I2C. Os dispositivos contêm um multiplexador de seleção de canal de entrada (mux), um amplificador de ganho programável (PGA), uma referência de tensão integrada (2,048V) e um oscilador interno.

Portanto, você não pode converter canais diferentes verdadeiramente simultaneamente, mas pode experimentar os canais sequencialmente com um atraso relativamente curto entre eles.

Ao usar o dispositivo, você precisa garantir que os bits de endereço I2C estejam estáveis; mais uma vez, na folha de dados:

O MCP3423 e o MCP3424 possuem dois pinos de endereço de dispositivo externo (Adr1, Adr0). Esses pinos podem ser configurados para uma lógica alta (ou vinculada ao VDD), baixa (ou vinculada ao VSS) ou flutuante à esquerda (não conectado a nada ou vinculado ao VDD / 2). Essas combinações de nível lógico usando os dois pinos permita oito endereços possíveis. A Tabela 5-3 mostra o endereço do dispositivo, dependendo do status lógico dos pinos de seleção de endereço. O dispositivo mostra o status lógico dos pinos Adr0 e Adr1 nos seguintes eventos:

uma. Inicialização do dispositivo.

b. Redefinição de chamada geral

(Veja Seção 5.4 “Chamada Geral”).

c. Trava de chamada geral

(Veja Seção 5.4 “Chamada Geral”).

O dispositivo mostra o status lógico (pinos de endereço) durante os eventos acima e bloqueia os valores até que um novo evento de trava ocorra. Durante a operação normal (depois que os pinos de endereço são travados), os pinos de endereço são desativados internamente do restante do circuito interno.

É recomendável emitir um comando de redefinição de chamada geral ou trava de chamada geral uma vez depois que o dispositivo for ligado. Isso garantirá que o dispositivo leia os pinos de endereço em uma condição estável e evite travar os bits de endereço enquanto a fonte de alimentação estiver aumentando. Isso pode causar detecção incorreta de pinos de endereço.

Sugiro que você siga esta recomendação para garantir que realmente está se comunicando com o dispositivo.

Para ler um canal específico, você deve selecionar o canal no registro de configuração e iniciar uma conversão. O bit RDY ficará baixo quando o resultado dessa conversão estiver disponível no registro de saída.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.