- MCP4921 DAC (Bộ chuyển đổi kỹ thuật số sang tương tự)
- Thành phần bắt buộc
- Sơ đồ
- Giải thích mã
- Thử nghiệm chuyển đổi kỹ thuật số sang tương tự bằng PIC
Kỹ thuật số và Tương tự là một phần không thể thiếu của Điện tử. Hầu hết các thiết bị đều có cả ADC cũng như DAC và chúng được sử dụng khi có nhu cầu chuyển đổi tín hiệu từ analog sang digital hoặc digital sang analog. Ngoài ra, các tín hiệu thế giới thực như âm thanh và ánh sáng có bản chất tương tự, vì vậy bất cứ khi nào các tín hiệu thế giới thực này phải được sử dụng, các tín hiệu kỹ thuật số phải được chuyển đổi sang tín hiệu tương tự, chẳng hạn để tạo ra âm thanh bằng Loa hoặc để điều khiển nguồn sáng.
Một loại DAC khác là Bộ điều biến độ rộng xung (PWM). PWM nhận một từ kỹ thuật số và tạo ra một xung kỹ thuật số với độ rộng xung thay đổi. Khi tín hiệu này được đưa qua một bộ lọc, kết quả sẽ hoàn toàn là tín hiệu tương tự. Một tín hiệu tương tự có thể có nhiều loại dữ liệu trong một tín hiệu.
Trong hướng dẫn này, chúng tôi sẽ giao diện DAC MCP4921 với Microchip PIC16F877A để chuyển đổi kỹ thuật số sang tương tự.
Ở đây trong hướng dẫn này, chúng tôi sẽ chuyển đổi tín hiệu kỹ thuật số thành tín hiệu tương tự và hiển thị giá trị kỹ thuật số đầu vào và giá trị tương tự đầu ra trên LCD 16x2. Nó sẽ cung cấp 1V, 2V, 3V, 4V và 5V là đầu ra tương tự cuối cùng được minh họa trong video ở cuối. Bạn có thể tìm hiểu thêm về DAC trong hướng dẫn quý giá của chúng tôi về giao tiếp DAC với các bo mạch Raspberry Pi, Arduino và STM32.
DAC có thể được sử dụng trong nhiều ứng dụng như điều khiển động cơ, điều khiển độ sáng đèn LED, bộ khuếch đại âm thanh, bộ mã hóa video, hệ thống thu thập dữ liệu, v.v. Trước khi chuyển trực tiếp đến phần giao diện, điều quan trọng là phải có một cái nhìn tổng quan về MCP4921.
MCP4921 DAC (Bộ chuyển đổi kỹ thuật số sang tương tự)
MCP4921 là một DAC 12 bit, vì vậy MCP4921 sẽ cung cấp 12 bit độ phân giải đầu ra. Độ phân giải DAC có nghĩa là số bit kỹ thuật số có thể được chuyển đổi thành tín hiệu tương tự. Có bao nhiêu giá trị mà chúng ta có thể đạt được từ điều này dựa trên công thức. Đối với 12-bit, nó là = 4096. Điều này có nghĩa là DAC độ phân giải 12-bit có thể tạo ra 4096 đầu ra khác nhau.
Bằng cách sử dụng giá trị này, người ta có thể dễ dàng tính toán điện áp bước tương tự đơn lẻ. Để tính toán các bước, điện áp tham chiếu là bắt buộc. Vì điện áp logic cho thiết bị là 5V, điện áp bước là 5/4095 (4096-1 vì điểm bắt đầu cho kỹ thuật số không phải là 1, nó là 0), là 0,00122100122 milivolt. Vì vậy, thay đổi 1 bit sẽ thay đổi đầu ra tương tự với 0,00122100122.
Vì vậy, đó là phần chuyển đổi. Các MCP4921 là một 8-pin IC. Các sơ đồ pin và mô tả có thể được tìm thấy dưới đây.
Các MCP4921 IC giao tiếp với vi điều khiển bằng giao thức SPI. Đối với giao tiếp SPI, một thiết bị phải là chính, thiết bị này sẽ gửi dữ liệu hoặc lệnh đến thiết bị bên ngoài được kết nối như một thiết bị phụ. Trong hệ thống giao tiếp SPI, nhiều thiết bị phụ có thể được kết nối với Thiết bị chính duy nhất.
Để gửi dữ liệu và lệnh, điều quan trọng là phải hiểu thanh ghi lệnh.
Trong hình dưới đây, thanh ghi lệnh được hiển thị,
Thanh ghi lệnh là một thanh ghi 16 bit. Bit-15 đến bit-12 được sử dụng cho lệnh cấu hình. Dữ liệu đầu vào và cấu hình được hiển thị rõ ràng trong hình trên. Trong dự án này, MCP4921 sẽ được sử dụng làm cấu hình sau-
Số bit |
Cấu hình |
Giá trị cấu hình |
Bit 15 |
DAC A |
0 |
Bit 14 |
Unbuffered |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Bit điều khiển giảm nguồn đầu ra |
1 |
Vì vậy, Binary là 0011 cùng với dữ liệu được xác định bởi các bit D11 đến D0 của thanh ghi. Dữ liệu 16-bit 0011 xxxx xxxx xxxx cần được gửi trong đó 4 bit đầu tiên của MSB là cấu hình và phần còn lại là LSB. Sẽ rõ ràng hơn khi xem biểu đồ thời gian ghi lệnh.
Theo sơ đồ thời gian và biểu dữ liệu, chân CS ở mức thấp trong toàn bộ khoảng thời gian ghi lệnh vào MCP4921.
Bây giờ là lúc giao diện thiết bị với phần cứng và viết mã.
Thành phần bắt buộc
Đối với dự án này, các thành phần sau được yêu cầu-
- MCP4921
- PIC16F877A
- Tinh thể 20 MHz
- Màn hình LCD 16x2 ký tự.
- Điện trở 2k -1 cái
- Tụ 33pF - 2 chiếc
- Điện trở 4,7k - 1 cái
- Một đồng hồ đa năng để đo điện áp đầu ra
- Một breadboard
- Nguồn điện 5V, Sạc điện thoại có thể hoạt động.
- Rất nhiều dây nối hoặc dây berg.
- Môi trường lập trình vi mạch với Bộ lập trình và IDE với trình biên dịch
Sơ đồ
Sơ đồ mạch để giao tiếp DAC4921 với Vi điều khiển PIC được đưa ra dưới đây:
Mạch được xây dựng trong Breadboard-
Giải thích mã
Hoàn thành code cho chuyển đổi tín hiệu kỹ thuật số vào analog với PIC16F877A được đưa ra ở cuối bài viết. Như mọi khi, trước tiên chúng ta cần thiết lập các bit cấu hình trong vi điều khiển PIC.
// Cài đặt bit cấu hình PIC16F877A // Câu lệnh cấu hình dòng nguồn 'C' // CONFIG #pragma config FOSC = HS // Các bit lựa chọn bộ tạo dao động (Bộ tạo dao động HS) #pragma config WDTE = OFF // Bit Enable Watchdog Timer (WDT bị vô hiệu hóa) # pragma config PWRTE = OFF // Kích hoạt bộ hẹn giờ bật nguồn (PWRT bị vô hiệu hóa) #pragma config BOREN = ON // Brown-out Reset bit Enable (bật BOR) #pragma config LVP = OFF // Low-Voltage (Single-Supply) Bit Bật lập trình nối tiếp trong mạch (chân RB3 / PGM có chức năng PGM; bật lập trình điện áp thấp) #pragma config CPD = OFF // Bit bảo vệ mã bộ nhớ dữ liệu EEPROM (Tắt bảo vệ mã EEPROM dữ liệu) #pragma config WRT = OFF // Các bit cho phép ghi chương trình Flash (Tắt bảo vệ ghi; tất cả bộ nhớ chương trình có thể được ghi bởi điều khiển EECON) #pragma config CP = OFF // Bit bảo vệ mã chương trình Flash (tắt bảo vệ mã)
Các dòng mã dưới đây được sử dụng để tích hợp các tệp tiêu đề LCD và SPI, cũng như Khai báo Tần số XTAL và kết nối chân CS của DAC.
Bạn có thể tìm thấy hướng dẫn và thư viện PIC SPI tại liên kết đã cho.
#include
Funciton SPI_Initialize_Master () được sửa đổi một chút cho một cấu hình khác được yêu cầu cho dự án này. Trong trường hợp này, thanh ghi SSPSTAT được định cấu hình sao cho dữ liệu đầu vào được lấy mẫu tại thời điểm kết thúc thời gian đầu ra dữ liệu và đồng hồ SPI được định cấu hình là Truyền xảy ra khi chuyển đổi từ chế độ đồng hồ hoạt động sang trạng thái không hoạt động. Khác là như nhau.
void SPI_Initialize_Master () { TRISC5 = 0; // Đặt làm đầu ra SSPSTAT = 0b11000000; // trang 74/234 SSPCON = 0b00100000; // trang 75/234 TRISC3 = 0; // Đặt làm đầu ra cho chế độ nô lệ }
Ngoài ra, đối với hàm dưới đây, SPI_Write () được sửa đổi một chút. Quá trình truyền dữ liệu sẽ xảy ra sau khi bộ đệm được xóa để đảm bảo truyền dữ liệu hoàn hảo qua SPI.
void SPI_Write (char incoming) { SSPBUF = incoming; // Ghi dữ liệu do người dùng cung cấp vào bộ đệm while (! SSPSTATbits.BF); }
Phần quan trọng của chương trình là trình điều khiển MCP4921. Đây là một phần hơi phức tạp vì lệnh và dữ liệu kỹ thuật số được kết hợp với nhau để cung cấp dữ liệu 16 bit hoàn chỉnh qua SPI. Tuy nhiên, logic đó được thể hiện rõ ràng trong các bình luận mã.
/ * Chức năng này dùng để chuyển đổi giá trị kỹ thuật số sang giá trị tương tự. * / void convert_DAC (unsigned int value) { / * Step Size = 2 ^ n, Do đó 12bit 2 ^ 12 = 4096 Đối với tham chiếu 5V, bước sẽ là 5/4095 = 0,0012210012210012V hoặc 1mV (khoảng) * / unsigned int container; int MSB không dấu; int LSB không dấu; / * Bước: 1, lưu trữ dữ liệu 12 bit vào vùng chứa Giả sử dữ liệu là 4095, ở dạng nhị phân 1111 1111 1111 * / container = value; / * Bước: 2 Tạo giả 8 bit. Vì vậy, bằng cách chia 256, 4 bit trên được ghi lại trong LSB LSB = 0000 1111 * / LSB = container / 256; / * Bước: 3 Gửi cấu hình với dữ liệu 4 bit. LSB = 0011 0000 OR 0000 1111. Kết quả là 0011 1111 * / LSB = (0x30) - LSB; / * Bước: 4 Vùng chứa vẫn có giá trị 21bit. Giải nén 8 bit thấp hơn. 1111 1111 VÀ 1111 1111 1111. Kết quả là 1111 1111 là MSB * / MSB = 0xFF & container; / * Bước: 4 Gửi dữ liệu 16bits bằng cách chia thành hai byte. * / DAC_CS = 0; // CS ở mức thấp trong quá trình truyền dữ liệu. Theo bảng dữ liệu, nó được yêu cầu SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
Trong chức năng chính, 'vòng lặp for' được sử dụng trong đó dữ liệu kỹ thuật số để tạo đầu ra 1V, 2V, 3V, 4V và 5V được tạo. Giá trị kỹ thuật số được tính toán dựa trên điện áp đầu ra / 0,0012210012210012 milivolt.
void main () { system_init (); màn hình giới thiệu (); số int = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DỮ LIỆU Đã Gửi: -"); lcd_print_number (số); lcd_com (SECOND_LINE); lcd_puts ("Đầu ra: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (số); __delay_ms (300); } } }
Thử nghiệm chuyển đổi kỹ thuật số sang tương tự bằng PIC
Mạch xây dựng được kiểm tra bằng cách sử dụng Multi-mét. Trong các hình ảnh dưới đây, điện áp đầu ra và dữ liệu kỹ thuật số được hiển thị trên màn hình LCD. Đồng hồ đa năng đang hiển thị gần đọc.
Mã hoàn chỉnh với video hoạt động được đính kèm bên dưới.