반도체 Study/STM32

STM32 - ADC값에 따른 LED 점멸 (Nucleo-144용 I/O 보드)

잇(IT) 2024. 6. 1. 02:49
728x90

Nucleo-144용 I/O 보드는 위와 같이 생겼고, 각 부품에 대한 포트 및 핀 번호는 위의 표와 같다.

 

이전 글에서 ADC를 통해 아날로그 신호를 디지털로 변환시켜 출력하는 작업을 해보았다.

 

I/O 보드에 있는 가변 저항과 LED를 통해 ADC 결과값에 따라 LED를 점멸할 것이다.

 

ADC : 0~4095까지 표현이 가능하다. 
LED = 8개


0~500 : led 1
500~1000 : led 2
1000~1500 : led 3
1500~2000 : led 4
2000~2500 : led 5
2500~3000 : led 6
3000~3500 : led 7
3500~ 최대 : led 8

 

ADC 값이 위와 같을 때 해당 LED를 점멸하도록 할 것이다.

 

I/O 보드의 가변저항은 PC0에 해당한다.

해당 ADC1 포트를 설정해주고, DMA 방식으로 데이터를 전송할 것이다.

LED 포트로 GPIO 설정을 해준다.

 

  HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_value, 1);

메인함수에서 DMA를 통해 전송이 완료되면 인터럽트가 발생하고 Callback 함수를 호출한다.

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	if(hadc->Instance == ADC1)
	{
		memset(buf, 0, sizeof(buf));
		adc_value = HAL_ADC_GetValue(&hadc1);
		sprintf(buf, "ADC DMA Value : %lu\r\n", adc_value);
		HAL_UART_Transmit(&huart3, (uint8_t *)buf, sizeof(buf), 1000);
//		HAL_ADC_Start_IT(&hadc1);
		if(adc_value > 0 && adc_value < 500)
		{
			GPIOD->ODR=0x01;
		}
		else if(adc_value > 500 && adc_value < 1000)
		{
			GPIOD->ODR=0x02;
		}
		else if(adc_value > 1000 && adc_value < 1500)
		{
			GPIOD->ODR=0x04;
		}
		else if(adc_value > 1500  && adc_value < 2000)
		{
			GPIOD->ODR=0x08;
		}
		else if(adc_value > 2000 && adc_value < 2500)
		{
			GPIOD->ODR=0x10;
		}
		else if(adc_value > 2500 && adc_value <3000)
		{
			GPIOD->ODR=0x20;
		}
		else if(adc_value > 3000 && adc_value <3500)
		{
			GPIOD->ODR=0x40;
		}
		else if(adc_value > 3500 && adc_value < 4100)
		{
			GPIOD->ODR=0x80;
		}
		HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_value, 1);
	}
}

값에 따라 LED를 점멸하는 코드를 작성해준다.

 

 

 

 

 

728x90