연기 감지 센서 ADPD188 사용하기 – 2

RECOMMENDED START-UP SEQUENCE

초기화 및 측정 시작:

  1. 샘플 클럭 활성화: 샘플 클럭(32 kHz 클럭)을 시작하기 위해 CLK32K_EN 비트(레지스터 0x4B, 비트 7)를 설정합니다. 이 클럭은 상태 머신을 제어하며, 클럭이 꺼져 있으면 상태 머신이 레지스터 0x10에 정의된 대로 전환할 수 없습니다.
  2. 프로그램 모드로 전환: 장치를 프로그램 모드로 강제 전환하기 위해 레지스터 0x10에 0x1을 씁니다. 1단계와 2단계는 순서가 바뀌어도 되지만, 두 단계가 모두 실행되어야 상태 전환이 실제로 발생합니다.
  3. 추가 레지스터 설정: 장치가 프로그램 모드에 있는 동안 필요한 추가 제어 레지스터를 어떤 순서로든 설정합니다.
  4. 정상 샘플링 시작: 레지스터 0x10에 0x2를 써서 정상적인 샘플링 작업을 시작합니다.

정상 샘플링 종료 및 대기 모드로 전환:

  1. 프로그램 모드로 전환: 장치를 프로그램 모드로 강제 전환하기 위해 레지스터 0x10에 0x1을 씁니다.
  2. 레지스터 설정: 장치가 프로그램 모드에 있는 동안 필요한 레지스터를 어떤 순서로든 설정합니다.
  3. 인터럽트 초기화: 레지스터 0x00에 0x00FF를 써서 모든 인터럽트를 초기화합니다. 필요에 따라 레지스터 0x00에 0x80FF를 써서 FIFO도 초기화할 수 있습니다.
  4. 대기 모드로 전환: 레지스터 0x10에 0x0을 써서 장치를 대기 모드로 강제 전환합니다.
  5. 샘플 클럭 정지 (선택 사항): CLK32K_EN 비트(레지스터 0x4B, 비트 7)를 재설정하여 32 kHz 클럭을 중지할 수 있습니다. 레지스터 0x4B, 비트 7 = 0은 장치가 대기 모드일 때만 작성해야 하는 유일한 명령입니다. 이 비트를 프로그램 모드 또는 정상 모드에서 0으로 설정하면 장치는 대기 모드를 포함한 다른 모드로 전환할 수 없습니다. 그 결과, 대기 모드에 있다고 해도 전력 소비가 크게 증가할 수 있습니다. 32 kHz 클럭은 매우 낮은 전류를 소모하므로, 사용 편의를 위해 클럭이 켜진 후에는 계속 실행하는 것이 좋습니다.

이렇게 ADPD188BI 장치를 초기화하고, 샘플링 작업을 시작하거나 종료할 수 있습니다.

READING DATA

ADPD188BI는 샘플 데이터에 접근할 수 있는 여러 가지 방법을 제공합니다. 각 타임 슬롯은 FIFO 또는 데이터 레지스터를 사용하여 데이터를 제공하도록 독립적으로 구성할 수 있습니다. 또한, 데이터 접근 시간을 간소화하기 위해 인터럽트 신호를 사용할 수 있습니다. FIFO는 시스템의 데이터 접근 타이밍 요구 사항을 완화하는 데 도움을 줍니다.

FIFO를 사용한 데이터 읽기

ADPD188BI에는 128바이트의 FIFO 메모리 버퍼가 포함되어 있으며, 이 버퍼는 하나 또는 두 개의 타임 슬롯에서 데이터를 저장하도록 구성할 수 있습니다. 레지스터 0x11을 통해 각 타임 슬롯에서 FIFO로 기록할 데이터 유형을 선택할 수 있습니다. 두 타임 슬롯을 모두 활성화하여 FIFO를 사용할 수 있지만, 이 경우 출력 데이터 속도가 동일해야 합니다.

  • 출력 데이터 속도(ODR) = fSAMPLE/Nx
    • fSAMPLE: 샘플링 주파수
    • Nx: 각 타임 슬롯의 평균화 계수 (타임 슬롯 A의 NA, 타임 슬롯 B의 NB)
    • FIFO에 두 타임 슬롯에서 데이터를 저장하려면 NA = NB가 참이어야 합니다.

데이터 패킷은 출력 데이터 속도에 따라 FIFO에 기록됩니다. FIFO에 기록되는 데이터 패킷은 활성화된 각 타임 슬롯의 전체 샘플로 구성됩니다. 각 포토다이오드 채널의 데이터는 16비트 또는 32비트로 저장할 수 있으며, 각 타임 슬롯은 샘플당 2, 4, 8 또는 16바이트의 데이터를 저장할 수 있습니다. 데이터를 손실 없이 기록하기 위해서는 FIFO에 충분한 공간이 있어야 하며, 공간이 부족하면 새 데이터는 손실됩니다.

데이터는 FIFO의 공간이 충분한 한 계속해서 저장되며, 데이터 패킷을 완전하게 유지하기 위해서는 FIFO 데이터를 항상 완전한 패킷 단위로 읽어야 합니다. 데이터는 타임 슬롯 A의 채널 1부터 시작해 채널 2, 3, 4로 순차적으로 기록되고, 그 후 타임 슬롯 B의 채널 1, 2, 3, 4가 기록됩니다. 만약 모든 채널을 합산하는 설정으로 구성된 경우, 각 타임 슬롯에서 하나의 값만 기록됩니다.

  • 16비트 데이터는 상위 8비트(Bits[15:8])가 먼저, 하위 8비트(Bits[7:0])가 나중에 기록됩니다.
  • 32비트 데이터는 Bits[15:8], Bits[7:0], Bits[31:24], Bits[23:16] 순으로 기록됩니다.

FIFO에 저장된 현재 데이터 바이트 수는 레지스터 0x00, Bits[15:8]에서 확인할 수 있습니다. 또한, 특정 양의 데이터가 FIFO에 기록될 때 자동으로 발생하는 전용 FIFO 인터럽트도 제공됩니다.

인터럽트 기반 방법을 통한 데이터 읽기

인터럽트 기반 방법으로 FIFO에서 데이터를 읽기 위한 절차는 다음과 같습니다.

  1. 타임 슬롯 구성: 프로그램 모드에서 원하는 타임 슬롯 구성을 설정합니다.
  2. 데이터 형식 설정: 레지스터 0x11에 각 타임 슬롯에 대한 원하는 데이터 형식을 설정합니다.
  3. 인터럽트 임계값 설정: 레지스터 0x06, Bits[13:8]의 FIFO_THRESH 비트를 설정하여 인터럽트 임계값을 지정합니다. 권장 값은 데이터 패킷에 있는 16비트 워드 수에서 1을 뺀 값입니다. 이렇게 하면 FIFO에 하나 이상의 완전한 패킷이 있을 때 인터럽트가 발생합니다.
  4. FIFO 인터럽트 활성화: 레지스터 0x01, Bit 8의 FIFO_INT_MASK에 0을 써서 인터럽트를 활성화합니다. 또한, 레지스터 0x02의 비트를 설정하여 인터럽트 핀(GPIO0)을 구성합니다.
  5. 정상 모드로 전환: 레지스터 0x10에 0x2를 써서 정상 운영 모드로 전환합니다.
  6. 인터럽트 발생 시:
    • FIFO에 하나 이상의 패킷이 있을 때만 인터럽트가 발생하므로 FIFO_SAMPLES 비트를 읽을 필요는 없습니다. 필요에 따라 인터럽트 루틴에서 여러 패킷이 있는지 확인할 수 있습니다.
    • 레지스터 0x60을 사용하여 다중 워드 접근으로 완전한 패킷을 읽습니다. FIFO에서 데이터를 읽으면 자동으로 새 샘플을 위한 공간이 확보됩니다.

FIFO에서 데이터를 읽으면 인터럽트는 자동으로 해제되며, FIFO에 데이터가 새로 기록되고 워드 수가 임계값을 초과할 때 다시 인터럽트가 발생합니다.

폴링 방법을 통한 데이터 읽기

FIFO에서 데이터를 읽는 폴링 방법은 다음 절차를 따릅니다:

  1. 프로그램 모드에서 타임 슬롯 구성: 프로그램 모드에서 원하는 타임 슬롯 구성을 설정합니다.
  2. 데이터 형식 설정: 레지스터 0x11에 각 타임 슬롯의 데이터 형식을 설정합니다.
  3. 정상 작동 모드로 전환: 레지스터 0x10에 2를 써서 정상 모드로 전환합니다.

이후 다음 폴링 작업을 수행합니다:

  1. 폴링 간격이 만료될 때까지 기다립니다.
  2. 레지스터 0x00의 FIFO_SAMPLES 비트(Bits[15:8])를 읽습니다.
  3. FIFO_SAMPLES 값이 패킷 크기보다 크거나 같으면 다음 단계를 통해 패킷을 읽습니다:
    • 레지스터 0x60을 사용하여 한 번에 하나 이상의 멀티워드 접근으로 전체 패킷을 읽습니다. FIFO에서 데이터를 읽으면 자동으로 새 샘플을 위한 공간이 확보됩니다.
    • 1단계를 반복합니다.

모드 변경이 필요하거나 정상적인 샘플링을 중단해야 할 때는 FIFO를 비워야 합니다. 다음 절차를 통해 FIFO 상태를 초기화하고 비울 수 있습니다:

  1. 레지스터 0x10에 0x1을 써서 프로그램 모드로 전환합니다.
  2. 레지스터 0x00의 Bit 15에 1을 씁니다.

인터럽트를 사용하여 레지스터에서 데이터 읽기

가장 최신의 샘플 데이터는 항상 데이터 레지스터에 있으며, 각 타임 슬롯의 끝에서 동시에 업데이트됩니다. 각 포토다이오드 채널의 데이터 값은 타임 슬롯 A의 경우 레지스터 0x64 / 타임 슬롯 B는 0x6B에서 16비트 값으로 확인할 수 있습니다. 만약 이 레지스터들이 최대 값에 도달하면 값이 클립됩니다. 27비트까지의 포화되지 않은 값은 타임 슬롯 A의 경우 0x70 / 타임 슬롯 B는 0x7F에서 확인할 수 있습니다.

레지스터가 업데이트될 때 이를 알리는 샘플 인터럽트를 사용할 수 있습니다. 주어진 타임 슬롯에서 인터럽트를 사용하려면 다음 절차를 따릅니다:

  1. 레지스터 0x01의 적절한 비트에 0을 써서 샘플 인터럽트를 활성화합니다. 타임 슬롯 A에 대한 인터럽트를 활성화하려면 Bit 5에 0을, 타임 슬롯 B에 대해선 Bit 6에 0을 씁니다. 둘 중 하나 또는 둘 다 설정할 수 있습니다.
  2. 레지스터 0x02에 적절한 값을 써서 인터럽트 핀(GPIOx)을 구성합니다.
  3. 레지스터가 업데이트되면 인터럽트가 발생합니다.
  4. 인터럽트 핸들러는 다음 작업을 수행해야 합니다:
    • 레지스터 0x00을 읽고 Bit 5 또는 Bit 6을 확인하여 어느 인터럽트가 발생했는지 확인합니다(하나의 인터럽트만 사용하는 경우에는 이 단계를 생략할 수 있습니다).
    • 다음 샘플이 쓰여지기 전에 데이터 레지스터를 읽어야 합니다. 시스템은 출력 데이터 속도에 따라 인터럽트 지연 및 처리 시간이 짧아야 합니다.
    • 레지스터 0x00의 Bit 5 또는 Bit 6에 1을 써서 인터럽트를 지웁니다.

두 개의 타임 슬롯을 모두 사용할 경우, 타임 슬롯 B의 인터럽트만 사용하여 모든 레지스터를 읽을 수 있음을 나타낼 수 있습니다. 데이터 전송을 위해 멀티워드 읽기를 사용하는 것이 권장됩니다.

인터럽트 없이 레지스터에서 데이터 읽기

시스템의 인터럽트 응답 시간이 빠르거나 예측 가능하지 않거나, 인터럽트 핀(GPIOx)을 사용하지 않는 경우에도 데이터 홀드 메커니즘을 사용하여 신뢰할 수 있는 데이터 접근이 가능합니다. 레지스터에서 읽은 데이터가 동일한 샘플 시간에 속하는 것을 보장하기 위해, 현재 값을 읽는 동안 샘플 업데이트를 방지해야 합니다. 인터럽트 타이밍 없이 레지스터를 읽는 방법은 다음과 같습니다:

  1. 레지스터 0x5F의 Bit 1과 Bit 2에 1을 써서 샘플 업데이트를 방지합니다(SLOTA_DATA_HOLD 또는 SLOTB_DATA_HOLD). 두 타임 슬롯 모두 액세스할 수 있습니다.
  2. 원하는 대로 레지스터를 읽습니다.

0x64~0x6B까지의 데이터를 쭉~ ㅇ

  1. SLOTA_DATA_HOLD 또는 SLOTB_DATA_HOLD에 0을 써서 샘플 업데이트를 다시 허용합니다.

이 방법은 새 샘플이 읽기 도중 도착하여 데이터가 덮어쓰이는 것을 방지합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다