반도체, 임베디드 Study/STM32

STM32 - ADC 이론 (DMA, ADC 함수)

잇(IT) 2024. 5. 30. 20:02
728x90

ADC (Analog to Digital Converter)

 

아날로그 신호를 디지털로 변환해주는 장치다.

 

ADC 특징

1. 3개의 ADC 컨트롤러가 있다.

2. 각각 최대 12비트의 해상도를 가지고 있다. (0~4095의 디지털 값을 얻을 수 있다.)

3. 최대 24개의 채널로 동시에 아날로그 신호를 24개까지 처리할 수 있다.

4. 처리 속도는 7.2MSPS(Mega Sampling Per Second)의 속도로 샘플링 가능하다.


Vref+, Vref- : 아날로그 신호의 음과 양의 최대 범위인 기준 전압을 입력 받는다.

ADCx_IN0~15 : 총 16개의 입력을 받을 수 있다.

Temp sensor : 내부에 온도센서가 있어 ADC를 통해 디지털 온도값을 받을 수 있다.

ADCCLK : ADC를 동작시키는 클럭에 해당한다.

OVR, EOC, JEOC, AWD : ADC 인터럽트

(OVR : Overrun / EOC : End of conversion of a regular group / JEOC : End of conversion of an injected group / AWD : Analog watchdog status bit is set)

 

Vref+ : 입력 아날로그 기준 전압으로 1.8V부터 VDDA까지의 범위

VDDA : 아날로그 전원으로 full speed일 때 2.4V부터 VDD까지의 범위

VSSA : 아날로그 전원의 접지


Zio 커넥터는 아두이노와 호환되며, 아두이노 아날로그 입력 핀과 동일한 위치에 ADC 포트가 존재한다.

F303ZE, F412ZG/F413ZH 보듸 경우에만 174/171/167/165/150/140이 Close되어 있기 때문에 연결되어 있고, STM32F429 보드를 사용 중이기 때문에 위에 해당하는 SB에 연결된 Pin들은 현재 사용할 수 없다.


Polling, Interrupt 모드의 경우 앞서 UART 통신을 통해 구현해보았고, DMA 모드가 추가되었다.

 

DMA 모드

 

Direct Memory Access 모드로 CPU 도움 없이 주변장치들이 직접 메모리에 읽고 쓸 수 있는 방식이다.

CPU의 I/O 작업을 덜어주기 위한 방식이다.

DMA는 source와 destination, 전송할 바이트 수만 알려주면 data를 전송하고 프로세서가 신경 쓰지 않아도 된다.

DMA는 모든 data 전송이 끝나면 HW interrupt로 CPU에게 완료를 알려주는 구조다.

2개의 DMA Controller가 동시 동작이 가능하다.

위 Data sheet를 보게 되면 DMA는 Memory, Peripheral 2개의 포트를 가진다.

각 DMA는 중간의 8개의 Stream을 가지고 있으며, 좌측을 보게되면 각 Stream은 8개의 선택적 채널을 가지고 있다.

1개의 Stream에서 1개의 채널(Request)만 사용이 가능하다.


기존 방식

uint16_t ADC_Val[4];

waiting_ADDConversion(CH1);
ADC_Val[0] = ADC -> DR;

waiting_ADCConversion(CH1); 함수는 ADC가 채널 1에서의 변환을 완료할 때까지 대기하는 역할이다. 이 함수가 반환되었다는 것은 CH1에서의 ADC 변환이 완료되었음을 의미한다.

ADC_Val[0] = ADC -> DR; 는 ADC 데이터 레지스터를 참조한다. 이 레지스터는 가장 최근에 완료된 변환 결과를 담고 있다.

결과적으로 최근에 변환된 값을 변수에 저장하는 것이다.

 

DMA 방식

HAL_ADC_Start_DMA(&hadc1, (uint8_t *)buf, 1);

DMA 방식은 위와 같이 HAL 함수를 이용하여 간단하게 나타낼 수 있다.


HAL_ADC 함수

 

HAL_ADC_Init(), HAL_ADC_DeInit()

- ADC의 초기화, 초기화 해제

HAL_ADC_MspInit(), HAL_ADC_MspDeInit()

- ADC Msp의 초기화, 초기화 해제

HAL_ADC_Start(), HAL_ADC_Stop()

- ADC 변환 시작, 정지

HAL_ADC_PollForConversion(), HAL_ADC_PollForEvent()

- ADC 폴링 모드

HAL_ADC_Start_IT(), HAL_ADC_Stop_IT()

- ADC 인터럽트 시작, 정지

HAL_ADC_Start_DMA(), HAL_ADC_Stop_DMA()

- ADC DMA 시작, 정지

HAL_ADC_IRQHandler()

- ADC 인터럽트 핸들러

HAL_ADC_ConvCpltCallback()

- ADC 변환이 완료되면 콜백

HAL_ADC_GetValue()

- ADC 변환 결과 값을 반환

HAL_ADC_ConfigChannel()

- ADC 채널 설정

728x90