안녕하세요. 오늘은 STM32로 ADC기능을 사용하여 그래프를 표시해보겠습니다.
간단히 나타내면 아래의 그림과 같습니다. STM32로 저항의 전압을 읽어서 PC 프로그램으로 uart 통신을 통해 값을 보내주고 PC 프로그램에서는 받은 데이터를 일정한 시간 간격으로 그래프를 표시해 주는 것입니다.
*하드웨어구성
가변저항2개를 이용하여 전압값을 읽게 했습니다.
Vin은 3.3V이고 R1는 10k이고 R2는 0~10k이므로 Vout은 0~1.65V 나옵니다.
*STM32 FW
구현해야하는건 ADC값 읽는거와 UART통신으로 PC에게 데이터를 보내주는것입니다. 뉴클레오보드를 사용하므로 usb to uart는 이미 uart2에 할당되어있습니다.
printf 기능을 사용할것이므로 아래의 헤더파일과 함수만 추가해주면 됩니다.
#include <stdio.h>
int __io_putchar(int ch)
{
if ( ch == '\n' )
HAL_UART_Transmit(&huart2, (uint8_t*)&"\r", 1, HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
_io_putchar는 표준 출력 함수(예: printf)의 출력 방향을 UART로 리디렉션하기 위해 사용됩니다.
\n이 입력된 경우 \r\n을 전송하도록 구현하여, 사용하는 프로그램(터미널)에 따라 줄 바꿈이 정상적으로 처리되지 않는 문제를 방지합니다.
ADC설정인데, Continous Conversion Mode를 Enabled한거 말고는 바꾼게 없습니다.
10ms주기로 ADC를 변환해서 UART통신으로 데이터를 보냅니다. 데이터의 포맷은 아래와 같습니다.
ADC: 2067 , VOL: 1665 mV
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start(&hadc1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
uint16_t adc = HAL_ADC_GetValue(&hadc1);
int voltage_mV = (adc*3300)/4096;
printf("ADC: %d , VOL: %d mV\n", adc, voltage_mV);
}
else
{
printf("ERROR");
}
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
*PC프로그램
ADC: 2067 , VOL: 1665 mV문자를 받으면 "VOL: "와 " mV"사이에있는 문자를 string으로 저장하고 그래프에 표시해줍니다. 그래프에 표시해주는건 timer를 이용하는데 interval은 10ms로 했습니다.
가변저항을 조절해서 전압값이 변했고 선 그래프에 나타내는값도 맞춰서 변했습니다.
'STM32 > 활용' 카테고리의 다른 글
STM32로 DS1302제어하기(3편) (0) | 2023.01.24 |
---|---|
STM32로 DS1302제어하기(2편) (1) | 2023.01.07 |
STM32로 DS1302제어하기(1편) (0) | 2023.01.04 |