- MCP4921 DAC (ตัวแปลงดิจิตอลเป็นอนาล็อก)
- ส่วนประกอบที่จำเป็น
- แผนผัง
- คำอธิบายรหัส
- การทดสอบการแปลงดิจิตอลเป็นอนาล็อกโดยใช้ PIC
Digital และ Analog เป็นส่วนหนึ่งของ Electronics อุปกรณ์ส่วนใหญ่มีทั้ง ADC และ DAC และจะใช้เมื่อจำเป็นต้องแปลงสัญญาณจากอนาล็อกเป็นดิจิทัลหรือดิจิทัลเป็นอนาล็อก นอกจากนี้สัญญาณในโลกแห่งความเป็นจริงเช่นเสียงและแสงยังเป็นแบบอะนาล็อกดังนั้นเมื่อใดก็ตามที่ต้องใช้สัญญาณในโลกแห่งความเป็นจริงสัญญาณดิจิทัลจะต้องถูกแปลงเป็นอนาล็อกเช่นเพื่อสร้างเสียงโดยใช้ลำโพงหรือเพื่อควบคุมแหล่งกำเนิดแสง
DAC อีกประเภทหนึ่งคือ Pulse Width Modulator (PWM) PWM ใช้คำดิจิทัลและสร้างพัลส์ดิจิทัลที่มีความกว้างพัลส์ตัวแปร เมื่อสัญญาณนี้ถูกส่งผ่านตัวกรองผลลัพธ์จะเป็นแบบอะนาล็อกทั้งหมด สัญญาณแอนะล็อกสามารถมีข้อมูลหลายประเภทในสัญญาณ
ในการกวดวิชานี้เราจะติดต่อ DAC MCP4921 กับ Microchip PIC16F877A สำหรับดิจิตอลเพื่อแปลงอนาล็อก
ในบทช่วยสอนนี้เราจะแปลงสัญญาณดิจิทัลเป็นสัญญาณแอนะล็อกและแสดงค่าดิจิตอลอินพุตและค่าอะนาล็อกเอาต์พุตบนจอ LCD 16x2 จะให้ 1V, 2V, 3V, 4V และ 5V เป็นเอาต์พุตอนาล็อกสุดท้ายซึ่งแสดงให้เห็นในวิดีโอที่ให้ไว้ในตอนท้าย คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ DAC ในบทช่วยสอนอันล้ำค่าของเราเกี่ยวกับการเชื่อมต่อ DAC กับบอร์ด Raspberry Pi, Arduino และ STM32
DAC สามารถใช้ในแอพพลิเคชั่นมากมาย เช่นการควบคุมมอเตอร์, การควบคุมความสว่างของไฟ LED, เครื่องขยายเสียง, ตัวเข้ารหัสวิดีโอ, ระบบเก็บข้อมูลเป็นต้นก่อนที่จะกระโดดไปยังส่วนเชื่อมต่อโดยตรงสิ่งสำคัญคือต้องมีภาพรวมเกี่ยวกับ MCP4921
MCP4921 DAC (ตัวแปลงดิจิตอลเป็นอนาล็อก)
MCP4921 เป็น DAC 12 บิตดังนั้น MCP4921 จะให้ความละเอียดเอาต์พุต 12 บิต ความละเอียด DAC หมายถึงจำนวนบิตดิจิทัลที่สามารถแปลงเป็นสัญญาณแอนะล็อกได้ จำนวนค่าที่เราจะได้รับนั้นขึ้นอยู่กับสูตร สำหรับ 12 บิตคือ = 4096 ซึ่งหมายความว่า DAC ความละเอียด 12 บิตสามารถสร้างเอาต์พุตที่แตกต่างกัน 4096 เอาต์พุต
ด้วยการใช้ค่านี้เราสามารถคำนวณแรงดันไฟฟ้าขั้นตอนอะนาล็อกเดี่ยวได้อย่างง่ายดาย สำหรับการคำนวณขั้นตอนจำเป็นต้องใช้แรงดันไฟฟ้าอ้างอิง เนื่องจากแรงดันลอจิกสำหรับอุปกรณ์คือ 5V แรงดันไฟฟ้าขั้นตอนคือ 5/4095 (4096-1 เนื่องจากจุดเริ่มต้นของดิจิตอลไม่ใช่ 1 จึงเป็น 0) ซึ่งเท่ากับ 0.00122100122 มิลลิโวลต์ ดังนั้นการเปลี่ยนแปลง 1 บิตจะเปลี่ยนเอาต์พุตอะนาล็อกด้วย 0.00122100122
นั่นคือส่วนของการแปลง MCP4921 เป็น 8 ขา IC แผนภาพขาและคำอธิบายจะอยู่ด้านล่าง
MCP4921 IC สื่อสารกับไมโครคอนโทรลเลอร์โดยโปรโตคอล สำหรับการสื่อสาร SPI อุปกรณ์จะต้องเป็นอุปกรณ์หลักซึ่งส่งข้อมูลหรือคำสั่งไปยังอุปกรณ์ภายนอกที่เชื่อมต่อเป็นทาส ในระบบการสื่อสาร SPI สามารถเชื่อมต่ออุปกรณ์ Slave หลายตัวกับ Master Device เครื่องเดียวได้
ในการส่งข้อมูลและคำสั่งสิ่งสำคัญคือต้องเข้าใจการลงทะเบียนคำสั่ง
ในภาพด้านล่างการลงทะเบียนคำสั่งจะปรากฏขึ้น
ทะเบียนคำสั่งลงทะเบียน 16 บิต บิต -15 ถึงบิต -12 ใช้สำหรับคำสั่งคอนฟิกูเรชัน การป้อนข้อมูลและการกำหนดค่าแสดงไว้อย่างชัดเจนในภาพด้านบน ในโครงการนี้ MCP4921 จะถูกใช้เป็นการกำหนดค่าต่อไปนี้ -
หมายเลขบิต |
การกำหนดค่า |
ค่าการกำหนดค่า |
บิต 15 |
DAC ก |
0 |
บิต 14 |
ไม่ถูกบัฟเฟอร์ |
0 |
บิต 13 |
1x (V ออก * D / 4096) |
1 |
บิต 12 |
บิตควบคุมกำลังขาออก |
1 |
ดังนั้นไบนารีคือ 0011 พร้อมกับข้อมูลที่กำหนดโดย D11 ถึง D0 บิตของรีจิสเตอร์ จำเป็นต้องส่งข้อมูล 16 บิต 0011 xxxx xxxx xxxx โดยที่ MSB 4 บิตแรกเป็นส่วนกำหนดค่าและส่วนที่เหลือคือ LSB จะชัดเจนยิ่งขึ้นโดยดูแผนภาพการเขียนคำสั่ง
ตามแผนภาพเวลาและแผ่นข้อมูลพิน CS อยู่ในระดับต่ำสำหรับช่วงการเขียนคำสั่งทั้งหมดไปยัง MCP4921
ตอนนี้เป็นเวลาเชื่อมต่ออุปกรณ์กับฮาร์ดแวร์และเขียนรหัส
ส่วนประกอบที่จำเป็น
สำหรับโครงการนี้จำเป็นต้องมีส่วนประกอบต่อไปนี้ -
- MCP4921
- PIC16F877A
- คริสตัล 20 MHz
- จอแสดงผล LCD 16x2 ตัวอักษร
- ตัวต้านทาน 2k -1 ชิ้น
- ตัวเก็บประจุ 33pF - 2 ชิ้น
- ตัวต้านทาน 4.7k - 1 ชิ้น
- มัลติมิเตอร์เพื่อวัดแรงดันไฟฟ้าขาออก
- เขียงหั่นขนม
- แหล่งจ่ายไฟ 5V เครื่องชาร์จโทรศัพท์สามารถทำงานได้
- สายเชื่อมต่อหรือสายไฟจำนวนมาก
- สภาพแวดล้อมการเขียนโปรแกรมไมโครชิปด้วยชุดโปรแกรมเมอร์และ IDE พร้อมคอมไพเลอร์
แผนผัง
แผนภาพวงจรสำหรับการ เชื่อมต่อ DAC4921 กับไมโครคอนโทรลเลอร์ PIC แสดง ไว้ด้านล่าง:
วงจรถูกสร้างขึ้นใน Breadboard-
คำอธิบายรหัส
รหัสที่สมบูรณ์ สำหรับการแปลงสัญญาณดิจิทัลเป็นอนาล็อกด้วย PIC16F877Aมีให้ที่ท้ายบทความ เช่นเคยเราต้องตั้งค่าบิตการกำหนดค่าในไมโครคอนโทรลเลอร์ PIC ก่อน
// PIC16F877A Configuration Bit Settings // คำ สั่งการกำหนดค่าบรรทัดต้นทาง 'C' // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) # pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enable) #pragma config LVP = OFF // Low-Voltage (Single-Supply) การเขียนโปรแกรมแบบอนุกรมในวงจรเปิดใช้งานบิต (พิน RB3 / PGM มีฟังก์ชัน PGM เปิดใช้งานการเขียนโปรแกรมแรงดันไฟฟ้าต่ำ) #pragma config CPD = OFF // บิตการป้องกันรหัสหน่วยความจำ EEPROM ข้อมูล (ปิดการป้องกันรหัสข้อมูล EEPROM) #pragma config WRT = OFF // Flash Program Memory Write เปิดใช้งานบิต (ปิดการป้องกันการเขียนหน่วยความจำโปรแกรมทั้งหมดอาจถูกเขียนโดยการควบคุม EECON) #pragma config CP = OFF // บิตป้องกันรหัสหน่วยความจำโปรแกรมแฟลช (ปิดการป้องกันรหัส)
บรรทัดรหัสด้านล่างใช้สำหรับการรวมไฟล์ส่วนหัวของ LCD และ SPI รวมถึงยังมีการประกาศความถี่ XTAL และการเชื่อมต่อขา CS ของ DAC
สามารถดูบทแนะนำและไลบรารี PIC SPI ได้ที่ลิงค์ที่ระบุ
# รวม
Funciton SPI_Initialize_Master () ได้รับการแก้ไขเล็กน้อยสำหรับการกำหนดค่าอื่นที่จำเป็นสำหรับโครงการนี้ ในกรณีนี้การลงทะเบียน SSPSTAT ได้รับการกำหนดค่าในลักษณะที่ข้อมูลอินพุตสุ่มตัวอย่างเมื่อสิ้นสุดเวลาเอาต์พุตข้อมูลและนาฬิกา SPI ที่กำหนดค่าเป็นส่งจะเกิดขึ้นในการเปลี่ยนจากโหมดสถานะนาฬิกาที่ใช้งานเป็นนาฬิกาที่ไม่ได้ใช้งาน อื่น ๆ ก็เหมือนกัน
โมฆะ SPI_Initialize_Master () { TRISC5 = 0; // ตั้งเป็นเอาต์พุต SSPSTAT = 0b11000000; // หน้า 74/234 SSPCON = 0b00100000; // หน้า 75/234 TRISC3 = 0; // ตั้งเป็นเอาต์พุตสำหรับโหมดทาส }
นอกจากนี้สำหรับฟังก์ชันด้านล่าง SPI_Write () ได้รับการแก้ไขเล็กน้อย การส่งข้อมูลจะเกิดขึ้นหลังจากล้างบัฟเฟอร์เพื่อให้แน่ใจว่าการส่งข้อมูลผ่าน SPI สมบูรณ์แบบ
โมฆะ SPI_Write (ถ่านขาเข้า) { SSPBUF = ขาเข้า; // เขียนข้อมูลที่ผู้ใช้กำหนดลงในบัฟเฟอร์ ในขณะที่ (! SSPSTATbits.BF); }
ส่วนสำคัญของโปรแกรมคือไดรเวอร์ MCP4921 เป็นส่วนที่ยุ่งยากเล็กน้อยเนื่องจากคำสั่งและข้อมูลดิจิทัลถูกเจาะเข้าด้วยกันเพื่อให้ข้อมูล 16 บิตที่สมบูรณ์ผ่าน SPI อย่างไรก็ตามตรรกะดังกล่าวแสดงให้เห็นอย่างชัดเจนในความคิดเห็นของโค้ด
/ * ฟังก์ชั่นนี้ใช้สำหรับแปลงค่าดิจิทัลเป็นอนาล็อก * / void convert_DAC (ค่า int ที่ไม่ได้ลงชื่อ) { / * ขนาดขั้นตอน = 2 ^ n ดังนั้น 12 บิต 2 ^ 12 = 4096 สำหรับการอ้างอิง 5V ขั้นตอนจะเป็น 5/4095 = 0.0012210012210012V หรือ 1mV (โดยประมาณ) * / คอนเทนเนอร์ int ที่ไม่ได้ลงชื่อ; MSB int ที่ไม่ได้ลงนาม; LSB int ที่ไม่ได้ลงนาม; / * ขั้นตอน: 1 จัดเก็บข้อมูล 12 บิตลงในคอนเทนเนอร์ สมมติว่าข้อมูลเป็น 4095 ในไบนารี 1111 1111 1111 * / container = value; / * ขั้นตอน: 2 การสร้าง Dummy 8 บิต ดังนั้นโดยการหาร 256 บิตบน 4 จะถูกจับใน LSB LSB = 0000 1111 * / LSB = container / 256; / * ขั้นตอน: 3 ส่งการกำหนดค่าโดยเจาะข้อมูล 4 บิต LSB = 0011 0000 หรือ 0000 1111 ผลลัพธ์คือ 0011 1111 * / LSB = (0x30) - LSB; / * ขั้นตอน: 4 คอนเทนเนอร์ยังคงมีค่า 21 บิต แยก 8 บิตล่าง 1111 1111 และ 1111 1111 1111 ผลลัพธ์คือ 1111 1111 ซึ่งเป็น MSB * / MSB = 0xFF & container; / * ขั้นตอน: 4 การส่งข้อมูล 16 บิตโดยแบ่งออกเป็นสองไบต์ * / DAC_CS = 0; // CS ต่ำระหว่างการส่งข้อมูล ตามแผ่นข้อมูลจำเป็นต้องใช้ SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
ในฟังก์ชั่นหลักจะใช้ 'for loop' เพื่อสร้างข้อมูลดิจิทัลสำหรับสร้างเอาต์พุต 1V, 2V, 3V, 4V และ 5V ค่าดิจิตอลคำนวณเทียบกับแรงดันขาออก / 0.0012210012210012 มิลลิโวลต์
เป็นโมฆะ main () { system_init (); Introduction_screen (); หมายเลข int = 0; int โวลต์ = 0; ในขณะที่ (1) { สำหรับ (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0.0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("ข้อมูลที่ส่ง: -"); lcd_print_number (หมายเลข); lcd_com (SECOND_LINE); lcd_puts ("เอาต์พุต: -"); lcd_print_number (โวลต์); lcd_puts ("V"); Convert_DAC (หมายเลข); __delay_ms (300); } } }
การทดสอบการแปลงดิจิตอลเป็นอนาล็อกโดยใช้ PIC
วงจรที่สร้างขึ้นได้รับการทดสอบโดยใช้ Multi-meter ในภาพด้านล่างแรงดันไฟฟ้าขาออกและข้อมูลดิจิตอลจะแสดงบนจอ LCD Multi-meter แสดงการอ่านระยะใกล้
รหัสที่สมบูรณ์พร้อมวิดีโอที่ใช้งานได้แนบอยู่ด้านล่าง