STM32F746G-DISCO 보드에서 사용되는 STM32F746NG 칩에는 아날로그 신호를 디지털 신호로 변환하기 위해 12bit의 ADC가 들어있는데 최대 19 채널(16개의 외부 소스 + 2개의 내부 소스 + VBAT 채널)을 사용할 수 있으며 아래와 같은 특징을 가지고 있습니다.
• 12-bit, 10-bit, 8-bit or 6-bit configurable resolution
• Interrupt generation at the end of conversion, end of injected conversion, and in case of analog watchdog or overrun events
• Single and continuous conversion modes
• Scan mode for automatic conversion of channel 0 to channel ‘n’
• Data alignment with in-built data coherency
• Channel-wise programmable sampling time
• External trigger option with configurable polarity for both regular and injected conversions
• Discontinuous mode
• Dual/Triple mode (on devices with 2 ADCs or more)
• Configurable DMA data storage in Dual/Triple ADC mode
• Configurable delay between conversions in Dual/Triple interleaved mode
• ADC supply requirements: 2.4 V to 3.6 V at full speed and down to 1.8 V at slower speed
• ADC input range: V REF– ≤ V IN ≤ V REF+
• DMA request generation during regular channel conversion
아래는 한개의 ADC 블록의 동작을 설명한 이미지입니다.
위 그림의 왼편의 붉은색 사각형 부분의 ADCx_IN0 ~ IN15까지 16개의 입력과 그 아래 녹색 사각형 부분의 Temp sensor, VREFINT, VBAT 3개의 입력으로 총 19개의 입력이 ADC의 입력으로 사용됩니다.
입력된 소스는 analog mux를 거쳐 이 입력되는 데이터 중 Regular channels은 16개까지, Injected channels은 4개까지 사용 가능합니다.
그리고 위 그림 위쪽의 파란색 사각형 부분을 보면 Analog watchdog이 지원되는데 ADC로 측정된 값이 설정된 high/low threshold값 이상 또는 이하의 값이 되면 인터럽트 이벤트로 알려주는 기능이 있습니다.
아래 그림은 채널별 소스와의 연결을 확인 할 수 있는 이미지인데 VIN[0..15]까지는 ADC1/2/3 모두 동일하며 단지 ADC1만 VIN[17], VIN[18]번에 2개의 내부 소스와 연결되어 있습니다.
ADC1의 내부적으로 사용되는 2개의 채널 VIN[17]은 VREFINT로 VIN[18]은 온도센서 또는 VBAT 측정용으로 사용됩니다.
ADC는 변환 방법에 따라 single, continuous, scan, discontinuous 모드가 있습니다.
- single모드 : regular/Injected 채널에서 동작되며 한번만 측정하는 방식입니다.
- continous모드 : Injected 채널은 continous 모드에서 동작 안되며 (auto-injection제외) regular 그룹 채널을 연속적으로 측정할 수 있는 방식입니다.
- scan 모드 : 선택한 여러 채널을 측정하는 방식입니다.
- discontinous모드 : 선택한 여러 채널을 n(n ≤ 8)개의 서브 채널로 다시 나눠서 측정하는 방식입니다.
ADC는 2가지 group이 있습니다.
- regular group : 최대 16개의 채널로 구성된 이 그룹은 선택한 채널들을 1~n 까지 순차적으로 ADC 변환을 하는 데 사용됩니다.
- injected group : trigger에 의해 regular 그룹을 ADC변환하는 중간에 최대 4개 채널로 구성된 injected 그룹을 사용하여 중간에 처리되도록 구성된 그룹으로 injected 된 채널의 ADC가 끝마치면 원래의 regular 그룹으로 복귀하여 ADC 변환이 계속됩니다.
STM32F746G-DISCO 보드의 지원되는 ADC mode 중 간단히 continous 모드를 테스트해 보았습니다.
먼저 ADC로 사용될 포트를 회로도에서 살펴보았습니다.
보드 후면의 아두이노 컨넥터의 A5번 포트(ADC3 - PF6)를 사용하여 ADC 테스트를 해 보려고 합니다.
STM32CubeIDE에서 새 프로젝트를 생성 후 핀 초기화 후 SYS/USART1/ADC3 부분만 설정하였습니다.
ADC3의 설정은 아래와 같이 설정하였습니다.
main 함수의 while문에 아래와 같이 ADC를 읽어 들이는 코드를 추가하였습니다.
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_ADC_Start(&hadc3);
while (1)
{
if (HAL_ADC_PollForConversion(&hadc3, 1000000) == HAL_OK) {
adc_value = HAL_ADC_GetValue(&hadc3);
printf("adc_value = %d\r\n", (int)adc_value);
}
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
아래와 그림과 같이 VCC(+3.3V)/GND/A5 3개의 라인을 가변저항과 연결하였습니다.
가변저항을 좌/우로 회전시키면서 읽어 들인 adc 값을 확인해 보았습니다.
adc가 12bit를 지원하므로 0 ~ 4095까지의 범위내에서 정상 동작되며 continuous 모드로 설정하여 별다른 설정 없이도 연속적으로 adc 값을 읽어오고 있습니다.
'Hardware > STM32' 카테고리의 다른 글
[STM32F746G-DISCO] SDRAM 사용하기 (0) | 2024.07.08 |
---|---|
[STM32F746G-DISCO] FMC(Flexible Memory Controller) (0) | 2024.07.08 |
[STM32F746G-DISCO] RCC (Reset and Clock Control) (0) | 2024.07.07 |
[STM32F746G-DISCO] SPI 사용하기 (feat. OLED) (0) | 2024.07.06 |
[STM32F746G-DISCO] I2C 사용하기 (feat. OLED) (0) | 2024.07.06 |
댓글