- So sánh ADC trong Arduino và STM32F103C8
- ADC trong STM32
- 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ố
- Chân ADC trong STM32F103C8T6
- Thành phần bắt buộc
- Sơ đồ mạch và giải thích
- Lập trình STM32 để đọc các giá trị ADC
Một tính năng phổ biến được sử dụng trong hầu hết các ứ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 (2 12) 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 theo công thức
VOLTAGE / STEP = Đ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, 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. Khi điện áp tương tự đầu vào được cấp cho STM32 tại đầu vào tương tự của nó, giá trị tương tự được đọc và lưu trữ trong một biến số nguyên. 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
Chân ADC trong STM32F103C8T6
Có 10 chân tương tự trong STM32 từ PA0 đến PB1.
Ngoài ra, hãy kiểm tra cách sử dụng ADC trong các Bộ vi điều khiển khác:
- Làm thế nào để sử dụng ADC trong Arduino Uno?
- Giao tiếp ADC0808 với Vi điều khiển 8051
- Sử dụng Mô-đun ADC của Vi điều khiển PIC
- Hướng dẫn sử dụng Raspberry Pi ADC
- Cách sử dụng ADC trong MSP430G2 - Đo điện áp tương tự
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.
Các kết nối được thực hiện cho LCD được đưa ra dưới đây:
Pin LCD Không |
Tên pin LCD |
Tên pin STM32 |
1 |
Mặt đất (Gnd) |
Mặt đất (G) |
2 |
VCC |
5V |
3 |
VEE |
Ghim từ Trung tâm của Potentiometer |
4 |
Đăng ký Chọn (RS) |
PB11 |
5 |
Đọc / Ghi (RW) |
Mặt đất (G) |
6 |
Bật (EN) |
PB10 |
7 |
Bit dữ liệu 0 (DB0) |
Không có kết nối (NC) |
số 8 |
Bit dữ liệu 1 (DB1) |
Không có kết nối (NC) |
9 |
Bit dữ liệu 2 (DB2) |
Không có kết nối (NC) |
10 |
Bit dữ liệu 3 (DB3) |
Không có kết nối (NC) |
11 |
Bit dữ liệu 4 (DB4) |
PB0 |
12 |
Bit dữ liệu 5 (DB5) |
PB1 |
13 |
Bit dữ liệu 6 (DB6) |
PC13 |
14 |
Bit dữ liệu 7 (DB7) |
PC14 |
15 |
LED tích cực |
5V |
16 |
LED âm bản |
Mặt đất (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.
Lập trình STM32 để đọc các giá trị ADC
Trong hướng dẫn trước của chúng tôi, chúng tôi đã tìm hiểu về Lập trình Bo mạch STM32F103C8T6 sử dụng Cổng USB. Vì vậy, chúng tôi không cần một lập trình viên FTDI bây giờ. Chỉ cần kết nối nó với PC qua cổng USB của STM32 và bắt đầu lập trình với ARDUINO IDE. Lập trình STM32 của bạn trong ARDUINO IDE để đọc điện áp tương tự rất đơn giản. Nó giống như board arduino. Không cần thay đổi chân jumper của STM32.
Trong chương trình này sẽ đọc giá trị tương tự và tính toán điện áp với giá trị đó, sau đó hiển thị cả hai giá trị tương tự và kỹ thuật số trên màn hình LCD.
Đầu tiên xác định các chân LCD. Chúng xác định chân LCD được kết nối với chân nào của STM32. Bạn có thể sửa đổi theo yêu cầu của bạn.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // đề cập đến các tên pin với LCD được kết nối với
Tiếp theo, chúng tôi bao gồm tệp tiêu đề cho màn hình LCD. Điều này gọi thư viện chứa mã về cách STM32 giao tiếp với màn hình LCD. Ngoài ra, hãy đảm bảo rằng chức năng Liquid Crystal được gọi bằng các tên pin mà chúng ta vừa xác định ở trên.
#include
Bên trong hàm setup () , chúng tôi chỉ đưa ra một thông báo giới thiệu được hiển thị trên màn hình LCD. Bạn có thể tìm hiểu về giao diện LCD với STM32.
lcd.begin (16, 2); // Chúng tôi đang sử dụng màn hình LCD 16 * 2 lcd.clear (); // Xóa màn hình lcd.setCursor (0, 0); // Tại dòng đầu tiên, cột đầu tiên lcd.prin t ("MẠCH LỚP"); // In this lcd.setCursor (0, 1); // Tại hàng thứ nhất cột đầu tiên n lcd.print ("STM32F103C8"); // In thi s delay (2000); // đợi hai giây lcd.clear (); // Xóa màn hình lcd.setCursor (0, 0); // Tại hàng đầu tiên, cột đầu tiên lcd.print ("SỬ DỤNG ADC IN"); // In this lcd.setCursor (0,1); // Tại cột đầu tiên hàng thứ nhất lcd.print ("STM32F103C8"); // In trễ này (2000); // đợi hai giây lcd.clear (); // Xóa màn hình
Cuối cùng, bên trong hàm loop () vô hạn của chúng tôi, chúng tôi bắt đầu đọc điện áp tương tự được cung cấp cho chân PA7 từ chiết áp. Như chúng ta đã thảo luận, bộ vi điều khiển là một thiết bị kỹ thuật số và nó không thể đọc mức điện áp trực tiếp. Sử dụng kỹ thuật SAR, mức điện áp được ánh xạ từ 0 đến 4096. Các giá trị này được gọi là giá trị ADC, để có được giá trị ADC này, chỉ cần sử dụng dòng sau
int val = analogRead (A7); // đọc giá trị ADC từ chân PA 7
Ở đây hàm analogRead () được sử dụng để đọc giá trị tương tự của chân. Cuối cùng, chúng tôi lưu giá trị này trong một biến gọi là " val ". Kiểu của biến này là số nguyên vì chúng ta sẽ chỉ nhận các giá trị từ 0 đến 4096 được lưu trong biến này.
Bước tiếp theo sẽ là tính toán giá trị điện áp từ giá trị ADC. Để làm điều này, chúng tôi có các công thức sau
Điện áp = (Giá trị ADC / Độ phân giải ADC) * Thẻ tham chiếu e
Trong trường hợp của chúng tôi, chúng tôi đã biết rằng độ phân giải ADC của bộ vi điều khiển của chúng tôi là 4096. Giá trị ADC cũng được tìm thấy trong dòng trước đó và được lưu trữ biến có tên là val. Các điện áp tham chiếu tương đương với điện áp mà tại đó các vi điều khiển đang hoạt động. Khi bo mạch STM32 được cấp nguồn qua cáp USB thì điện áp hoạt động là 3,3V. Bạn cũng có thể đo điện áp hoạt động bằng cách sử dụng đồng hồ vạn năng trên Vcc và chân nối đất trên bảng. Vì vậy, công thức trên phù hợp với trường hợp của chúng tôi như được hiển thị bên dưới
điện áp float = (float (val) / 4096) * 3.3; // công thức chuyển đổi giá trị ADC thành voltag e
Bạn có thể nhầm lẫn với dòng float (val). Điều này được sử dụng để chuyển đổi biến "val" từ kiểu dữ liệu int thành kiểu dữ liệu "float". Việc chuyển đổi này là cần thiết vì chỉ khi chúng ta nhận được kết quả là val / 4096 trong float, chúng ta có thể nhân nó với 3,3. Nếu giá trị nhận được ở dạng số nguyên, nó sẽ luôn là 0 và kết quả cũng sẽ là 0. Khi chúng tôi đã tính toán giá trị ADC và điện áp, tất cả những gì còn lại là hiển thị kết quả trên màn hình LCD. Điều này có thể được thực hiện bằng cách sử dụng các dòng sau
lcd.setCursor (0, 0); // đặt con trỏ vào cột 0, dòng 0 lcd.print ("ADC Val:"); lcd.print (val); // Hiển thị giá trị ADC lcd.setCursor (0, 1); // đặt con trỏ ở cột 0, dòng 1 lcd.print ("Voltage:"); lcd.print (điện áp); // Hiển thị điện áp
Mã hoàn chỉnh và Video trình diễn được cung cấp bên dưới.