- เปรียบเทียบ ADC ใน Arduino และ STM32F103C8
- ADC ใน STM32
- วิธีแปลงสัญญาณอนาล็อกเป็นรูปแบบดิจิทัล
- ADC Pins ใน STM32F103C8T6
- ส่วนประกอบที่จำเป็น
- แผนภาพวงจรและคำอธิบาย
- การเขียนโปรแกรม STM32 สำหรับอ่านค่า ADC
คุณสมบัติทั่วไปอย่างหนึ่งที่ใช้ในแอพพลิเคชั่นฝังตัวเกือบทุกตัวคือโมดูล ADC (ตัวแปลงอนาล็อกเป็นดิจิตอล) ตัวแปลงอนาล็อกเป็นดิจิตอลเหล่านี้ สามารถอ่านแรงดันไฟฟ้าจากเซ็นเซอร์อนาล็อกเช่นเซ็นเซอร์อุณหภูมิ, เซ็นเซอร์การเอียง, เซ็นเซอร์ปัจจุบัน, เซ็นเซอร์ Flex และอื่น ๆ อีกมากมาย ดังนั้นในบทช่วยสอนนี้เราจะเรียนรู้ วิธีใช้ ADC ใน STM32F103C8 เพื่ออ่านแรงดันไฟฟ้าอนาล็อก โดยใช้ Energia IDE เราจะเชื่อมต่อโพเทนชิออมิเตอร์ขนาดเล็กเข้ากับบอร์ด STM32 Blue Pillและจ่ายแรงดันไฟฟ้าที่แตกต่างกันไปยังขาอนาล็อกอ่านแรงดันไฟฟ้าและแสดงบนหน้าจอ LCD 16x2
เปรียบเทียบ ADC ใน Arduino และ STM32F103C8
ในบอร์ด Arduino ประกอบด้วย 6 ช่องสัญญาณ (8 ช่องบน Mini และ Nano, 16 ช่องบน Mega), ADC 10 บิตพร้อมช่วงแรงดันไฟฟ้าอินพุต 0V - 5V ซึ่งหมายความว่ามันจะจับคู่แรงดันไฟฟ้าอินพุตระหว่าง 0 ถึง 5 โวลต์เป็นค่าจำนวนเต็มระหว่าง 0 ถึง 1023 ตอนนี้ในกรณีของ STM32F103C8 เรามี 10 ช่องสัญญาณ ADC 12 บิตพร้อมช่วงอินพุต 0V -3.3V จะแมปแรงดันไฟฟ้าอินพุตระหว่าง 0 ถึง 3.3 โวลต์เป็นค่าจำนวนเต็มระหว่าง 0 ถึง 4095
ADC ใน STM32
ADC ที่ฝังอยู่ในไมโครคอนโทรลเลอร์ STM32 ใช้หลักการ SAR (การลงทะเบียนประมาณต่อเนื่อง) ซึ่งการแปลงจะดำเนินการในหลายขั้นตอน จำนวนขั้นตอนการแปลงเท่ากับจำนวนบิตในตัวแปลง ADC แต่ละขั้นตอนขับเคลื่อนด้วยนาฬิกา ADC นาฬิกา ADC แต่ละตัวสร้างหนึ่งบิตจากผลลัพธ์ไปยังเอาต์พุต การออกแบบภายใน ADC ใช้เทคนิคตัวเก็บประจุแบบสวิตช์ หากคุณยังใหม่กับ STM32 ลองดูบทแนะนำการเริ่มต้นใช้งาน STM32 ของเรา
ความละเอียด 12 บิต
ADC นี้เป็น ADC 10 ช่อง 12 บิต ในที่นี้คำว่า 10 channel หมายความว่ามีหมุด ADC 10 ตัวที่ใช้วัดแรงดันไฟฟ้าแบบอะนาล็อก คำว่า 12 บิตแสดงถึงความละเอียดของ ADC 12 บิตหมายถึง 2 ยกกำลังสิบ (2 12) ซึ่งคือ 4096 นี่คือจำนวนขั้นตอนตัวอย่างสำหรับ ADC ของเราดังนั้นช่วงของค่า ADC ของเราจะอยู่ระหว่าง 0 ถึง 4095 ค่าจะเพิ่มขึ้นจาก 0 ถึง 4095 ขึ้นอยู่กับค่าของแรงดันไฟฟ้าต่อขั้นตอนซึ่งสามารถคำนวณได้โดยสูตร
แรงดันไฟฟ้า / ขั้นตอน = แรงดันอ้างอิง / 4096 = (3.3 / 4096 = 8.056mV) ต่อหน่วย
วิธีแปลงสัญญาณอนาล็อกเป็นรูปแบบดิจิทัล
เนื่องจากคอมพิวเตอร์จัดเก็บและประมวลผลเฉพาะค่าไบนารี / ดิจิทัล (1 และ 0) ดังนั้นสัญญาณอนาล็อกเช่นเอาท์พุทของเซ็นเซอร์เป็นโวลต์จึงต้องถูกแปลงเป็นค่าดิจิทัลสำหรับการประมวลผลและการแปลงจะต้องแม่นยำเมื่อกำหนดแรงดันอนาล็อกอินพุตให้กับ STM32 ที่อินพุตอนาล็อกค่าอนาล็อกจะถูกอ่านและจัดเก็บในตัวแปรจำนวนเต็ม. ค่าอนาล็อกที่เก็บไว้ (0-3.3V) จะถูกแปลงเป็นค่าจำนวนเต็ม (0-4096) โดยใช้สูตรด้านล่าง:
แรงดันไฟฟ้าเข้า = (ค่า ADC / ความละเอียด ADC) * แรงดันอ้างอิง
ความละเอียด = 4096
อ้างอิง = 3.3V
ADC Pins ใน STM32F103C8T6
มี 10 พินอนาล็อกใน STM32 จาก PA0 ถึง PB1
ตรวจสอบวิธีใช้ ADC ในไมโครคอนโทรลเลอร์อื่น ๆ ด้วย:
- วิธีใช้ ADC ใน Arduino Uno
- การเชื่อมต่อ ADC0808 กับไมโครคอนโทรลเลอร์ 8051
- การใช้โมดูล ADC ของไมโครคอนโทรลเลอร์ PIC
- การสอน Raspberry Pi ADC
- วิธีใช้ ADC ใน MSP430G2 - การวัดแรงดันอนาล็อก
ส่วนประกอบที่จำเป็น
- STM32F103C8
- LCD 16 * 2
- โพเทนชิออมิเตอร์ 100k
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภาพวงจรและคำอธิบาย
แผนภาพวงจรไปยังอินเทอร์เฟซ LCD 16 * 2และอินพุตอนาล็อกไปยัง บอร์ดSTM32F103C8T6 แสดงอยู่ด้านล่าง
การเชื่อมต่อที่ทำกับ LCD มีดังต่อไปนี้:
หมายเลขขา LCD |
ชื่อพิน LCD |
ชื่อพิน STM32 |
1 |
พื้นดิน (Gnd) |
พื้นดิน (G) |
2 |
VCC |
5V |
3 |
วี |
Pin จาก Center of Potentiometer |
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) |
การเชื่อมต่อทำตามตารางที่ระบุข้างต้น มีโพเทนชิโอมิเตอร์สองตัวอยู่ในวงจรตัวแรกใช้สำหรับตัวแบ่งแรงดันไฟฟ้าซึ่งสามารถใช้เพื่อเปลี่ยนแรงดันไฟฟ้าและให้อินพุตแบบอะนาล็อกไปยัง STM32 ขาซ้ายของโพเทนชิออมิเตอร์นี้ได้รับแรงดันไฟฟ้าขาเข้าจาก STM32 (3.3V) และขาขวาเชื่อมต่อกับกราวด์ขากลางของโพเทนชิออมิเตอร์เชื่อมต่อกับขาอินพุตแบบอะนาล็อก (PA7) ของ STM32 โพเทนชิออมิเตอร์อื่น ๆ ใช้เพื่อปรับความคมชัดของจอ LCD แหล่งจ่ายไฟสำหรับ STM32 มาจากแหล่งจ่ายไฟ USB จากพีซีหรือแล็ปท็อป
การเขียนโปรแกรม STM32 สำหรับอ่านค่า ADC
ในบทช่วยสอนก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับการเขียนโปรแกรมบอร์ด STM32F103C8T6 โดยใช้พอร์ต USB ดังนั้นเราจึงไม่จำเป็นต้องมีโปรแกรมเมอร์ FTDI ในตอนนี้ เพียงเชื่อมต่อกับพีซีผ่านพอร์ต USB ของ STM32 และเริ่มการเขียนโปรแกรมด้วย ARDUINO IDE การเขียนโปรแกรม STM32 ของคุณใน ARDUINO IDE เพื่ออ่านแรงดันไฟฟ้าแบบอะนาล็อกนั้นง่ายมาก เหมือนกับบอร์ด arduino ไม่จำเป็นต้องเปลี่ยนหมุดจัมเปอร์ของ STM32
ในโปรแกรมนี้จะอ่านค่าอนาล็อกและคำนวณแรงดันไฟฟ้าด้วยค่านั้นจากนั้นแสดงทั้งค่าอนาล็อกและดิจิตอลบนหน้าจอ LCD
ครั้งแรก กำหนดออกหมุดจอแอลซีดีสิ่งเหล่านี้กำหนดว่าขาใดของ STM32 ที่เชื่อมต่อกับขา LCD คุณสามารถปรับเปลี่ยนได้ตามความต้องการของคุณ
const int rs = PB11, th = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // ระบุชื่อพินที่เชื่อมต่อกับ LCD
ต่อไปเราจะ รวมไฟล์ส่วนหัว สำหรับจอ LCD สิ่งนี้เรียกไลบรารีซึ่งมีรหัสสำหรับวิธีที่ STM32 ควรสื่อสารกับ LCD ตรวจสอบให้แน่ใจว่าฟังก์ชัน Liquid Crystal ถูกเรียกด้วยชื่อพินที่เรากำหนดไว้ข้างต้น
# รวม
ภายใน ฟังก์ชั่นการ ตั้งค่า () เราจะให้ข้อความแนะนำเพื่อแสดงบนหน้าจอ LCD คุณสามารถเรียนรู้เกี่ยวกับการเชื่อมต่อ LCD กับ STM32
lcd.begin (16, 2); // เราใช้ LCD 16 * 2 LCD.clear (); // ล้างหน้าจอ lcd.setCursor (0, 0); // ในแถวแรกคอลัมน์แรก lcd.prin t ("CIRCUITDIGEST"); // พิมพ์ lcd.setCursor นี้(0, 1); // ที่secound row first colum n lcd.print ("STM32F103C8"); // พิมพ์ Thi s ล่าช้า (2000); // รอสองวินาที lcd.clear (); // ล้างหน้าจอ lcd.setCursor (0, 0); // ในแถวแรกคอลัมน์แรก lcd.print ("USING ADC IN"); // พิมพ์ lcd.setCursor (0,1) นี้ // ที่แถว secound คอลัมน์แรกlcd.print ("STM32F103C8"); // พิมพ์การหน่วงเวลา นี้(2000); // รอสองวินาทีlcd.clear (); // ล้างหน้าจอ
สุดท้ายภายในที่ไม่มีที่สิ้นสุดของเรา ห่วง () ฟังก์ชั่นที่เราเริ่มต้น การอ่านแรงดันไฟฟ้าแบบอะนาล็อกที่ให้มากับขา PA7 จากมิเตอร์ ดังที่เราได้กล่าวไปแล้วไมโครคอนโทรลเลอร์เป็นอุปกรณ์ดิจิทัลและไม่สามารถอ่านระดับแรงดันไฟฟ้าได้โดยตรง การใช้เทคนิค SAR ระดับแรงดันไฟฟ้าจะถูกแมปตั้งแต่ 0 ถึง 4096 ค่าเหล่านี้เรียกว่าค่า ADC เพื่อให้ได้ค่า ADC นี้เพียงแค่ใช้บรรทัดต่อไปนี้
int val = analogRead (A7); // อ่านค่า ADC จากพินPA 7
ต่อไปนี้เป็น ฟังก์ชั่น analogRead () จะใช้ในการอ่านค่าแบบอะนาล็อกของขา ในที่สุดเราก็บันทึกค่านี้ในตัวแปรที่เรียกว่า " val " ประเภทของตัวแปรนี้เป็นจำนวนเต็มเนื่องจากเราจะได้รับค่าตั้งแต่ 0 ถึง 4096 เท่านั้นที่จะเก็บไว้ในตัวแปรนี้
ขั้นตอนต่อไปจะมีการ คำนวณค่าไฟฟ้าจากค่าเอดีซีในการทำสิ่งนี้เรามีสูตรต่อไปนี้
แรงดันไฟฟ้า = (ค่า ADC / ความละเอียด ADC) * โวลแท็กอ้างอิงจ
ในกรณีของเราเรารู้แล้วว่าความละเอียด ADC ของไมโครคอนโทรลเลอร์ของเราคือ 4096 ค่า ADC ยังพบในบรรทัดก่อนหน้าและเก็บตัวแปรที่เรียกว่า val แรงดันอ้างอิงเท่ากับแรงดันไฟฟ้าที่ไมโครคอนโทรลเลอร์เป็นปฏิบัติการ เมื่อคณะกรรมการ STM32 ถูกขับเคลื่อนผ่านสาย USB แล้วแรงดันไฟฟ้าปฏิบัติการที่ 3.3Vคุณยังสามารถวัดแรงดันไฟฟ้าที่ใช้งานได้โดยใช้มัลติมิเตอร์ผ่าน Vcc และขากราวด์บนบอร์ด ดังนั้นสูตรข้างต้นจึงเหมาะกับกรณีของเราดังที่แสดงด้านล่าง
แรงดันลอย = (float (val) / 4096) * 3.3; // สูตรในการแปลงค่า ADC เป็นโวลต์แท็กe
คุณอาจจะสับสนกับ line float (val) นี้จะใช้ในการ แปลงตัวแปร“วาล” จากชนิดข้อมูล int จะ“ลอย” ชนิดข้อมูลจำเป็นต้องมีการแปลงนี้เพราะถ้าเราได้ผลลัพธ์ของ val / 4096 ใน float เท่านั้นเราสามารถคูณได้ 3.3 หากได้รับค่าเป็นจำนวนเต็มค่าจะเป็น 0 และผลลัพธ์จะเป็นศูนย์ด้วย เมื่อเราคำนวณค่า ADC และแรงดันไฟฟ้าแล้วสิ่งที่เหลืออยู่ก็คือการ แสดงผลบนหน้าจอ LCD ซึ่งสามารถทำได้โดยใช้บรรทัดต่อไปนี้
lcd.setCursor (0, 0); // ตั้งค่าเคอร์เซอร์เป็นคอลัมน์ 0 บรรทัด 0 lcd.print ("ADC Val:"); lcd.print (วาล); // แสดงค่า ADC lcd.setCursor (0, 1); // ตั้งค่าเคอร์เซอร์เป็นคอลัมน์ 0 บรรทัดที่ 1 lcd.print ("Voltage:"); lcd.print (แรงดันไฟฟ้า); // แสดงแรงดันไฟฟ้า
รหัสที่สมบูรณ์และวิดีโอสาธิตได้รับด้านล่าง