- 필요한 재료
- STM8S103F3P6의 ADC
- STM8S에서 ADC 값을 읽고 LCD에 표시하기위한 회로도
- STM8S103F3P6 용 ADC 라이브러리
- 아날로그 전압을 읽고 LCD에 표시하는 STM8S 프로그램
- STM8S를 사용하여 2 개의 전위차계에서 아날로그 전압 읽기
STM8S 마이크로 컨트롤러 자습서를 따르는 일반 독자라면 지난 자습서에서 16x2 LCD를 STM8과 인터페이스하는 방법을 배웠 음을 알 것입니다. 이제이 튜토리얼을 진행하면서 STM8S103F3P6 마이크로 컨트롤러에서 ADC 기능을 사용하는 방법을 배웁니다. ADC는 임베디드 프로그래머가 다양한 전압, 전류, 온도, 습도 등과 같이 지속적으로 변화하는 장치를 측정하는 데 자주 사용되는 마이크로 컨트롤러의 매우 유용한 주변 장치입니다.
우리가 알고 있듯이 "우리는 디지털 장치가있는 아날로그 세계에 살고 있습니다". 즉, 풍속, 광도, 온도와 같은 우리 주변의 모든 것, 속도, 속도, 압력 등과 같은 우리가 다루는 모든 것은 본질적으로 아날로그라는 것을 의미합니다. 그러나 마이크로 컨트롤러와 마이크로 프로세서는 디지털 장치이며 ADC (Analog to Digital Converters)라는 중요한 주변 장치 없이는 이러한 매개 변수를 측정 할 수 없습니다. 따라서이 기사에서는 COMIC C 컴파일러 를 사용 하여 STM8S 마이크로 컨트롤러 에서 ADC 를 사용하는 방법을 알아 보겠습니다.
필요한 재료
이 기사에서는 두 개의 전위차계에서 두 개의 아날로그 전압 값을 읽고 ADC 값을 16x2 LCD 디스플레이에 표시합니다. 이를 위해 다음 구성 요소가 필요합니다.
- STM8S103F3P6 개발 보드
- ST-Link V2 프로그래머
- 16x2 LCD
- 전위차계
- 전선 연결
- 1k 저항
STM8S103F3P6의 ADC
많은 유형의 ADC가 있으며 각 마이크로 컨트롤러에는 자체 사양이 있습니다. STM8S103F3P6에는 5 채널 및 10 비트 분해능 의 ADC가 있습니다 . 10 비트 분해능으로 0에서 1024까지의 디지털 값을 측정 할 수 있으며 5 채널 ADC는 ADC를 지원할 수있는 마이크로 컨트롤러에 5 개의 핀이 있음을 나타냅니다.이 5 개의 핀은 아래 그림에서 강조 표시됩니다.
보시다시피이 5 개의 핀 (AIN2, AIN3, AIN4, AIN5 및 AIN6)은 모두 다른 주변 장치와 멀티플렉싱되어 ADC 핀으로 작동하는 것 외에 이러한 핀은 예를 들어 다른 통신을 수행하는데도 사용될 수 있습니다., 핀 2 및 3 (AIN5 및 AIN 6)은 ADC뿐만 아니라 직렬 통신 및 GPIO 기능에도 사용할 수 있습니다. 세 가지 목적 모두에 동일한 핀을 사용할 수 없으므로 ADC에이 두 핀을 사용하면 직렬 통신을 수행 할 수 없습니다. STM8S103P36의 다른 중요한 ADC 특성 은 데이터 시트에서 가져온 아래 표에서 찾을 수 있습니다.
위의 표에서 Vdd는 작동 전압을 나타내고 Vss는 접지를 나타냅니다. 따라서 개발 보드의 경우 3.3V에서 작동하는 마이크로 컨트롤러가 있습니다. STM8S 자습서 시작하기에서 개발 보드 회로 다이어그램을 확인할 수 있습니다. 3.3V를 작동 전압으로 사용하면 ADC 클록 주파수를 1 ~ 4MHz로 설정할 수 있으며 변환 전압 범위는 0 ~ 3.3V입니다. 즉, 10 비트 ADC는 0V (Vss)가 제공되면 0을 읽고 3.3V (Vdd)가 제공되면 최대 1024를 읽습니다. 필요한 경우 MCU의 작동 전압을 변경하여이 0-5V를 쉽게 변경할 수 있습니다.
STM8S에서 ADC 값을 읽고 LCD에 표시하기위한 회로도
이 프로젝트에 사용 된 전체 회로도는 아래에 나와 있으며 이전에 논의한 STM8S LCD 튜토리얼과 매우 유사합니다.
보시다시피 LCD를 제외한 유일한 추가 구성 요소는 두 개의 전위차계 POT_1 및 POT_2 입니다. 이러한 포트는 이전 핀아웃 이미지에서 설명한대로 ANI2 및 ANI6 핀인 포트 PC4 및 PD6에 연결됩니다.
전위차계는 가변 할 때 아날로그 핀에서 0 ~ 5V가되는 방식으로 연결됩니다. 이 아날로그 전압을 디지털 값 (0 ~ 1024)으로 읽고 LCD 화면에 표시하도록 컨트롤러를 프로그래밍 할 것입니다. 그런 다음 등가 전압 값을 계산하여 LCD에 표시합니다. 컨트롤러는 3.3V로 전원이 공급되므로 ADC 핀에 5V를 제공하더라도 0V에서 3.3V까지만 읽을 수 있습니다..
연결이 완료되면 하드웨어가 아래와 같이 보입니다. 오른쪽에는 두 개의 전위차계가 있고 왼쪽에는 ST-link 프로그래머가 있습니다.
STM8S103F3P6 용 ADC 라이브러리
STM8S에서 ADC 기능을 프로그래밍하기 위해 SPL 라이브러리와 함께 Cosmic C 컴파일러를 사용할 것입니다. 그러나 프로세스를 더 쉽게 만들기 위해 GitHub에서 찾을 수있는 다른 헤더 파일을 아래 링크로 만들었습니다.
STM8S103F3P6 용 ADC 라이브러리
수행중인 작업을 알고 있다면 위 코드를 사용하여 헤더 파일을 만들고 프로젝트 페이지의 "include files"디렉토리에 추가 할 수 있습니다. 그렇지 않으면 STM8S 튜토리얼 시작하기를 따라 프로그래밍 환경 및 컴파일러를 설정하는 방법을 알 수 있습니다. 설정이 준비되면 IDE에 최소한 빨간색으로 둘러싸인 다음 헤더 파일이 있어야합니다.
위의 헤더 파일은 ADC_Read () 라는 함수로 구성됩니다. 이 함수는 메인 프로그램에서 호출하여 모든 핀에서 ADC 값을 얻을 수 있습니다. 예를 들어 ADC_Read (AN2) 는 결과적으로 핀 AN2의 ADC 값을 반환합니다. 기능은 아래와 같습니다.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (사용); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); 결과 = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
보시다시피이 함수에 8 개의 매개 변수를 전달할 수 있으며 이는 ADC 구성 방법을 정의합니다. 위의 라이브러리 코드에서 변환 모드를 연속으로 설정 한 다음 매개 변수에 전달 된 채널 번호를 얻습니다. 그런 다음 기본적으로 컨트롤러의 CPU 주파수를 설정해야합니다 (외부 크리스털을 연결하지 않은 경우). STM8S는 16Mhz 내부 발진기와 함께 작동합니다. 그래서 프리스케일러 값으로 “ ADC1_PRESSEL_FCPU_D18 ”을 언급했습니다. 이 함수 내에서 SPL stm8s_adc1.h 헤더 파일에 정의 된 다른 메서드를 사용하고 있습니다. 먼저 ADC 핀 초기화를 해제 한 다음 ADC1_Init () 를 사용하여 ADC 주변 장치를 초기화합니다. SPL 사용자 매뉴얼에서이 기능의 정의는 다음과 같습니다.
다음으로 타이머를 사용하여 외부 트리거를 설정하고 여기서 사용하지 않을 것이므로 외부 트리거를 비활성화합니다. 그런 다음 정렬을 오른쪽으로 설정하고 마지막 두 매개 변수를 사용하여 Schmitt 트리거를 설정하지만이 자습서에서는이를 비활성화합니다. 따라서 간단히 말하면 외부 트리거 및 슈미트 트리거가 비활성화 된 상태에서 필요한 ADC 핀에서 연속 변환 모드로 ADC가 작동합니다. 외부 트리거 또는 Schmitt 트리거 옵션을 사용하는 방법에 대한 자세한 정보가 필요한 경우 데이터 시트를 확인할 수 있습니다.이 자습서에서는 이에 대해 설명하지 않습니다.
아날로그 전압을 읽고 LCD에 표시하는 STM8S 프로그램
main.c 파일에 사용 된 전체 코드 는이 페이지 하단에서 찾을 수 있습니다. 필요한 헤더 파일과 소스 파일을 추가 한 후 메인 파일을 직접 컴파일 할 수 있어야합니다. 메인 파일의 코드에 대한 설명은 다음과 같습니다. 이전 튜토리얼에서 이미 논의 했으므로 STM8S LCD 프로그램에 대해서는 설명하지 않겠습니다.
코드의 목적은 두 핀에서 ADC 값을 읽고이를 전압 값으로 변환하는 것입니다. 또한 LCD에 ADC 값과 전압 값을 모두 표시합니다. 그래서 정수 형식의 변수를 받아서 문자로 변환하여 LCD에 표시하는 LCD_Print Var 이라는 함수를 사용했습니다. 간단한 모듈러스 (%) 및 나누기 (/) 연산자를 사용하여 변수에서 각 숫자를 가져오고 아래와 같이 d1, d2, d3 및 d4와 같은 변수를 입력했습니다. 그런 다음 LCD_Print_Char 함수를 사용하여 이러한 문자를 LCD에 표시 할 수 있습니다.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var % 10 + '0'; d3 = (var / 10) % 10 + '0'; d2 = (var / 100) % 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
다음으로 main 함수 아래에 4 개의 변수가 선언되었습니다. 그중 2 개는 ADC 값 (0 ~ 1024)을 저장하는 데 사용되고 나머지 2 개는 실제 전압 값을 얻는 데 사용됩니다.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
다음으로, 아날로그 전압을 읽기 위해 GPIO 핀과 클럭 구성을 준비해야합니다. 여기서는 각각 핀 PC4 및 PD6 인 핀 AIN2 및 AIN6에서 아날로그 전압을 읽습니다. 이 핀을 아래와 같이 플로팅 상태로 정의해야합니다. 또한 ADC 용 클록 주변 장치를 활성화 할 것입니다.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // ADC에 대한 주변 클럭 활성화 GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
이제 핀이 준비되었으므로 아날로그 전압을 읽기 위해 무한 while 루프에 들어가야합니다. 헤더 파일이 있으므로 아래 라인을 사용하여 핀 AIN2 및 AIN 6에서 아날로그 전압을 쉽게 읽을 수 있습니다.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
다음 단계는이 ADC 판독 값 (0 ~ 1023)을 아날로그 전압으로 변환하는 것입니다. 이렇게하면 핀 AIN2 및 AIN6에 제공된 정확한 전압 값을 표시 할 수 있습니다. 아날로그 전압을 계산하는 공식은 다음과 같이 주어질 수 있습니다.
아날로그 전압 = ADC 읽기 * (3300/1023)
STM8S103F3 컨트롤러의 경우 10 비트 분해능의 ADC가 있으므로 1023 (2 ^ 10)을 사용했습니다 . 또한 우리의 개발에서 3300 인 3.3V로 컨트롤러에 전원을 공급하므로 위의 공식에서 3300을 1023으로 나눴습니다. 약 3300/1023은 3.226을 제공하므로 프로그램에서 ADC 전압을 사용하여 실제 ADC 전압을 측정하는 다음 라인이 있습니다.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) ADC 값 1을 0에서 3300mV로 변환 ADC_voltage_2 = ADC_value_2 * (3.226); // ADC 값 1을 0에서 3300mV로 변환
코드의 나머지 부분은 LCD 화면에이 네 가지 값을 표시하는 데만 사용됩니다. 또한 LCD가 500mS마다 업데이트되도록 500ms의 지연이 있습니다. 더 빠른 업데이트가 필요한 경우이 값을 더 줄일 수 있습니다.
STM8S를 사용하여 2 개의 전위차계에서 아날로그 전압 읽기
코드를 컴파일하고 개발 보드에 업로드합니다. 컴파일 오류가 발생하면 앞에서 설명한대로 모든 헤더 파일과 소스 파일을 추가했는지 확인하십시오. 코드가 업로드되면 "ADC on STM8S"라는 작은 환영 메시지가 표시되고 아래 화면이 표시됩니다.
값 D1 및 D2는 각각 핀 Ain2 및 AIN6의 ADC 값을 나타냅니다. 오른쪽에는 등가 전압 값도 표시됩니다. 이 값은 각각 핀 AIN2 및 AIN6에 나타나는 전압과 같아야합니다. 멀티 미터를 사용하여 동일한 것을 확인할 수 있으며 전위차계를 변경하여 전압 값도 그에 따라 변경되는지 확인할 수도 있습니다.
완전한 작업은 아래 비디오에서도 찾을 수 있습니다. 튜토리얼을 즐기고 유용한 것을 배우 셨기를 바랍니다. 질문이 있으시면 아래 댓글 섹션에 남겨주세요. 포럼을 사용하여 토론을 시작하거나 다른 기술 질문을 게시 할 수도 있습니다.