How to use ADC in STM32F103C8 - Measuring Analog Voltage
Một tính năng phổ biến được sử dụng trong hầu hết mọi ứng dụng nhúng là mô-đun ADC (Bộ chuyển đổi tương tự sang kỹ thuật số). Các Bộ chuyển đổi Analog sang kỹ thuật số này có thể đọc điện áp từ các cảm biến tương tự như Cảm biến nhiệt độ, Cảm biến nghiêng, Cảm biến dòng điện, Cảm biến Flex và nhiều hơn thế nữa. Vì vậy, trong hướng dẫn này, chúng ta sẽ học cách sử dụng ADC trong STM32F103C8 để đọc điện áp Analog bằng Energia IDE. Chúng tôi sẽ giao tiếp một chiết áp nhỏ với bảng STM32 Blue Pill và cung cấp điện áp thay đổi cho chân Analog, đọc điện áp và hiển thị trên màn hình LCD 16x2.
So sánh ADC trong Arduino và STM32F103C8
Trong bảng Arduino, nó chứa 6 kênh (8 kênh trên Mini và Nano, 16 kênh trên Mega), ADC 10 bit với dải điện áp đầu vào là 0V – 5V. Điều này có nghĩa là nó sẽ ánh xạ điện áp đầu vào từ 0 đến 5 volt thành các giá trị nguyên từ 0 đến 1023. Bây giờ trong trường hợp của STM32F103C8, chúng ta có 10 kênh, 12-Bit ADC với dải đầu vào 0V -3,3V. Nó sẽ ánh xạ điện áp đầu vào từ 0 đến 3,3 volt thành các giá trị nguyên từ 0 đến 4095.
ADC trong STM32
ADC được nhúng trong vi điều khiển STM32 sử dụng nguyên tắc SAR (thanh ghi xấp xỉ liên tiếp), theo đó việc chuyển đổi được thực hiện theo một số bước. Số bước chuyển đổi bằng số bit trong bộ chuyển đổi ADC. Mỗi bước được điều khiển bởi đồng hồ ADC. Mỗi đồng hồ ADC tạo ra một bit từ kết quả đến đầu ra. Thiết kế bên trong ADC dựa trên kỹ thuật chuyển mạch tụ điện. Nếu bạn chưa quen với STM32, hãy xem hướng dẫn Bắt đầu với STM32 của chúng tôi.
Độ phân giải 12 bit
ADC này là ADC 10 kênh 12-bit. Ở đây thuật ngữ kênh 10 ngụ ý rằng có 10 chân ADC sử dụng mà chúng ta có thể đo điện áp tương tự. Thuật ngữ 12-bit ngụ ý độ phân giải của ADC. 12-bit có nghĩa là 2 với lũy thừa của mười (212) là 4096. Đây là số bước mẫu cho ADC của chúng tôi, vì vậy phạm vi giá trị ADC của chúng tôi sẽ từ 0 đến 4095. Giá trị sẽ tăng từ 0 đến 4095 dựa trên giá trị của điện áp mỗi bước, có thể được tính bằng công thức
ĐIỆN ÁP / BƯỚC = ĐIỆN ÁP THAM KHẢO / 4096 = (3,3 / 4096 = 8,056mV) trên mỗi đơn vị.
Làm thế nào một tín hiệu tương tự được chuyển đổi thành định dạng kỹ thuật số
Vì máy tính chỉ lưu trữ và xử lý các giá trị nhị phân / kỹ thuật số (1 và 0). Vì vậy, các tín hiệu tương tự như đầu ra của cảm biến tính bằng vôn phải được chuyển đổi thành giá trị kỹ thuật số để xử lý và việc chuyển đổi cần phải chính xác. . Giá trị Analog được lưu trữ đó (0-3,3V) được chuyển đổi thành giá trị số nguyên (0-4096) bằng công thức dưới đây:
INPUT VOLTAGE = (Giá trị ADC / Độ phân giải ADC) * Điện áp tham chiếu
Độ phân giải = 4096
Tham chiếu = 3,3V
Thành phần bắt buộc
STM32F103C8
LCD 16 * 2
Chiết áp 100k
Breadboard
Kết nối dây
Sơ đồ mạch và giải thích
Sơ đồ mạch để giao diện 16 * 2 LCD và Ngõ vào Analog vào bảng STM32F103C8T6 được hiển thị bên dưới.
The connections which are done for LCD are given below:
LCD Pin No | LCD Pin Name | STM32 Pin Name |
1 | Ground (Gnd) | Ground (G) |
2 | VCC | 5V |
3 | VEE | Pin from Centre of Potentiometer |
4 | Register Select (RS) | PB11 |
5 | Read/Write (RW) | Ground (G) |
6 | Enable (EN) | PB10 |
7 | Data Bit 0 (DB0) | No Connection (NC) |
8 | Data Bit 1 (DB1) | No Connection (NC) |
9 | Data Bit 2 (DB2) | No Connection (NC) |
10 | Data Bit 3 (DB3) | No Connection (NC) |
11 | Data Bit 4 (DB4) | PB0 |
12 | Data Bit 5 (DB5) | PB1 |
13 | Data Bit 6 (DB6) | PC13 |
14 | Data Bit 7 (DB7) | PC14 |
15 | LED Positive | 5V |
16 | LED Negative | Ground (G) |
Các kết nối được thực hiện theo bảng trên. Có hai chiết áp hiện diện trong mạch, một đầu tiên được sử dụng cho bộ chia điện áp có thể được sử dụng để thay đổi điện áp và cung cấp đầu vào tương tự cho STM32. Chân trái của chiết áp này nhận điện áp dương đầu vào từ STM32 (3.3V) và chân phải được nối với đất, chân giữa của chiết áp được kết nối với chân đầu vào tương tự (PA7) của STM32. Chiết áp còn lại được sử dụng để thay đổi độ tương phản của màn hình LCD. Nguồn điện cho STM32 được cung cấp bằng nguồn điện USB từ PC hoặc Máy tính xách tay.
#include <LiquidCrystal.h> // include the LCD library
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD
const int analogip = PA7;//Initialize the analog input pin
void setup()
{
lcd.begin(16, 2); //We are using a 16*2 LCD
lcd.clear(); //Clear the screen
lcd.setCursor(0, 0); //At first row first column
lcd.print("CIRCUITDIGEST"); //Print this
lcd.setCursor(0, 1); //At secound row first column
lcd.print("STM32F103C8"); //Print this
delay(2000); //wait for two secounds
lcd.clear(); //Clear the screen
lcd.setCursor(0, 0); //At first row first column
lcd.print("USING ADC IN");//Print this
lcd.setCursor(0,1); //At secound row first column
lcd.print("STM32F103C8");//Print this
delay(2000); //wait for two secounds
lcd.clear(); //Clear the screen
}
void loop()
{
int val = analogRead(PA7); // read the ADC value from pin A7
float voltage = (float(val)/4096) * 3.3; //formulae to convert the ADC value to voltage
lcd.setCursor(0, 0); // set the cursor to column 0, line 0
lcd.print("ADC Val:");
lcd.print(val); //Display ADC value
lcd.setCursor(0, 1); // set the cursor to column 0, line 1
lcd.print("Voltage:");
lcd.print(voltage); //Display voltage
}