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

ADPD188BI는 Analog Devices에서 제공하는 통합 광학 센서 모듈로, 이를 SPI를 통해 제어할 때 필요한 초기 설정 절차는 다음과 같습니다.

1. SPI 초기 설정

먼저, SPI 통신을 시작하기 위해 마스터 장치에서 SPI 설정을 맞추어야 합니다.

2. ADPD188BI 초기 설정 절차

다음은 ADPD188BI 센서를 SPI로 초기화할 때 사용되는 주요 레지스터와 시퀀스입니다.

2.1 소프트 리셋 (Software Reset)

초기화를 위해 먼저 소프트웨어 리셋을 수행해야 합니다.

레지스터: 0x10
설정 값: 0x0001 (리셋 명령)
리셋 후 약간의 대기 시간을 두어야 합니다. (최소 10ms 정도)

2.2 클럭 설정 (Clock Configuration)


리셋 이후, 센서의 클럭 설정을 구성합니다.

레지스터: 0x04
설정 값: 0x0030 (기본 설정 값)
이 설정을 통해 센서의 클럭 동작을 안정화시킵니다.

2.3 모드 설정 (Mode Configuration)


ADPD188BI의 동작 모드를 설정합니다. 이 과정에서 활성화될 채널을 지정할 수 있습니다.

레지스터: 0x10
설정 값: 0x0002 (측정 모드 설정)
이후 센서가 원하는 동작 모드에 따라 추가 설정이 필요할 수 있습니다.

2.4 FIFO 설정 (FIFO Configuration)

데이터 버퍼(FIFO)의 설정도 초기화 과정에 포함됩니다.

레지스터: 0x14
설정 값: 0x0100 (FIFO 워터마크 설정)
FIFO는 센서 데이터가 SPI 인터페이스를 통해 효과적으로 전송되도록 관리하는 역할을 합니다.

2.5 LED 및 포토다이오드 설정 (LED & Photodiode Configuration)

센서의 LED 및 포토다이오드 설정을 구성하여, 원하는 광학 측정을 설정합니다.

레지스터: 0x22
설정 값: 0x0040 (기본 LED 설정)
레지스터: 0x30
설정 값: 0x0020 (기본 포토다이오드 설정)

2.6 인터럽트 설정 (Interrupt Configuration)

필요에 따라 인터럽트를 설정하여, 특정 이벤트 발생 시 SPI 인터페이스를 통해 알림을 받을 수 있습니다.

레지스터: 0x16
설정 값: 0x0001 (FIFO 워터마크 인터럽트 활성화)

3. 데이터 수집

이제 ADPD188BI가 초기화되었으므로, 센서 데이터를 수집할 준비가 되었습니다.

데이터 레지스터: 0x64부터 시작하여, 센서 데이터가 FIFO에 쌓인 데이터를 읽을 수 있습니다.
이러한 초기 설정 후에는 주기적으로 센서 데이터를 읽거나, 원하는 시간 간격에 따라 측정을 수행할 수 있습니다.

예제코드는 아래에

===================================================================================================

include “stm32f4xx_hal.h”
include “spi.h”
define ADPD188BI_CS_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
define ADPD188BI_CS_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)

// ADPD188BI 레지스터 주소

define ADPD188BI_REG_SOFT_RESET 0x10
define ADPD188BI_REG_CLK_CFG 0x04
define ADPD188BI_REG_MODE 0x10
define ADPD188BI_REG_FIFO_CFG 0x14
define ADPD188BI_REG_LED_CFG 0x22
define ADPD188BI_REG_PD_CFG 0x30
define ADPD188BI_REG_DATA_FIFO 0x64

// 함수 선언
void ADPD188BI_WriteRegister(uint8_t reg, uint16_t value);
uint16_t ADPD188BI_ReadRegister(uint8_t reg);
void ADPD188BI_Init(void);
void ADPD188BI_ReadData(uint16_t *dataBuffer, uint16_t length);

int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();

// ADPD188BI 초기화
ADPD188BI_Init();
}

void ADPD188BI_Init(void) {
// ADPD188BI 소프트 리셋
ADPD188BI_WriteRegister(ADPD188BI_REG_SOFT_RESET, 0x0001);
HAL_Delay(10);

// 클럭 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_CLK_CFG, 0x0030);

// 모드 설정 (측정 모드)
ADPD188BI_WriteRegister(ADPD188BI_REG_MODE, 0x0002);

// FIFO 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_FIFO_CFG, 0x0100);

// LED 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_LED_CFG, 0x0040);

// 포토다이오드 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_PD_CFG, 0x0020);

}

void ADPD188BI_WriteRegister(uint8_t reg, uint16_t value) {
uint8_t txData[3];
txData[0] = (reg & 0x7F); // 쓰기 명령 (MSB가 0이어야 함)
txData[1] = (value >> 8) & 0xFF; // 상위 바이트
txData[2] = value & 0xFF; // 하위 바이트

ADPD188BI_CS_LOW();
HAL_SPI_Transmit(&hspi1, txData, 3, HAL_MAX_DELAY);
ADPD188BI_CS_HIGH();

}

uint16_t ADPD188BI_ReadRegister(uint8_t reg) {
uint8_t txData[1];
uint8_t rxData[2];

txData[0] = (reg | 0x80); // 읽기 명령 (MSB가 1이어야 함)

ADPD188BI_CS_LOW();
HAL_SPI_Transmit(&hspi1, txData, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, rxData, 2, HAL_MAX_DELAY);
ADPD188BI_CS_HIGH();

return (rxData[0] << 8) | rxData[1];

}

void ADPD188BI_ReadData(uint16_t *dataBuffer, uint16_t length) {
for (int i = 0; i < length; i++) {
dataBuffer[i] = ADPD188BI_ReadRegister(ADPD188BI_REG_DATA_FIFO);
}
}

답글 남기기

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