MCP3424, 채널을 병렬로 읽는 방법?


9

이 질문에 대해

전자 공학에 대한 배경 지식이 없으며 이것이 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를 병렬로 샘플링 한 다음 간섭없이 읽을 수있는 방법에 대한 조언을 제공해 주시겠습니까?


좋은 시작. 유일하게 누락 된 것은 내가 추가 한 MCP3424의 데이터 시트에 대한 링크입니다.
JRE

MCP3424는 버전이 아닌 두 가지 패키지로 제공되며 둘 다 4 채널입니다. ST는 TSSOP이고 SL은 Soic입니다. MCP3422 2 채널, 고정 주소, MCP3423, 2 채널, 조정 가능 주소 및 MCP3424 4 채널이 있습니다.
통행인

+1 매우 철저하고 잘 쓰여진 질문. 안타깝게도 그 칩은 단일 ADC입니다. 데이터 시트의 "기능 블록 다이어그램"에 나와 있습니다. ADC를 의미하는 입력 채널을 읽었습니다. 많은 입력 채널이 있으면 하나의 ADC를 사용하여 여러 다른 신호를 순차적으로 샘플링 할 수 있습니다. ADC는 아날로그 멀티플렉서 (채널을 선택하는 것)보다 훨씬 비싸고, 여러 신호를 샘플링하는 것이 일반적인 요구 사항입니다. 따라서 ADC 칩은 종종 이런 식으로 작동합니다. Andy aka가 귀하의 질문에 답변했지만 자세한 정보를 얻을 수 있으므로 수락하기 전에 기다리십시오.
gbulmer

나는 RS-온라인 E / SL 4가 있고, E / ST 내가 설명을 추가 한 1. 있다고 말했다 있기 때문에, 4 개 ADC를했다 생각
MADS Skjern

2
@MadsSkjern은 RS, Microchip을 무시하고 데이터 시트는 왕입니다. RS의 실수입니다. 배포자 사이트의 실수는 매우 일반적입니다.
통행인

답변:


11

후자는 4 개의 ADC로 구성되어 있습니다. 나는 이것이 여러 채널에서 동시에 샘플링을 수행 할 수 있다는 것을 의미한다고 가정합니다.

불행히도. ADC는 하나 뿐이며 둘 이상의 채널을 변환하려면 내부 멀티플렉서를 지정하여 다른 채널을 "판독"하여 순차적으로 수행해야합니다. 불행히도 동시 샘플링이 없습니다 :-

여기에 이미지 설명을 입력하십시오

입력 멀티플렉서는 한 번에 4 개의 채널 중 하나만 선택합니다. 이것은 여러 채널을 읽는 데 사용되는 일반적인 방법이지만 동시 샘플링 ADC가 있습니다. Linear tech, TI 또는 ADI 포트폴리오를 살펴보십시오.


+1, ya beat me :-) 다른 아날로그 신호를 샘플링 할 수 있기 때문에 하나의 ADC 샘플에서 여러 채널에 대해 매우 일반적이라는 사실을 알아내는 것이 좋습니다.
gbulmer

낮은 샘플링 속도가 다중화, 요구하는 경우 또한, / 인터리빙은 충분한 종종있다
스콧 Seidman

스 퍼핑 개선 사항입니다.
gbulmer

@ gbulmer 당신은 너무 친절 선생님입니다!
Andy 일명

5

MCP3424 전단에 다중화 단일 ADC이다.

데이터 시트의이 다이어그램은이를 매우 명확하게 보여줍니다.

MCP3424 아키텍처

데이터 시트는 다음과 같이 소개합니다.

4.1 일반 개요

MCP3422 / 3 / 4 장치는 I2C 직렬 인터페이스를 갖춘 차동 멀티 채널 저전력 18 비트 델타-시그마 A / D 변환기입니다. 이 장치에는 입력 채널 선택 멀티플렉서 (mux), 프로그램 가능 이득 증폭기 (PGA), 온보드 전압 레퍼런스 (2.048V) 및 내부 발진기가 포함되어 있습니다.

따라서 서로 다른 채널을 동시에 변환 할 수는 없지만 비교적 짧은 지연 시간으로 순차적으로 채널을 샘플링 할 수 있습니다.

장치를 사용할 때는 I2C 주소 비트가 안정적인지 확인해야합니다. 데이터 시트에서 한 번 더 :

MCP3423 및 MCP3424에는 2 개의 외부 장치 주소 핀 (Adr1, Adr0)이 있습니다. 이 핀들은 로직 하이 (또는 VDD에 묶임), 로우 (또는 VSS에 묶음) 또는 왼쪽 플로팅 (어떤 것에도 연결되지 않거나 VDD / 2에 묶음)으로 설정할 수 있습니다. 이러한 두 핀을 사용한 로직 레벨 조합 8 개의 가능한 주소를 허용하십시오. 표 5-3은 주소 선택 핀의 논리 상태에 따른 장치 주소를 보여줍니다. 이 장치는 다음 이벤트에서 Adr0 및 Adr1 핀의 논리 상태를 샘플링합니다.

ㅏ. 장치 전원이 켜졌습니다.

비. 일반 통화 재설정

(5.4“일반 통화”섹션 참조).

씨. 일반 통화 래치

(5.4“일반 통화”섹션 참조).

디바이스는 위의 이벤트 동안 로직 상태 (주소 핀)를 샘플링하고 새 래치 이벤트가 발생할 때까지 값을 래치합니다. 정상 작동 중에 (주소 핀이 래치 된 후) 주소 핀은 나머지 내부 회로에서 내부적으로 비활성화됩니다.

장치 전원을 켠 후에 한 번 일반 통화 재설정 또는 일반 통화 래치 명령을 실행하는 것이 좋습니다. 이렇게하면 장치가 안정적인 상태에서 주소 핀을 읽고 전원 공급 장치가 증가하는 동안 주소 비트가 래칭되지 않도록합니다. 잘못된 주소 핀 감지가 발생할 수 있습니다.

이 권장 사항에 따라 장치와 실제로 통신하고 있는지 확인하십시오.

특정 채널을 읽으려면 구성 레지스터에서 채널을 선택 하고 변환을 시작 해야합니다 . 해당 변환 결과를 출력 레지스터에서 사용할 수 있으면 RDY 비트가 낮아집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.