ETT :: Article :: ARM:STM32:STM8 :: Arduino STM32: EP2 ADC

© 2020,จารุต บุศราทิจ

จากบทความตอนที่แล้วเราได้ฝึกฝนการติดตั้งเครื่องมือและลองใช้งานบอร์ดรุ่น ET-STM32F103 ไปเรียบร้อยแล้ว ...​เอาล่ะ จริง ๆ ผมอยากบอกว่า ผมตั้งใจจบที่การทำเครื่องอ่านอุณหภูมิและแสดงผลบนจอแอลซีดี ดังนั้น ตอนนี้เรามาฝึกอีกหน่อยเรื่องการอ่านข้อมูลแบบสัญญาณแอนาล็อก ... แต่จริง ๆ ข้ามไปได้แหละครับ เพราะไม่ได้เอามาเกี่ยวดองอะไรกับเป้าหมายสักเท่าไร ... ก็บอกแล้วฝึกฝนจร้า ฝึกฝน มาเริ่มกันเลยเนอะ

เป้าหมาย

อุปกรณ์ที่ต้องใช้

สรุป เหมือนคราวที่แล้วครับ

มาแปลงสารกันครับ

ปกติแล้วนักคอมพิวเตอร์เรามักรู้จักและคุ้นเคยกับข้อมูลดิจิทัล หรือสัญญาณดิจิทัล ประเด็นคือ ข้อมูลในชีวิตจริงมีความละเอียดอ่อนมากมาก ดังนั้น เพื่อให้ง่ายต่อตัวเราเองเข้าใจได้ เขาเลยคิดค้นวิธีการแปลงข้อมูลที่ละเอียด ๆ เหล่านั้นให้กลายเป็นค่าตัวเลขจำนวนเต็ม เช่น มองแรงดันไฟฟ้า 0-5 VDC (ลองใช้มัลติมิเตอร์แบบเข็มวัดแรงดันดูครับจะเห็นว่ามันไม่เป๊ะ มันนิด ๆ หน่อย ๆ ตลอด) ให้เป็นอีกแบบหนึ่ง คือ มองว่ามันเป็นค่า 0-255 (สมมุติว่าเครื่องแปลงสารของเราแปลงได้ละเอียดถึง 8 บิต) ก็เทียบเคียงกันว่า 0 แทน 0VDC และ 255 แทน 5VDC ตรงกลางก็ปรับสัดส่วนกันเอาน่อ

คำถามก็มาตรงนี้ล่ะ แล้ว ET-STM32F103 เขาละเอียดเท่าไร ... อ้อ บอกเลยไม่เยอะครับแค่ 12 บิต หรือ 212 หรือ 4,096 ค่าเท่านั้นเอง หมายความว่าแรงดัน 0VDC ก็มองเป็นค่า 0 แล้ว 5VDC ก็มองว่าเป็น 4,095 (งงไหมว่าทำไมไม่เป็น 4,096 ... ไม่มีอะไรในกอไผ่ครับ แปลงได้ 4,96 ค่า นั่นเขารวมค่า 0 ด้วย ดังนั้น ค่าสูงสุดเลยเป็น 4,095 ไปโดยประการนี้แหละจร้า) ที่บอกว่าไม่เยอะเท่าไรเพราะเดี๋ยวนี้มีเยอะกว่านี้น่ะครับ ... แล้วที่สำคัญคือ STM32F104 ดันเตรียมไว้ให้ใช้ 12 ช่องสัญญาณ อืม ... เราหยิ่ง ใช้ตัวเดียวพอ เนอะ

มาดูวงจรฝั่งรับสัญญาณแอนาล็อกกันครับ

จากภาพจะเห็นว่าขาเชื่อมต่อกับวงจรคือขา PA1 ดังนั้น ในการเขียนโปรแกรมเราจึงต้องเลือกใช้คำสั่ง readAnalog() เนื่องจากข้อมูลที่ได้เป็นสัญญาณแบบแอนล็อก

วงจรแสดงผล

วงจรแสดงผลมีการใช้บัฟเฟอร์เป็นตัวกลางระหว่างพอร์ตของ STM32F104 กับวงจรแอลอีดี ซึ่งผมชอบวิธีนี้มากเลยครับ เพราะเกิดปัญหาเรื่องแรงดันหรือแรงดันย้อนกลับ หรือมีการดึงกระแสมากเกินไป ซึ่งล้วนแต่สร้างปัญหากับไอซีของเราได้ การใช้บัฟเฟอร์มาคั่น ความซวยก็ตกกับบัฟเฟอร์แทน (LoL) และการแสดงผลเนื่องจากเรามีหน้าที่ส่งสัญญาณดิจิทัลออกที่ขา PB8 ถึง PB15 เราเลยต้องใช้คำสั่ง writeDigital() และการส่งสัญญาณดิจิทัล 0 เป็นการการดับหลอดแอลอีดี และการส่งสัญญาณดิจิทัล 1 เป็นการขับให้หลอดแอลอีดีสว่าง

ประมวลผลอะไรดีน้อ

การประมวลผลของเราคือ นำค่าจากวงตรนำเข้าสัญญาณแอนาล็อกและแปลงเป็นสัญญาณดิจิทัลทำให้เราได้ค่าตัวเลขจำนวนเต็มมาค่าหนึ่ง โดยค่านี้มีช่วงค่าที่เป็นไปได้ 212 ค่า หรือ 4,096 ค่า แต่วงจรผลลัพธ์ของเราซึ่งเป็นหลอดแอลอีดีจำนวน 8 หลอดจะเปลี่ยนเป็นแสดง 4,095 หลอดก็ไม่ได้เนอะ ... เอาไงดี ประมวลผลไงดี ...​เห็นป่ะ ...​เห็นยัง ...​(เห็นอะไร? ถามอย่างนี้ใช้ป่ะ) ..​เห็นไหมว่าต้องประมวลผล!!!

ประมวลผลอะไร ... ประมวลผลว่า ทำไงน้อ ไอ้เจ้า 4,096 ต่านั้นจะมาถูกเปลี่ยนรูปแบบการแสดงผลได้อย่างไร คือ เราอยากได้ว่า ค่าน้อย ๆ หลอดไม่ต้องติดเลย ค่ามากๆ ยันมากสุดๆๆๆๆๆๆ หลอดติดทุกดวง แล้วครงกลางก็ให้หลอดติดจำนวนดวงเท่ากับความเหมาะสมไง (ตอบเหมือนคิดออก...)

เขียนโค้ดกันเลย

เมื่อเขียนเสร็จ Verify ผ่าน (หรือแก้ไขเสร็จแล้ว) ก็อัพโหลดเข้าบอร์ดกันได้เลย

สรุป

เราได้เรียนรู้เพิ่มขึ้นเกี่ยวกับการใช้วงจร ADC และหลักการเขียนโปรแกรมแบบ IPO ซึ่งหมายความว่า เมื่อเราพบปัญหา (ในที่นี้คืออยากแสดงระดับแรงดันที่ป้อนเข้าไปมาแสดงที่แอลอีดีให้เหมือนการเพิ่มลดวอลุมเสียง เป็นบาร์กราฟเลื่อนขึ้นลงหรือซ้ายขวา) จะเห็นว่า สิ่งนำเข้าคือสัญญารแอนาล็อกที่ได้จาก VR ส่วนนำออกหรือแสดงผลตือแอลอีดีจำนวน 8 หลอด มันเลยเป็นแนวคิดที่ว่า รับเข้ามา แล้วทำยังไงน้อ ตัวนำออกถึงจะได้เหมือนที่ปัญหากำหนดไว้ ... ดังนั้น การแก้ปัญหาของเราเลยคิดวิธีการสเกลข้อมูล เพื่อเทียบเคียงว่า ถ้สมีข้อมูล 4,096 ค่า เราจะแบ่งเป็น 9 ช่วงค่า (มี 8 หลอด แต่มี 9 สถานะ) เราเลยต้องหาว่าแต่ละช่วงต้องมีค่าเท่าไร แล้วนำค่านั้นไปหา่าที่รับเข้ามา มันก็ควรจะตอบเราเป็น 0 ถึง 8 (จริงป่ะ) ...​เราก็เอาค่าที่ได้นี่ไปเปิดหลอดแอลอีดีเท่ากับจำนวนหลอดที่เราคำนวณ แต่ทำอย่างไรให้หลอดอื่นดับ ...​เราก็สั่งดับทุกหลอดก่อนแล้วค่อยเปิดใหม่ไง (เล่นง่าย ๆ แต่มีวิธีที่ดีกว่านี้นะครับ เอาไว้ปรับปรุงกันเนอะ ^_^) เอาล่ะครับ ครบทุกวัตถุประสงค์อันเป็นเป้าหมายของเราแล้ว ... ครั้งหน้าเราจะใช้ไลบรารีสำหรับการแสดงผลอุปกรณ์กันบ้างครับ .... ไม่ต้องเดาครับ เป็น LCD ตัวอักษรขนาด 16 ตัวอักษร มี 2 บรรทัด ใช้การสื่อสารแบบ I2C หรือ IIC ในการสั่งงาน

:----: บทความก่อนหน้านี้ :----: บทความตอนถัดไป (next) :----:

--ไม่สามารถเข้าถึงฐานข้อมูลได้--