Embedded

ARM Cortex M4 core - (4) ADC를 활용한 스위치 Voltage확인

MiddleJo 2024. 9. 4. 19:09

ADC.zip
10.47MB

목차

1. 배경

2. 보드 구성 및 소스코드

3. 실습결과

 

 

1. 배경

 

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

현실에서는 다 아날로그 신호로 되어 있죠.

우리가 사용할 디지털 신호로 바꾸는 방법은 굉장히 중요합니다.

 

저는 가지고 있는 LCM1602 IIC 쉴드 장치를 가지고 실습해보려고 합니다.

출처: https://www.devicemart.co.kr/goods/view?no=1279486

 

사진에 보이는 것처럼 버튼들이 있는데,

버튼들의 Digital 변환값을 확인할 것입니다.

 

 

 

위의 이론상의 계산값과 실습을 통한 결과값이 일치하는지 확인해보려고 합니다.

 

 

2. 보드 구성 및 소스코드

기본적으로, Board Select 선택 시 불필요한 기능이 포함되어

코드가 길어지고 보기 불편합니다.

따라서 MCU 방법으로 직접 세팅하겠습니다.

기본 상태에서 코딩이 필요한 부분만을 언급할 예정이며,

자세한 것은 첨부된 파일을 참고하시면 됩니다.

 

- 보드 세팅

 

- ADC 세팅

 

Polling 모드가 아닌 Interrupt 모드가 빠르기 때문에

저는 Interrupt 방식을 채택할 것입니다.

 

 

- Main

 

 

- ADC Callback

/* USER CODE BEGIN 4 */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
  if(hadc -> Instance == ADC1)
  {
	  adc_value = HAL_ADC_GetValue(&hadc1);
	  memset(uart_buf, 0, sizeof(uart_buf));
	  sprintf(uart_buf,"ADC Value : %d \r\n", adc_value);
//	  sprintf(uart_buf,"ADC_Value\n%d", adc_value);
	  HAL_UART_Transmit(&huart3, (uint8_t *)uart_buf, sizeof(uart_buf), 1000);
//	  HAL_ADC_Start_IT(&hadc1);
	  HAL_ADC_Start_DMA(&hadc1, (uint32_t *)uart_buf, 1);
  }
}

/* USER CODE END 4 */

 

인터럽트 함수를 찾는 법은 이전 글 참고 부탁드립니다.

memset 함수는 메모리를 원하는 사이즈로 조절하는 함수입니다.

sprintf 함수는 문자열을 생성해 버퍼에 저장하는 함수입니다.

HAL_ADC_Start_DMA 함수는 DMA 전송이 완료되면 인터럽트를 활성화하는 함수입니다.

 

 

- PV

 

 

3. 실습결과

 

좌측부터 Up, Down, Left, Right, Select 버튼을 눌렀을 때의 값입니다.

 

이론상의 값과 비슷한 것을 확인할 수 있습니다.