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
'Embedded > STM32, Arduino' 카테고리의 다른 글
STM32 - I2C 이론 (0) | 2024.06.09 |
---|---|
STM32 - DAC (DAC를 통한 LED 밝기 조절) (0) | 2024.06.08 |
STM32 - ADC 구현 (Polling, Interrupt, DMA / 아두이노 Plotter 모드로 그래프 확인) (0) | 2024.05.30 |
STM32 - ADC 이론 (DMA, ADC 함수) (0) | 2024.05.30 |
STM32 - UART 구현 - (3) (Interrupt, 코드 상세 구현) (0) | 2024.05.29 |