- Arduino와 STM32F103C8의 ADC 비교
- STM32의 ADC
- 아날로그 신호가 디지털 형식으로 변환되는 방법
- STM32F103C8T6의 ADC 핀
- 필요한 구성 요소
- 회로도 및 설명
- ADC 값 읽기를위한 STM32 프로그래밍
거의 모든 임베디드 애플리케이션에서 사용되는 공통 기능 중 하나는 ADC 모듈 (아날로그-디지털 컨버터)입니다. 이러한 아날로그-디지털 변환기 는 온도 센서, 기울기 센서, 전류 센서, 플렉스 센서 등과 같은 아날로그 센서에서 전압을 읽을 수 있습니다. 따라서이 튜토리얼 에서는 STM32F103C8에서 ADC를 사용하여 Energia IDE를 사용하여 아날로그 전압을 읽는 방법을 배웁니다. 우리는 것 STM32 블루 필 보드에 작은 전위차계 인터페이스 및 아날로그 핀에 변화하는 전압을 공급 전압을 읽고 16 × 2 LCD 화면에 표시됩니다.
Arduino와 STM32F103C8의 ADC 비교
Arduino 보드에는 입력 전압 범위가 0V–5V 인 6 채널 (Mini 및 Nano의 경우 8 채널, Mega의 경우 16), 10 비트 ADC가 포함되어 있습니다. 즉, 0 ~ 5V 사이의 입력 전압을 0 ~ 1023 사이의 정수 값으로 매핑합니다. 이제 STM32F103C8의 경우 입력 범위가 0V ~ 3.3V 인 12 비트 ADC 인 10 개의 채널이 있습니다. 0 ~ 3.3V 사이의 입력 전압을 0 ~ 4095 사이의 정수 값으로 매핑합니다.
STM32의 ADC
STM32 마이크로 컨트롤러에 내장 된 ADC는 변환이 여러 단계로 수행되는 SAR (연속 근사 레지스터) 원리를 사용합니다. 변환 단계 수는 ADC 변환기의 비트 수와 같습니다. 각 단계는 ADC 클록에 의해 구동됩니다. 각 ADC 클록은 결과에서 출력까지 1 비트를 생성합니다. ADC 내부 설계는 스위치드 커패시터 기술을 기반으로합니다. STM32를 처음 사용하는 경우 STM32 시작하기 자습서를 확인하십시오.
12 비트 분해능
이 ADC는 10 채널 12 비트 ADC입니다. 여기서 10 채널이라는 용어는 아날로그 전압을 측정 할 수있는 10 개의 ADC 핀이 있음을 의미합니다. 12 비트라는 용어는 ADC의 분해능을 의미합니다. 12 비트는 2의 10 제곱 (2 12), 즉 4096을 의미합니다. 이것은 ADC의 샘플 단계 수이므로 ADC 값의 범위는 0에서 4095까지입니다. 값은 0에서 4095는 단계 당 전압 값을 기반으로하며 공식으로 계산할 수 있습니다.
VOLTAGE / STEP = REFERENCE VOLTAGE / 4096 = (3.3 / 4096 = 8.056mV) 단위당.
아날로그 신호가 디지털 형식으로 변환되는 방법
컴퓨터는 이진 / 디지털 값 (1과 0) 만 저장하고 처리합니다. 따라서 센서의 출력 (볼트 단위)과 같은 아날로그 신호는 처리를 위해 디지털 값으로 변환되어야하며 변환이 정확해야합니다. 아날로그 입력에서 STM32에 입력 아날로그 전압이 제공되면 아날로그 값을 읽고 정수 변수에 저장합니다.. 저장된 아날로그 값 (0-3.3V)은 아래 공식을 사용하여 정수 값 (0-4096)으로 변환됩니다.
입력 전압 = (ADC 값 / ADC 분해능) * 기준 전압
해상도 = 4096
참조 = 3.3V
STM32F103C8T6의 ADC 핀
PA0에서 PB1까지 STM32에는 10 개의 아날로그 핀이 있습니다.
다른 마이크로 컨트롤러에서 ADC를 사용하는 방법도 확인하십시오.
- Arduino Uno에서 ADC를 사용하는 방법?
- ADC0808과 8051 마이크로 컨트롤러의 인터페이스
- PIC 마이크로 컨트롤러의 ADC 모듈 사용
- Raspberry Pi ADC 튜토리얼
- MSP430G2에서 ADC를 사용하는 방법-아날로그 전압 측정
필요한 구성 요소
- STM32F103C8
- LCD 16 * 2
- 전위차계 100k
- 브레드 보드
- 전선 연결
회로도 및 설명
16 * 2 LCD 및 아날로그 입력을 STM32F103C8T6 보드 에 인터페이스하는 회로도 는 다음과 같습니다.
LCD에 대해 수행되는 연결은 다음과 같습니다.
LCD 핀 번호 |
LCD 핀 이름 |
STM32 핀 이름 |
1 |
접지 (Gnd) |
접지 (G) |
2 |
VCC |
5V |
삼 |
VEE |
전위차계 중심의 핀 |
4 |
등록 선택 (RS) |
PB11 |
5 |
읽기 / 쓰기 (RW) |
접지 (G) |
6 |
활성화 (EN) |
PB10 |
7 |
데이터 비트 0 (DB0) |
연결 없음 (NC) |
8 |
데이터 비트 1 (DB1) |
연결 없음 (NC) |
9 |
데이터 비트 2 (DB2) |
연결 없음 (NC) |
10 |
데이터 비트 3 (DB3) |
연결 없음 (NC) |
11 |
데이터 비트 4 (DB4) |
PB0 |
12 |
데이터 비트 5 (DB5) |
PB1 |
13 |
데이터 비트 6 (DB6) |
PC13 |
14 |
데이터 비트 7 (DB7) |
PC14 |
15 |
LED 긍정적 |
5V |
16 |
LED 네거티브 |
접지 (G) |
연결은 위의 주어진 표에 따라 이루어집니다. 회로에는 두 개의 전위차계가 있으며, 첫 번째는 전압을 변경하고 STM32에 아날로그 입력을 제공하는 데 사용할 수있는 전압 분배기에 사용됩니다. 이 전위차계의 왼쪽 핀은 STM32 (3.3V)에서 입력 양의 전압을 받고 오른쪽 핀은 접지에 연결되고 전위차계의 중앙 핀은 STM32의 아날로그 입력 핀 (PA7)에 연결됩니다. 다른 전위차계는 LCD 디스플레이의 대비를 변경하는 데 사용됩니다. STM32의 전원은 PC 또는 노트북의 USB 전원 공급 장치를 통해 제공됩니다.
ADC 값 읽기를위한 STM32 프로그래밍
이전 튜토리얼에서 USB 포트를 사용하여 STM32F103C8T6 보드 프로그래밍에 대해 배웠습니다. 따라서 지금은 FTDI 프로그래머가 필요하지 않습니다. STM32의 USB 포트를 통해 PC에 연결하고 ARDUINO IDE로 프로그래밍을 시작하기 만하면됩니다. 아날로그 전압을 읽기 위해 ARDUINO IDE에서 STM32를 프로그래밍하는 것은 매우 간단합니다. arduino 보드와 동일합니다. STM32의 점퍼 핀을 변경할 필요가 없습니다.
이 프로그램에서 아날로그 값을 읽고 그 값으로 전압을 계산 한 다음 LCD 화면에 아날로그 및 디지털 값을 모두 표시합니다.
먼저 LCD 핀을 정의합니다. 이는 LCD 핀이 연결된 STM32의 핀을 정의합니다. 요구 사항에 따라 수정할 수 있습니다.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // LCD가 연결된 핀 이름을 언급합니다.
다음으로 LCD 디스플레이를위한 헤더 파일 을 포함합니다. 이것은 STM32가 LCD와 통신하는 방법에 대한 코드가 포함 된 라이브러리를 호출합니다. 또한 위에서 정의한 핀 이름으로 Liquid Crystal 함수가 호출되는지 확인하십시오.
#포함
내부 설정 () 함수를, 우리는 단지 LCD 화면에 표시 할 인트로 메시지를 줄 것이다. LCD와 STM32의 인터페이스에 대해 배울 수 있습니다.
lcd.begin (16, 2); // 16 * 2 LCD를 사용하고 있습니다 . lcd.clear (); // 화면 지우기 lcd.setCursor (0, 0); // 첫 번째 행 첫 번째 열에서 lcd.prin t ("CIRCUITDIGEST"); //이 lcd를 인쇄합니다 .setCursor (0, 1); // 두 번째 행에서 첫 번째 열 n lcd.print ("STM32F103C8"); // 생 인쇄 의의 지연 (2000); // 2 초 동안 대기 lcd.clear (); // 화면 지우기 lcd.setCursor (0, 0); // 첫 번째 행 첫 번째 열에서 lcd.print ("USING ADC IN"); // Print this lcd.setCursor (0,1); // 두 번째 행 첫 번째 열에서 lcd.print ("STM32F103C8"); // Print this delay (2000); // 2 초 동안 대기 lcd.clear (); // 화면 지우기
마지막으로 infinite loop () 함수 내 에서 potentiometer에서 PA7 핀에 공급되는 아날로그 전압을 읽기 시작 합니다. 이미 논의했듯이 마이크로 컨트롤러는 디지털 장치이며 전압 레벨을 직접 읽을 수 없습니다. SAR 기술을 사용하여 전압 레벨은 0에서 4096까지 매핑됩니다. 이러한 값을 ADC 값이라고하며이 ADC 값을 얻으려면 다음 라인을 사용하면됩니다.
int val = analogRead (A7); // 핀 PA 7 에서 ADC 값 읽기
여기서 analogRead () 함수 는 pin의 아날로그 값을 읽는 데 사용됩니다. 마지막으로이 값을 " val " 이라는 변수에 저장합니다. 이 변수에 저장 될 0에서 4096 범위의 값만 가져 오므로이 변수의 유형은 정수입니다.
다음 단계는 ADC 값에서 전압 값 을 계산하는 것 입니다. 이를 위해 다음 공식이 있습니다.
전압 = (ADC 값 / ADC 분해능) * 기준 전압 e
우리의 경우 마이크로 컨트롤러의 ADC 분해능이 4096이라는 것을 이미 알고 있습니다. ADC 값은 이전 라인에서도 발견되며 val이라는 변수를 저장했습니다. 기준 전압은 마이크로 컨트롤러의 작동 전압과 동일하다. STM32 보드가 USB 케이블을 통해 전원이 공급되는 경우 작동 전압은 3.3V 입니다. 보드의 Vcc 및 접지 핀에서 멀티 미터를 사용하여 작동 전압을 측정 할 수도 있습니다. 따라서 위의 공식은 아래와 같이 우리의 경우에 적합합니다.
부동 전압 = (float (val) / 4096) * 3.3; // ADC 값을 voltag e 로 변환하는 공식
line float (val) 과 혼동 될 수 있습니다 . 이것은 변수“val”을 int 데이터 유형에서“float”데이터 유형 으로 변환하는 데 사용됩니다. 이 변환은 float로 val / 4096의 결과를 얻은 경우에만 3.3을 곱할 수 있기 때문에 필요합니다. 값이 정수로 수신되면 항상 0이되고 결과도 0이됩니다. ADC 값과 전압을 계산하고 나면 남은 것은 LCD 화면에 결과 를 표시하는 것뿐입니다. 다음 줄을 사용하여 수행 할 수 있습니다.
lcd.setCursor (0, 0); // 커서를 0 열, 0 행으로 설정 lcd.print ("ADC Val:"); lcd.print (val); // ADC 값 표시 lcd.setCursor (0, 1); // 커서를 0 열, 1 행으로 설정 lcd.print ("Voltage:"); lcd.print (전압); // 디스플레이 전압
완전한 코드와 데모 비디오 는 다음과 같습니다.