이 질문에 대해
전자 공학에 대한 배경 지식이 없으며 이것이 I2C를 통한 통신 및 레지스터 쓰기와 관련한 첫 번째 과제 중 하나이므로 내 곁에서 너무 많은 지식을 가정하지 마십시오. Arduino를 프로그래밍하고 있습니다.
특정 전자 부품 / 칩에 대해 질문 할 때, 사람들이 나에게 정확한 답을주기 위해 실험 / 테스트 할 수 없다고 가정합니다. 또한 사람들이이 구성 요소를 알지 못할 것으로 기대합니다. 따라서이 질문에 많은 정보를 추가하려고합니다.
더 자세한 정보가 필요하면 알려주십시오.
이 구성 요소에는 4 개의 ADC가 있습니다
4 채널 구성 요소 인 MCP3424 ( 데이터 시트 )를 사용하고 있습니다. 두 가지 패키지로 제공됩니다. MCP3422 또는 MCP3423 2 채널 버전이 아닌 MCP3424 E / SL, 4 채널 SOIC 버전을 사용하고 있습니다.
ADC가 4 개 있다고 생각합니다. RS-Online에서는 E / SL 버전에 4 개의 ADC ( 직접 링크 )가 있고 E / ST에는 단 하나 ( 직접 링크 ) 만있는 것 같습니다 .
나는 이것이 여러 채널에서 동시에 샘플링을 수행 할 수 있다는 것을 의미한다고 가정합니다. 구성 요소에 둘 이상의 ADC를 배치해야하는 다른 이유는 없습니다.
내가 맞아?
I2C를 통한 통신
통신은 하나의 구성 바이트를 전송 한 다음 샘플링이 끝날 때까지 기다렸다가 결과를 읽습니다.
구성 바이트 형식
흥미로운 것은 :
- 1부터 세면서 왼쪽에서 비트 3
- 1부터 세어 왼쪽에서 비트 1과 2
설정 바이트에 대한 자세한 내용은 여기 에 나와있는 데이터 시트 페이지 18에서 확인할 수 있습니다 .
읽은 결과의 형식
내 예제는 18 비트 해상도 (비트 5 및 6은 1로 설정)입니다. 다시 읽은 결과는 4 바이트입니다. 첫 3 개는 값을 포함하고 4 번째는 구성 바이트를 포함합니다.
그러나 가장 왼쪽 비트 인! RDY는 값이 "new"인지, 즉 마지막 판독 이후의 새로운 판독 값인지 알려줍니다. 하나의 결과를 처음 읽을 때, 값은 0이며, 이후의 결과는 ADC가 새로운 샘플 값으로 준비 될 때까지 1입니다.
병렬 샘플링없이 사용하는 방법
나는 이것을하는 방법을 완벽하게 알고 있습니다. 그리고 내가 온라인에서 찾은 모든 예제는 간단합니다. 구성 요소에 구성 바이트를 쓴 다음 값을 다시 읽으십시오.
각 채널을 자동으로 연속 샘플링하고 채널을 동시에 읽는 방법
의사 코드는 다음과 같습니다.
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
최선의 시도
다음은 각 ADC가 연속적으로 샘플링하도록 설정하기를 바랍니다. 아두 이노 코드입니다.
void setup() {
Wire.write(0b00011100);
Wire.write(0b01011100);
Wire.write(0b10011110);
Wire.write(0b11011101);
}
그런 다음 특정 채널을 어떻게 읽습니까? 구성 요소에 결과를 요청하면 레지스터의 채널 결과를 반환합니다. 위의 설정으로 채널 4에 대한 판독 값을 얻을 수 있지만 채널 2의 판독 값을 원한다고 가정 해 봅시다. 어떤 식 으로든 채널 2의 결과를 원한다고 말하면됩니다. 무엇이든 샘플링하도록 요청하면 계속 샘플링을 계속해야하며 자동 샘플링 중에 생성 된 가장 최근 샘플을 원합니다.
아래는 내 최고의 추측입니다
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
}
내 최선의 추측은 채널 2를 읽으려면 샘플링 채널 2를 시작하는 데 사용한 것과 정확히 동일한 구성 바이트를 작성합니다.
그러나 이것은 작동하지 않습니다. 필요한 375ms 이상이 있어도 준비된 샘플은 없습니다.
어떻게하면 되나요?
원하는 결과와 시도한 것을 설명하기 위해 최선을 다했지만 읽기 쉽지 않습니다.
모든 ADC를 병렬로 샘플링 한 다음 간섭없이 읽을 수있는 방법에 대한 조언을 제공해 주시겠습니까?