- ADC là gì?
- ADC trong ARM7-LPC2148
- Chân ADC trong ARM7-LPC2148
- Đăng ký ADC trong ARM7-LPC2148
- Đăng ký ADxCR trong LPC2148
- ADxGDR: Đăng ký dữ liệu toàn cầu ADC
- Thành phần bắt buộc
- Sơ đồ mạch
- Lập trình ARM7-LPC2148 cho ADC
Trong thế giới điện tử có rất nhiều loại cảm biến tương tự trên thị trường được sử dụng để đo nhiệt độ, tốc độ, dịch chuyển, áp suất, vv Cảm biến tương tự được sử dụng để tạo ra đầu ra liên tục thay đổi theo thời gian. Các tín hiệu này từ các cảm biến tương tự có xu hướng có giá trị rất nhỏ từ vài micro-volt (uV) đến vài mili-volt (mV), vì vậy cần phải có một số hình thức khuếch đại. Để sử dụng các tín hiệu tương tự này trong vi điều khiển, chúng ta cần chuyển đổi tín hiệu tương tự thành tín hiệu số vì vi điều khiển chỉ hiểu và xử lý các tín hiệu số. Vì vậy, hầu hết các vi điều khiển có một tính năng quan trọng sẵn có được gọi là ADC (Bộ chuyển đổi tương tự sang kỹ thuật số). Bộ vi điều khiển ARM7-LPC2148 của chúng tôi cũng có tính năng ADC.
Trong hướng dẫn này, chúng ta sẽ xem cách sử dụng ADC trong ARM7-LPC2148 bằng cách cung cấp điện áp thay đổi cho chân Analog và hiển thị nó trên màn hình LCD 16x2 sau khi chuyển đổi tương tự sang kỹ thuật số. Vì vậy, hãy bắt đầu bằng phần giới thiệu ngắn về ADC.
ADC là gì?
Như đã nói ở trên, ADC là viết tắt của từ Analog sang kỹ thuật số chuyển đổi và nó được sử dụng để chuyển đổi các giá trị tương tự từ thế giới thực thành các giá trị kỹ thuật số như 1 và 0. Vậy những giá trị tương tự này là gì? Đây là những thông số mà chúng ta thấy trong cuộc sống hàng ngày như nhiệt độ, tốc độ, độ sáng, v.v. Những thông số này được đo dưới dạng điện áp tương tự bởi các cảm biến tương ứng và sau đó những giá trị tương tự này được chuyển đổi thành giá trị kỹ thuật số cho vi điều khiển.
Giả sử rằng dải ADC của chúng ta là từ 0V đến 3,3V và chúng ta có bộ ADC 10-bit, điều này có nghĩa là điện áp đầu vào 0-3,3 Volts của chúng ta sẽ được chia thành 1024 mức giá trị tương tự rời rạc (2 10 = 1024). Có nghĩa là 1024 là độ phân giải cho ADC 10 bit, tương tự đối với ADC 8 bit độ phân giải sẽ là 512 (28) và độ phân giải ADC 16 bit sẽ là 65,536 (216). LPC2148 có ADC độ phân giải 10 bit.
Với điều này nếu điện áp đầu vào thực tế là 0V thì ADC của MCU sẽ đọc nó là 0 và nếu nó là 3,3V, MCU sẽ đọc 1024 và nếu nó ở đâu đó giữa như 1,65v thì MCU sẽ đọc 512. Chúng ta có thể sử dụng bên dưới công thức để tính toán giá trị kỹ thuật số sẽ được MCU đọc dựa trên độ phân giải của ADC và điện áp hoạt động.
(Độ phân giải ADC / Điện áp hoạt động) = (Giá trị số ADC / Giá trị điện áp thực tế)
Ví dụ như nếu điện áp tham chiếu là 3v:
Chúng tôi đã giải thích chi tiết về ADC trong bài viết trước.
ADC trong ARM7-LPC2148
- LPC2148 chứa hai bộ chuyển đổi tương tự sang kỹ thuật số.
- Các bộ chuyển đổi này là bộ chuyển đổi tương tự xấp xỉ 10 bit liên tiếp đơn lẻ sang bộ chuyển đổi kỹ thuật số.
- Trong khi ADC0 có sáu kênh, ADC1 có tám kênh.
- Do đó, tổng số đầu vào ADC có sẵn cho LPC2148 là 14.
- Nó chỉ chuyển đổi điện áp đầu vào trong phạm vi (0 đến 3,3V). Nó không được vượt quá 3,3V tham chiếu điện áp. Vì nó sẽ làm hỏng vi mạch và cũng cung cấp các giá trị không chắc chắn.
Một số tính năng quan trọng của ADC trong LPC2148
- Mỗi bộ chuyển đổi có khả năng thực hiện hơn 400000 mẫu 10 bit mỗi giây.
- Mỗi đầu vào tương tự có một thanh ghi kết quả chuyên dụng để giảm chi phí ngắt.
- Chế độ chuyển đổi liên tục cho một hoặc nhiều đầu vào.
- Tùy chọn chuyển đổi khi chuyển đổi trên chân đầu vào hoặc tín hiệu khớp hẹn giờ.
- Lệnh Global Start cho cả hai bộ chuyển đổi.
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ự
- Cách sử dụng ADC trong STM32F103C8
Chân ADC trong ARM7-LPC2148
Như đã nói với earliar, trong ARM7-LPC2148 có hai kênh ADC0 với 6 chân đầu vào tương tự & ADC1 với 8 chân đầu vào tương tự. Vì vậy, hoàn toàn có 14 chân cho đầu vào tương tự. Sơ đồ dưới đây cho thấy các chân có sẵn cho đầu vào tương tự.
Vì các chân đầu vào ADC được ghép với các chân GPIO khác. Chúng ta cần kích hoạt chúng bằng cách cấu hình thanh ghi PINSEL để chọn chức năng ADC.
Bảng dưới đây cho thấy các chân của ADC và số kênh ADC được tôn trọng trong LPC2148. AD0 là kênh 0 và AD1 là kênh 1
Pin LPC2148 |
Kênh ADC Không |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0,25 |
AD0.4 |
P0.4 |
AD0,6 |
P0.5 |
AD0,7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1,5 |
P0.21 |
AD1,6 |
P0.22 |
AD1,7 |
Đăng ký ADC trong ARM7-LPC2148
Thanh ghi được sử dụng trong lập trình để sử dụng tính năng chuyển đổi A / D trong LPC2148.
Dưới đây là danh sách các thanh ghi được sử dụng trong LPC2148 để chuyển đổi A / D
1. ADCR: Thanh ghi điều khiển tương tự sang số
Sử dụng: Thanh ghi này được sử dụng để định cấu hình bộ chuyển đổi A / D trong LPC2148
2. ADGDR: Tương tự với Đăng ký Dữ liệu Toàn cầu Kỹ thuật số
Sử dụng: Thanh ghi này có bit DONE cho bộ chuyển đổi A / D và KẾT QUẢ của việc chuyển đổi được lưu trữ tại đây.
3. ADINTERN: Đăng ký cho phép ngắt tương tự sang số
Sử dụng: Đây là một thanh ghi Cho phép ngắt.
4. ADDR0 - ADDR7: Đăng ký dữ liệu kênh tương tự sang kênh kỹ thuật số
Sử dụng: Thanh ghi này chứa giá trị A / D cho các kênh tương ứng.
5. ADSTAT: Thanh ghi trạng thái tương tự sang số.
Sử dụng: Thanh ghi này chứa cờ DONE cho kênh ADC tương ứng và cờ OVERRUN cho kênh ADC tương ứng.
Trong hướng dẫn này, chúng tôi sẽ chỉ sử dụng các thanh ghi ADCR & ADGDR. Hãy xem chi tiết về chúng
Đăng ký ADxCR trong LPC2148
AD0CR & AD1CR cho kênh 0 và kênh 1 tương ứng. Đó là một thanh ghi 32-Bit. Bảng dưới đây chỉ ra các trường bit cho thanh ghi ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
KÍN ĐÁO |
CẠNH |
KHỞI ĐẦU |
KÍN ĐÁO |
PDN |
KÍN ĐÁO |
CLKS |
NỔ |
CLCKDIV |
SEL |
Hãy xem về cách cấu hình các thanh ghi riêng lẻ
1. SEL: Các bit từ (0 đến 7) được sử dụng để chọn kênh chuyển đổi ADC. Một bit được phân bổ cho mỗi kênh. Ví dụ, thiết lập Bit-0 sẽ làm cho ADC lấy mẫu AD0.1 để chuyển đổi. Và thiết lập bit -1 sẽ làm cho AD0.1; tương tự thiết lập bit-7 sẽ thực hiện chuyển đổi cho AD0.7. Bước quan trọng là chúng ta có PINSEL theo cổng mà chúng ta đang sử dụng, ví dụ PINSEL0 cho PORT0 trong PLC2148.
2. CLCKDIV: Các bit từ (8 đến 15) dành cho Clock Divisor. Ở đây đồng hồ APB (đồng hồ Bus ngoại vi ARM) được chia cho giá trị này cộng với một để tạo ra đồng hồ cần thiết cho bộ chuyển đổi A / D, phải nhỏ hơn hoặc bằng 4,5 MHz vì chúng tôi đang sử dụng phương pháp xấp xỉ liên tiếp trong LPC2148.
3. BURST: Bit 16 được sử dụng cho chế độ chuyển đổi BURST.
Cài đặt 1: ADC sẽ thực hiện chuyển đổi cho tất cả các kênh được chọn trong các bit SEL.
Cài đặt 0: Sẽ tắt chế độ chuyển đổi BURST.
4. CLCKS: Các bit từ (17 đến 19) ba bit được sử dụng để chọn độ phân giải và số lượng xung nhịp để chuyển đổi A / D ở chế độ liên tục vì đây là chế độ chuyển đổi A / D liên tục.
Giá trị cho các bit (17 đến 19) |
Bit (Độ chính xác) |
Không có đồng hồ |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
số 8 |
9 |
011 |
7 |
số 8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: Bit 21 dùng để chọn Chế độ ngắt nguồn của ADC trong LPC2148.
- A / D đang ở chế độ PDN.
- A / D đang ở chế độ hoạt động
6. START: Các bit từ (24 đến 26) dành cho START. Khi chế độ chuyển đổi BURST TẮT bằng cách cài đặt 0, các bit START này hữu ích cho thời điểm bắt đầu chuyển đổi A / D. START cũng được sử dụng để chuyển đổi điều khiển cạnh. Đó là khi có một đầu vào trong chân CAP hoặc MAT của LPC2148, A / D bắt đầu chuyển đổi. Hãy kiểm tra bảng dưới đây
Giá trị cho bit (24 đến 26) |
Pin của LPC2148 |
Chức năng của ADC |
000 |
Được sử dụng để đặt ADC ở chế độ PDN Không bắt đầu |
|
001 |
Bắt đầu chuyển đổi A / D |
|
010 |
CAP0.2 / MAT0.2 |
Bắt đầu chuyển đổi A / D trên EDGE được chọn trên chân 27 (Tăng hoặc Giảm) trên các chân CAP / MAT của LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: Bit thứ 27 dành cho EDGE chỉ được sử dụng khi bit START chứa 010-111. Nó bắt đầu chuyển đổi khi có đầu vào CAP hoặc MAT, bạn có thể xem bảng trên để biết điều đó.
Cài đặt : 0 - Trên cạnh rơi
1 - Trên cạnh tăng
ADxGDR: Đăng ký dữ liệu toàn cầu ADC
AD0GDR & AD1GDR cho ADC Kênh 0 và ADC kênh 1 tương ứng.
Đó là một thanh ghi 32 bit chứa KẾT QUẢ của chuyển đổi A / D và cũng là bit XONG cho biết rằng chuyển đổi A / D đã được thực hiện. Bảng dưới đây chỉ ra các trường bit cho thanh ghi ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
LÀM XONG |
OVERRUN |
KÍN ĐÁO |
CHN |
KÍN ĐÁO |
KẾT QUẢ |
KÍN ĐÁO |
1. KẾT QUẢ: Các bit này (6 đến 15) chứa kết quả của chuyển đổi A / D cho kênh đã chọn trong thanh ghi ADCR SEL. Giá trị chỉ được đọc sau khi quá trình chuyển đổi A / D hoàn tất và điều này được biểu thị bằng bit DONE.
VÍ DỤ: Đối với kết quả ADC 10 Bit, giá trị được lưu trữ thay đổi từ (0 đến 1023).
2. KÊNH: Các bit 24 đến 26 này chứa số kênh mà quá trình chuyển đổi A / D được thực hiện. Giá trị kỹ thuật số được chuyển đổi có trong bit RESULT.
VÍ DỤ: 000 dành cho kênh ADC 0 và 001 dành cho kênh ADC 1, v.v.
3. OVERRUN: Bit thứ 30 cho OVERRUN được sử dụng ở chế độ BURST. Khi đặt 1, giá trị ADC được chuyển đổi trước đó sẽ bị ghi đè bởi giá trị ADC mới được chuyển đổi. Khi thanh ghi được đọc, nó sẽ xóa bit OVERRUN.
4. DONE: Bit thứ 31 dành cho bit DONE.
Bộ 1: Khi chuyển đổi A / D hoàn tất.
Đặt 0: Khi thanh ghi được đọc và ghi ADCR.
Chúng ta đã biết về các thanh ghi quan trọng được sử dụng trong ADC trong LPC2148. Bây giờ chúng ta hãy bắt đầu sử dụng ADC trong ARM7.
Thành phần bắt buộc
Phần cứng
- Vi điều khiển ARM7-LPC2148
- IC điều chỉnh điện áp 3.3V
- IC ổn áp 5V
- Chiết áp 10K - 2 Nos
- LED (Bất kỳ màu nào)
- Màn hình LCD (16X2)
- Pin 9V
- Breadboard
- Kết nối dây
Phần mềm
- Keil uVision5
- Công cụ Magic Flash
Sơ đồ mạch
Bảng dưới đây cho thấy các kết nối mạch giữa LCD & ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Đăng ký Chọn) |
P0.6 |
E (Bật) |
P0.12 |
D4 (Chân dữ liệu 4) |
P0.13 |
D5 (Chân dữ liệu 5) |
P0.14 |
D6 (Chân dữ liệu 6) |
P0.15 |
D7 (Chân dữ liệu 7) |
Tìm hiểu thêm về cách sử dụng màn hình LCD với ARM 7 - LPC2148.
QUAN TRỌNG: Ở đây chúng tôi đang sử dụng hai IC điều chỉnh điện áp, một cho màn hình LCD 5V và một IC khác 3,3V cho đầu vào analog có thể thay đổi bằng chiết áp.
Kết nối giữa Bộ điều chỉnh điện áp 5V với LCD & Thanh ARM7
IC điều chỉnh điện áp 5V |
Chức năng ghim |
LCD & ARM-7 LPC2148 |
1. pin bên trái |
+ Ve từ Pin đầu vào 9V |
NC |
2.Centre Pin |
- Ve từ pin |
VSS, R / W, K của LCD GND của ARM7 |
3. pin bên phải |
Đầu ra + 5V quy định |
VDD, A của LCD + 5V của ARM7 |
Chiết áp có LCD
Một chiết áp được sử dụng để thay đổi độ tương phản của màn hình LCD. Nồi có ba chân, chân trái (1) được kết nối với + 5V và trung tâm (2) với VEE hoặc V0 của mô-đun LCD và chân phải (3) được kết nối với GND. Chúng ta có thể điều chỉnh độ tương phản bằng cách xoay núm.
Kết nối giữa LPC2148 và chiết áp với bộ điều chỉnh điện áp 3.3V
IC điều chỉnh điện áp 3.3V |
Chức năng ghim |
ARM-7 LPC2148 |
1. pin bên trái |
- Ve từ pin |
GND pin |
2.Centre Pin |
Đầu ra + 3.3V quy định |
Để chiết áp Đầu vào và đầu ra của chiết áp tới P0.28 |
3. pin bên phải |
+ Ve từ Pin đầu vào 9V |
NC |
Lập trình ARM7-LPC2148 cho ADC
Để lập trình ARM7-LPC2148, chúng ta cần công cụ keil uVision & Flash Magic. Chúng tôi đang sử dụng Cáp USB để lập trình Thanh ARM7 qua cổng micro USB. Chúng tôi viết mã bằng Keil và tạo một tệp hex và sau đó tệp HEX được chuyển sang thanh ARM7 bằng Flash Magic. Để biết thêm về cách cài đặt keil uVision và Flash Magic cũng như cách sử dụng chúng, hãy truy cập liên kết Bắt đầu với Vi điều khiển ARM7 LPC2148 và Lập trình bằng Keil uVision.
Trong hướng dẫn này, chúng tôi chuyển đổi điện áp đầu vào tương tự (0 đến 3,3V) thành giá trị kỹ thuật số bằng cách sử dụng ADC trong LPC2148 và hiển thị điện áp tương tự trên màn hình LCD (16x2). Một chiết áp sẽ được sử dụng để thay đổi điện áp tương tự đầu vào.
Để biết thêm về giao diện LCD với chế độ ARM7-LPC2148 4-bit, hãy làm theo liên kết này.
Các mã hoàn chỉnh cho việc sử dụng ADC với ARM 7 được đưa ra ở cuối hướng dẫn này, ở đây chúng tôi được giải thích vài bộ phận của nó.
Các bước liên quan đến lập trình LPC2148-ADC
1. Thanh ghi PINSEL được sử dụng để chọn chân cổng của LPC2148 và chức năng ADC làm đầu vào tương tự.
PINSEL1 = 0x01000000; // Chọn P0.28 làm AD0.1
2. Chọn đồng hồ và độ chính xác của bit để chuyển đổi bằng cách ghi giá trị vào ADxCR (thanh ghi điều khiển ADC).
AD0CR = 0x00200402; // Đặt hoạt động ADC là 10-bit / 11 CLK để chuyển đổi (000)
3. Bắt đầu chuyển đổi bằng cách ghi giá trị vào bit START trong ADxCR.
Ở đây tôi đã ghi vào bit thứ 24 của thanh ghi AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Bây giờ chúng ta có kiểm tra các bit HOÀN CHỈNH (ngày 31) của ADxDRy tương ứng (dữ liệu ADC đăng ký) vì nó thay đổi từ 0 đến 1. Vì vậy, chúng tôi sử dụng trong khi vòng lặp để liên tục kiểm tra nếu chuyển đổi được thực hiện trên các bit ngày 31 dữ liệu đăng ký.
while (! (AD0DR1 & 0x80000000));
5. Sau khi bit thực hiện được đặt thành 1, quá trình chuyển đổi thành công, tiếp theo chúng ta đọc kết quả từ cùng một thanh ghi dữ liệu ADC AD0DR1 và lưu trữ giá trị trong một biến.
adcvalue = AD0DR1;
Tiếp theo, chúng tôi sử dụng một công thức để chuyển đổi giá trị kỹ thuật số thành điện áp và lưu trữ trong một biến điện áp có tên.
điện áp = ((adcvalue / 1023.0) * 3.3);
5. Các dòng sau được sử dụng để hiển thị các giá trị kỹ thuật số (0 đến 1023) sau khi chuyển đổi tương tự sang kỹ thuật số.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Hiển thị giá trị ADC (0 đến 1023)
6. Các dòng sau được sử dụng để hiển thị điện áp tương tự đầu vào (0 đến 3,3V) sau khi chuyển đổi tương tự sang kỹ thuật số và sau bước 5.
LCD_SEND (0xC0); sprintf (giá trị điện áp, "Điện áp =%. 2f V", điện áp); LCD_DISPLAY (giá trị vôn); // Hiển thị (điện áp tương tự đầu vào)
7. Bây giờ chúng ta phải hiển thị điện áp đầu vào và các giá trị kỹ thuật số trên màn hình LCD. Trước đó, chúng ta phải khởi tạo màn hình LCD và sử dụng các lệnh thích hợp để gửi tin nhắn hiển thị.
Mã dưới đây được sử dụng để khởi tạo màn hình LCD
void LCD_INITILIZE (void) // Hàm chuẩn bị sẵn sàng màn hình LCD { IO0DIR = 0x0000FFF0; // Đặt chân P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 làm OUTPUT delay_ms (20); LCD_SEND (0x02); // Khởi tạo lcd ở chế độ hoạt động 4 bit LCD_SEND (0x28); // 2 dòng (16X2) LCD_SEND (0x0C); // Hiển thị trên con trỏ tắt LCD_SEND (0x06); // Con trỏ tăng tự động LCD_SEND (0x01); // Hiển thị rõ ràng LCD_SEND (0x80); // Dòng đầu tiên vị trí đầu tiên }
Mã dưới đây được sử dụng để hiển thị các giá trị trên màn hình LCD
khoảng trống LCD_DISPLAY (char * msg) // Function để in các ký tự gửi từng người một { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Gửi phần trên IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH để in dữ liệu IO0CLR = 0x00000020; // RW LOW Chế độ ghi delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS và RW không đổi (tức là RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Gửi Lower nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
Hàm dưới được sử dụng để tạo độ trễ
void delay_ms (uint16_t j) // Hàm tạo độ trễ tính bằng mili giây { uint16_t x, i; cho (i = 0; i
Mã hoàn chỉnh với video minh họa được đưa ra bên dưới.