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 ).
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
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?
Respostas:
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: -
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.
fonte
O MCP3424 é um único ADC com um multiplexador no front-end.
Este diagrama da folha de dados mostra isso claramente
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.
fonte