- ส่วนประกอบที่จำเป็น
- MCP4725 DAC Module (ตัวแปลงดิจิตอลเป็นอนาล็อก)
- การสื่อสาร I2C ใน MCP4725
- แผนภาพวงจรและคำอธิบาย
- การเขียนโปรแกรม STM32F103C8 สำหรับการแปลงดิจิตอลเป็นอนาล็อก
- ทดสอบ DAC กับ STM32
เราทุกคนรู้ดีว่าไมโครคอนโทรลเลอร์ทำงานกับค่าดิจิทัลเท่านั้น แต่ในโลกแห่งความเป็นจริงเราต้องจัดการกับสัญญาณอนาล็อก นั่นเป็นเหตุผลว่าทำไม ADC (ตัวแปลงอนาล็อกเป็นดิจิตอล) จึงมีการแปลงค่าอนาล็อกในโลกแห่งความเป็นจริงให้อยู่ในรูปแบบดิจิตอลเพื่อให้ไมโครคอนโทรลเลอร์สามารถประมวลผลสัญญาณ แต่ถ้าเราต้องการสัญญาณอนาล็อกจากค่าดิจิทัลดังนั้นDAC (Digital to Analog Converter)จึงมาที่นี่
ตัวอย่างง่ายๆสำหรับ ตัวแปลงดิจิตอลเป็นอนาล็อก คือการบันทึกเพลงในสตูดิโอที่ศิลปินนักร้องใช้ไมโครโฟนและร้องเพลง คลื่นเสียงอะนาล็อกเหล่านี้จะถูกแปลงเป็นรูปแบบดิจิทัลแล้วจัดเก็บไว้ในไฟล์รูปแบบดิจิทัลและเมื่อเล่นเพลงโดยใช้ไฟล์ดิจิทัลที่จัดเก็บไว้ค่าดิจิทัลเหล่านั้นจะถูกแปลงเป็นสัญญาณอนาล็อกสำหรับเอาต์พุตของลำโพง ดังนั้นในระบบนี้จึงใช้ DAC
DAC สามารถใช้กับแอพพลิเคชั่นมากมาย เช่นการควบคุมมอเตอร์, การควบคุมความสว่างของไฟ LED, เครื่องขยายเสียง, ตัวเข้ารหัสวิดีโอ, ระบบการเก็บข้อมูลเป็นต้น
เราได้เชื่อมต่อโมดูล MCP4725 DAC กับ Arduino แล้ว วันนี้เราจะใช้ MCP4725 DAC IC ตัวเดียวกันเพื่อออกแบบตัวแปลงดิจิตอลเป็นอนาล็อกโดยใช้ไมโครคอนโทรลเลอร์ STM32F103C8
ส่วนประกอบที่จำเป็น
- STM32F103C8
- MCP4725 DAC IC
- โพเทนชิออมิเตอร์ 10k
- จอ LCD 16x2
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
MCP4725 DAC Module (ตัวแปลงดิจิตอลเป็นอนาล็อก)
MCP4725 IC เป็น โมดูลตัวแปลงสัญญาณดิจิตอลเป็นอนาล็อก 12 บิต ซึ่งใช้ในการสร้างแรงดันไฟฟ้าแบบอะนาล็อกเอาต์พุตจาก (0 ถึง 5V) และควบคุมโดยใช้การสื่อสาร I2C นอกจากนี้ยังมาพร้อมกับ EEPROM หน่วยความจำแบบไม่ลบเลือนบนบอร์ด
IC นี้มีความละเอียด 12 บิต ซึ่งหมายความว่าเราใช้ (0 ถึง 4096) เป็นอินพุตเพื่อให้เอาต์พุตแรงดันไฟฟ้าเทียบกับแรงดันอ้างอิง แรงดันอ้างอิงสูงสุดคือ 5V
สูตรคำนวณแรงดันขาออก
แรงดัน O / P = (แรงดันอ้างอิง / ความละเอียด) x ค่าดิจิตอล
ตัวอย่างเช่น ถ้าเราใช้ 5V เป็นแรงดันอ้างอิงและสมมติว่าค่าดิจิทัลคือ 2048 ดังนั้นในการคำนวณเอาต์พุต DAC
O / P แรงดันไฟฟ้า = (5/4096) x 2048 = 2.5V
Pinout ของ MCP4725ด้านล่างนี้เป็นภาพของ MCP4725 พร้อมระบุชื่อพินอย่างชัดเจน
หมุดของ MCP4725 |
ใช้ |
ออก |
เอาต์พุตแรงดันอนาล็อก |
GND |
GND สำหรับเอาต์พุต |
SCL |
สายนาฬิกาอนุกรม I2C |
SDA |
สายข้อมูลอนุกรม I2C |
VCC |
แรงดันอ้างอิงอินพุต 5V หรือ 3.3V |
GND |
GND สำหรับอินพุต |
การสื่อสาร I2C ใน MCP4725
DAC IC นี้สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์โดยใช้การสื่อสาร I2C การสื่อสาร I2C ต้องการเพียงสองสาย SCL และ SDA ตามค่าเริ่มต้นที่อยู่ I2C สำหรับ MCP4725 คือ 0x60 ไปที่ลิงค์เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการสื่อสาร I2C ใน STM32F103C8
I2C พินใน STM32F103C8:
SDA: PB7 หรือ PB9, PB11
SCL: PB6 หรือ PB8, PB10
แผนภาพวงจรและคำอธิบาย
การเชื่อมต่อระหว่าง STM32F103C8 และ 16x2 LCD
หมายเลขขา LCD |
ชื่อพิน LCD |
ชื่อพิน STM32 |
1 |
พื้นดิน (Gnd) |
พื้นดิน (G) |
2 |
VCC |
5V |
3 |
วี |
ปักหมุดจากศูนย์กลางของโพเทนชิออมิเตอร์เพื่อความคมชัด |
4 |
ลงทะเบียนเลือก (RS) |
PB11 |
5 |
อ่าน / เขียน (RW) |
พื้นดิน (G) |
6 |
เปิดใช้งาน (EN) |
PB10 |
7 |
บิตข้อมูล 0 (DB0) |
ไม่มีการเชื่อมต่อ (NC) |
8 |
บิตข้อมูล 1 (DB1) |
ไม่มีการเชื่อมต่อ (NC) |
9 |
บิตข้อมูล 2 (DB2) |
ไม่มีการเชื่อมต่อ (NC) |
10 |
บิตข้อมูล 3 (DB3) |
ไม่มีการเชื่อมต่อ (NC) |
11 |
บิตข้อมูล 4 (DB4) |
PB0 |
12 |
บิตข้อมูล 5 (DB5) |
PB1 |
13 |
บิตข้อมูล 6 (DB6) |
พีซี 13 |
14 |
บิตข้อมูล 7 (DB7) |
พีซี 14 |
15 |
LED เป็นบวก |
5V |
16 |
LED เชิงลบ |
พื้นดิน (G) |
การเชื่อมต่อระหว่าง MCP4725 DAC IC และ STM32F103C8
MCP4725 |
STM32F103C8 |
มัลติมิเตอร์ |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
ออก |
PA1 |
โพรบบวก |
GND |
GND |
Negative Probe |
VCC |
3.3V |
NC |
โพเทนชิออมิเตอร์ยังเชื่อมต่อโดยมีพินกลางเชื่อมต่อกับอินพุตอนาล็อก PA1 (ADC) ของ STM32F10C8, พินซ้ายที่เชื่อมต่อกับ GND และพินขวาสุดที่เชื่อมต่อกับ 3.3V ของ STM32F103C8
ในบทช่วยสอนนี้เราจะเชื่อมต่อ MCP4725 DAC IC กับ STM32และใช้โพเทนชิออมิเตอร์ 10k เพื่อระบุค่าอินพุตแบบอะนาล็อกให้กับ STM32 ADC พิน PA0 จากนั้นใช้ ADC เพื่อแปลงค่าอนาล็อกเป็นรูปแบบดิจิทัล หลังจากนั้นส่งค่าดิจิทัลเหล่านั้นไปยัง MCP4725 ผ่านบัส I2C จากนั้นแปลงค่าดิจิทัลเหล่านั้นเป็นอนาล็อกโดยใช้ DAC MCP4725 IC จากนั้นใช้พิน ADC อีกอันหนึ่งของ STM32 เพื่อตรวจสอบเอาต์พุตอนาล็อกของ MCP4725 จากพิน OUT สุดท้ายแสดงค่า ADC และ DAC พร้อมแรงดันไฟฟ้าในจอ LCD 16x2
การเขียนโปรแกรม STM32F103C8 สำหรับการแปลงดิจิตอลเป็นอนาล็อก
ตอนนี้ไม่จำเป็นต้องใช้โปรแกรมเมอร์ FTDI เพื่ออัปโหลดรหัสไปยัง STM32F103C8 เพียงแค่เชื่อมต่อไปยังเครื่องคอมพิวเตอร์ผ่านทางพอร์ต USB ของ STM32 และเริ่มต้นการเขียนโปรแกรมด้วยARDUINO IDE เยี่ยมชมลิงค์นี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโปรแกรม STM32 ของคุณใน Arduino IDE โปรแกรมที่สมบูรณ์สำหรับการสอน STM32 DACนี้มีให้ในตอนท้าย
แรก ได้แก่ ห้องสมุดสำหรับ I2C และจอแอลซีดีที่ใช้wire.h, SoftWire.hและliquidcrystal.hห้องสมุด เรียนรู้เพิ่มเติมเกี่ยวกับ I2C ในไมโครคอนโทรลเลอร์ STM32 ที่นี่
# รวม
ถัดไปกำหนดและเริ่มต้นพิน LCD ตามพิน LCD ที่เชื่อมต่อกับ STM32F103C8
const int rs = PB11, th = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal LCD (rs, en, d4, d5, d6, d7);
จากนั้นกำหนดที่อยู่ I2C ของ MCP4725 DAC IC ที่อยู่ I2C เริ่มต้นของ MCP4725 DAC คือ 0x60
# กำหนด MCP4725 0x60
ในการตั้งค่าโมฆะ ()
ขั้นแรกเริ่มต้นการสื่อสาร I2C ที่พิน PB7 (SDA) และ PB6 (SCL) ของ STM32F103C8
Wire.begin (); // เริ่มต้นการสื่อสาร I2C
ถัดไปตั้งค่าการแสดงผล LCD ในโหมด 16x2 และแสดงข้อความต้อนรับ
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); ล่าช้า (1,000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC พร้อม MCP4725"); ล่าช้า (2000); lcd.clear ();
ในโมฆะลูป ()
1. อันดับแรกในบัฟเฟอร์ให้ใส่ค่าไบต์ควบคุม (0b01000000)
(010- ชุด MCP4725 ในโหมดเขียน) บัฟเฟอร์ = 0b01000000;
2. คำสั่งดังต่อไปนี้อ่านค่าจากอนาล็อก PA0 ขาและแปลงเป็นค่าดิจิตอลตั้งแต่ 0 to4096 เป็น ADC ความละเอียด 12 บิตและเก็บในตัวแปรADC
adc = analogRead (PA0);
3. ข้อความต่อไปนี้เป็นสูตรที่ใช้ในการคำนวณแรงดันไฟฟ้าจากค่าอินพุต ADC (0 ถึง 4096) ที่มีแรงดันไฟฟ้าอ้างอิง 3.3V
ลอย ipvolt = (3.3 / 4096.0) * adc;
4. ใส่ค่าบิตที่สำคัญที่สุดในบัฟเฟอร์โดยเลื่อน 4 บิตไปทางขวาในตัวแปร ADC และค่าบิตที่มีนัยสำคัญน้อยที่สุดในบัฟเฟอร์โดยเลื่อน 4 บิตไปทางซ้ายในตัวแปร adc
บัฟเฟอร์ = adc >> 4; บัฟเฟอร์ = adc << 4;
5. ข้อความต่อไปนี้อ่านค่าอนาล็อกจากขา ADC PA1 ของ STM32 ที่เป็นเอาต์พุต DAC (ขา OUTPUT ของ MCP4725 DAC IC) พินนี้ยังสามารถเชื่อมต่อกับมัลติมิเตอร์เพื่อตรวจสอบแรงดันไฟฟ้าขาออก
int analogread ที่ไม่ได้ลงนาม = analogRead (PA1);
6. ค่าแรงดันไฟฟ้าเพิ่มเติมจาก แอนะล็อกแบบแปรผัน จะคำนวณโดยใช้สูตรพร้อมข้อความต่อไปนี้
ลอย opvolt = (3.3 / 4096.0) * analogread;
7. ใน void loop เดียวกัน () มีข้อความอื่น ๆ อีกเล็กน้อยซึ่งจะอธิบายไว้ด้านล่างนี้
เริ่มต้นการส่งด้วย MCP4725:
Wire.beginTransmission (MCP4725);
ส่งไบต์ควบคุมไปยัง I2C
Wire.write (บัฟเฟอร์);
ส่ง MSB ไปยัง I2C
Wire.write (บัฟเฟอร์);
ส่ง LSB ไปยัง I2C
Wire.write (บัฟเฟอร์);
สิ้นสุดการส่งสัญญาณ
Wire.endTransmission ();
ตอนนี้แสดงผลลัพธ์เหล่านั้นในจอแสดงผล LCD 16x2 โดยใช้ lcd.print ()
lcd.setCursor (0,0); lcd.print ("A IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (อะนาล็อกอ่าน); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); ล่าช้า (500); lcd.clear ();
ทดสอบ DAC กับ STM32
เมื่อเราเปลี่ยนค่า ADC อินพุตและแรงดันไฟฟ้าโดยการหมุนโพเทนชิออมิเตอร์ค่า DAC และแรงดันเอาต์พุตจะเปลี่ยนไปด้วย ที่นี่ค่าอินพุตจะแสดงในแถวแรกและค่าเอาต์พุตในแถวที่สองของจอ LCD นอกจากนี้ยังมีการเชื่อมต่อมัลติมิเตอร์เข้ากับขาออก MCP4725 เพื่อตรวจสอบแรงดันไฟฟ้าแบบอะนาล็อก
รหัสที่สมบูรณ์พร้อมวิดีโอสาธิตได้รับด้านล่าง