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?