Đây là hướng dẫn thứ 9 của chúng tôi về Học vi điều khiển PIC sử dụng MPLAB và XC8. Cho đến bây giờ, chúng tôi đã bao gồm nhiều hướng dẫn cơ bản như bắt đầu với MPLABX, đèn LED nhấp nháy với PIC, Bộ hẹn giờ trong PIC, màn hình LCD giao diện, giao diện 7 đoạn, v.v. Nếu bạn là người mới bắt đầu, hãy truy cập danh sách đầy đủ các hướng dẫn PIC tại đây và bắt đầu học.
Trong hướng dẫn này, chúng ta sẽ học Cách sử dụng ADC với bộ vi điều khiển PIC PICF877A của chúng tôi. Hầu hết các dự án Vi điều khiển sẽ liên quan đến bộ chuyển đổi ADC (Analog to Digital) trong đó, bởi vì nó là một trong những cách được sử dụng nhiều nhất để đọc dữ liệu từ thế giới thực. Hầu như tất cả các cảm biến như cảm biến nhiệt độ, cảm biến từ thông, cảm biến áp suất, cảm biến dòng điện, cảm biến điện áp, con quay hồi chuyển, gia tốc kế, cảm biến khoảng cách và hầu hết mọi cảm biến hoặc bộ chuyển đổi đã biết đều tạo ra điện áp tương tự từ 0V đến 5V dựa trên số đọc của cảm biến. Ví dụ, một cảm biến nhiệt độ có thể cho ra 2,1V khi nhiệt độ là 25C và lên đến 4,7 khi nhiệt độ là 60C. Để biết nhiệt độ của thế giới thực, MCU chỉ cần đọc điện áp đầu ra của cảm biến nhiệt độ này và liên hệ nó với nhiệt độ trong thế giới thực. Do đó ADC là một công cụ làm việc quan trọng cho các dự án MCU và chúng ta hãy tìm hiểu cách chúng ta có thể sử dụng nó trên PIC16F877A của mình.
Ngoài ra, hãy xem các bài viết trước của chúng tôi về 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?
- Hướng dẫn sử dụng Raspberry Pi ADC
- Giao tiếp ADC0808 với Vi điều khiển 8051
ADC trong Vi điều khiển PIC PIC16F877A:
Có nhiều loại ADC có sẵn và mỗi loại có tốc độ và độ phân giải riêng. Các loại ADC phổ biến nhất là flash, xấp xỉ liên tiếp và sigma-delta. Các loại ADC được sử dụng trong PIC16F877A được gọi là ADC xấp xỉ liên tiếp hoặc SAR trong ngắn hạn. Vì vậy, chúng ta hãy tìm hiểu một chút về SAR ADC trước khi bắt đầu sử dụng nó.
ADC xấp xỉ kế tiếp: SAR ADC hoạt động với sự trợ giúp của bộ so sánh và một số hội thoại logic. Loại ADC này sử dụng điện áp tham chiếu (có thể thay đổi) và so sánh điện áp đầu vào với điện áp tham chiếu bằng bộ so sánh và chênh lệch, sẽ là đầu ra kỹ thuật số, được lưu từ bit quan trọng nhất (MSB). Tốc độ của phép so sánh phụ thuộc vào tần số Đồng hồ (Fosc) mà PIC đang hoạt động.
Bây giờ chúng ta đã biết một số điều cơ bản về ADC, hãy mở biểu dữ liệu của chúng tôi và tìm hiểu cách sử dụng ADC trên MCU PIC16F877A của chúng tôi. PIC chúng tôi đang sử dụng có ADC 10-bit 8 kênh. Điều này có nghĩa là giá trị đầu ra của ADC của chúng tôi sẽ là 0-1024 (2 ^ 10) và có 8 chân (kênh) trên MCU của chúng tôi có thể đọc điện áp tương tự. Giá trị 1024 nhận được bằng 2 ^ 10 vì ADC của chúng ta là 10 bit. Tám chân có thể đọc điện áp tương tự được đề cập trong biểu dữ liệu. Chúng ta hãy nhìn vào hình ảnh dưới đây.
Các kênh tương tự AN0 đến AN7 được đánh dấu cho bạn. Chỉ các chân này mới có thể đọc điện áp tương tự. Vì vậy, trước khi đọc điện áp đầu vào, chúng ta phải chỉ định trong mã của mình kênh nào phải được sử dụng để đọc điện áp đầu vào. Trong hướng dẫn này, chúng tôi sẽ sử dụng kênh 4 với một chiết áp để đọc điện áp tương tự tại kênh này.
Mô-đun A / D có bốn thanh ghi phải được cấu hình để đọc dữ liệu từ các chân Đầu vào. Các thanh ghi này là:
• Đăng ký A / D Kết quả Cao (ADRESH)
• Đăng ký kết quả thấp A / D (ADRESL)
• Thanh ghi điều khiển A / D 0 (ADCON0)
• Thanh ghi điều khiển A / D 1 (ADCON1)
Lập trình cho ADC:
Các chương trình cho việc sử dụng ADC với PIC Vi điều khiển rất đơn giản, chúng ta chỉ cần phải hiểu bốn thanh ghi và sau đó đọc bất kỳ điện áp analog sẽ được đơn giản. Như thường lệ, hãy khởi tạo các bit cấu hình và bắt đầu với void main ().
Bên trong void main (), chúng ta phải khởi tạo ADC của mình bằng cách sử dụng thanh ghi ADCON1 và thanh ghi ADCON0. Thanh ghi ADCON0 có các bit sau:
Trong thanh ghi này, chúng ta phải bật mô-đun ADC bằng cách đặt ADON = 1 và bật Đồng hồ chuyển đổi A / D bằng cách sử dụng các bit ADCS1 và bit ADCS0, phần còn lại sẽ không được thiết lập ngay bây giờ. Trong chương trình của chúng tôi, đồng hồ chuyển đổi A / D được chọn là Fosc / 16, bạn có thể thử các tần số của riêng mình và xem kết quả thay đổi như thế nào. Toàn bộ thông tin chi tiết có trên trang 127. Do đó ADCON0 sẽ được khởi tạo như sau.
ADCON0 = 0b01000001;
Bây giờ thanh ghi ADCON1 có các bit sau:
Trong thanh ghi này, chúng ta phải thực hiện Định dạng kết quả A / D Chọn bit cao bằng ADFM = 1 và đặt ADCS2 = 1 để chọn lại Fosc / 16. Các bit khác vẫn bằng 0 vì chúng tôi đã lên kế hoạch sử dụng điện áp tham chiếu bên trong. Toàn bộ chi tiết có trên biểu dữ liệu trang 128. Do đó ADCON1 sẽ được chúng tôi thiết lập như sau.
ADCON1 = 0x11000000;
Bây giờ sau khi khởi tạo mô-đun ADC bên trong chức năng chính của chúng ta, hãy vào vòng lặp while và bắt đầu đọc các giá trị ADC. Để đọc giá trị ADC, bạn phải tuân theo các bước sau.
- Khởi tạo mô-đun ADC
- Chọn kênh analog
- Bắt đầu ADC bằng cách tăng bit Go / Done
- Chờ bit Go / DONE xuống thấp
- Nhận kết quả ADC từ thanh ghi ADRESH và ADRESL
1. Khởi tạo Mô-đun ADC: Chúng ta đã học cách khởi tạo ADC nên chúng ta chỉ cần gọi hàm dưới đây để khởi tạo ADC
Hàm void ADC_Initialize () như sau.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON và Fosc / 16 được chọn ADCON1 = 0b11000000; // Điện áp tham chiếu bên trong được chọn}
2. Chọn kênh analog: Bây giờ chúng ta phải chọn kênh mà chúng ta sẽ sử dụng để đọc giá trị ADC. Hãy tạo một hàm cho điều này, để chúng ta dễ dàng chuyển đổi giữa mỗi kênh bên trong vòng lặp while.
unsigned int ADC_Read (unsigned char channel) {// **** Chọn kênh ** /// ADCON0 & = 0x11000101; // Xóa các bit lựa chọn kênh ADCON0 - = channel << 3; // Đặt các Bit bắt buộc // ** Hoàn tất chọn kênh *** ///}
Sau đó, kênh được chọn sẽ được nhận bên trong kênh biến đổi. Trong dòng
ADCON0 & = 0x1100101;
Lựa chọn kênh trước đó (nếu có) sẽ bị xóa. Điều này được thực hiện bằng cách sử dụng bitwise và toán tử “&”. Các bit 3, 4 và 5 buộc phải bằng 0 trong khi các bit khác được để ở giá trị trước đó của chúng.
Sau đó, kênh mong muốn được chọn bằng cách chuyển sang trái ba lần số kênh và đặt các bit bằng cách sử dụng bitwise hoặc toán tử “-”.
ADCON0 - = kênh << 3; // Đặt các bit bắt buộc
3. Bắt đầu ADC bằng cách đặt bit Go / Done lên cao: Khi kênh được chọn, chúng ta phải bắt đầu chuyển đổi ADC đơn giản bằng cách đặt bit GO_nDONE lên cao:
GO_nDONE = 1; // Khởi tạo chuyển đổi A / D
4. Chờ bit Go / DONE xuống thấp: Bit GO / DONE sẽ ở mức cao cho đến khi quá trình chuyển đổi ADC hoàn tất, do đó chúng ta phải đợi cho đến khi bit này xuống thấp một lần nữa. Điều này có thể được thực hiện bằng cách sử dụng một trong khi vòng lặp.
trong khi (GO_nDONE); // Chờ chuyển đổi A / D hoàn tất
5. Lấy kết quả ADC từ thanh ghi ADRESH và ADRESL: Khi bit Go / DONE xuống thấp trở lại có nghĩa là quá trình chuyển đổi ADC đã hoàn tất. Kết quả của ADC sẽ là giá trị 10 bit. Vì MCU của chúng tôi là MCU 8 bit nên kết quả được chia thành 8 bit trên và 2 bit dưới. Kết quả 8 bit trên được lưu trong thanh ghi ADRESH và 2 bit dưới được lưu trong thanh ghi ADRESL. Do đó, chúng tôi phải thêm chúng vào các thanh ghi để nhận được giá trị ADC 10-bit của chúng tôi. Kết quả này được trả về bởi hàm như hình dưới đây:
return ((ADRESH << 8) + ADRESL); // Trả về kết quả
Chức năng hoàn chỉnh được sử dụng để chọn kênh ADC, kích hoạt ADC và trả về kết quả được hiển thị ở đây.
unsigned int ADC_Read (kênh char không dấu) {ADCON0 & = 0x11000101; // Xóa các bit lựa chọn kênh ADCON0 - = channel << 3; // Thiết lập Bits bắt buộc __delay_ms (2); // Thời gian thu nạp để giữ tụ điện GO_nDONE = 1; // Khởi tạo chuyển đổi A / D while (GO_nDONE); // Chờ A / D Conversion hoàn tất return ((ADRESH << 8) + ADRESL); // Trả về kết quả}
Bây giờ chúng ta có một hàm sẽ lấy lựa chọn kênh làm đầu vào và trả về cho chúng ta giá trị ADC. Do đó, chúng ta có thể gọi trực tiếp hàm này bên trong vòng lặp while của chúng ta, vì chúng ta đang đọc điện áp tương tự từ kênh 4 trong hướng dẫn này, lệnh gọi hàm sẽ như sau.
i = (ADC_Read (4)); // lưu trữ kết quả của adc trong “i”.
Để hình dung kết quả đầu ra của ADC, chúng ta sẽ cần một số loại mô-đun hiển thị như LCD hoặc 7-segment. Trong hướng dẫn này, chúng tôi sử dụng màn hình 7 đoạn để xác minh kết quả đầu ra. Nếu bạn muốn biết cách sử dụng 7-segment với pic hãy làm theo hướng dẫn tại đây.
Các mã hoàn chỉnh được đưa ra dưới đây và quá trình này cũng được giải thích trong video ở cuối.
Thiết lập và kiểm tra phần cứng:
Như thường lệ mô phỏng mã bằng Proteus trước khi thực sự sử dụng phần cứng của chúng tôi, các sơ đồ của dự án được hiển thị bên dưới:
Các kết nối của mô-đun hiển thị 4 chữ số bảy đoạn với vi điều khiển PIC cũng giống như dự án trước, chúng tôi chỉ thêm một chiết áp vào chân 7 là kênh tương tự 4. Bằng cách thay đổi nồi, một điện áp thay đổi sẽ được gửi đến MCU sẽ được đọc bởi mô-đun ADC và hiển thị trên Mô-đun hiển thị 7 đoạn. Xem hướng dẫn trước để tìm hiểu thêm về màn hình 7 đoạn 4 chữ số và giao diện của nó với MCU PIC.
Ở đây chúng tôi đã sử dụng cùng một bảng Vi điều khiển PIC mà chúng tôi đã tạo trong Hướng dẫn nhấp nháy đèn LED. Sau khi đảm bảo kết nối, hãy tải chương trình lên PIC và bạn sẽ thấy một đầu ra như thế này
Ở đây chúng tôi đã đọc giá trị ADC từ nồi và chuyển đổi nó thành điện áp thực tế bằng cách ánh xạ đầu ra 0-1024 dưới dạng 0-5 volt (như được hiển thị trong chương trình). Giá trị sau đó được hiển thị trên 7 đoạn và được xác minh bằng đồng hồ vạn năng.
Vậy là xong, bây giờ chúng tôi đã sẵn sàng sử dụng tất cả các Cảm biến Analog hiện có trên thị trường, hãy tiếp tục và thử điều này và nếu bạn gặp bất kỳ vấn đề nào như bình thường, hãy sử dụng phần bình luận, chúng tôi sẽ sẵn lòng giúp bạn.