บทความ ESPino32 ตอนที่ 6 การใช้งาน Analog Output

สารบัญ บทความ ESPino32

บทความ ESPino32 ตอนที่ 6 การใช้งาน Analog Output

        บทความ ESPino32 ตอนที่ 6 การใช้งาน Analog Output เป็นการใช้งานบอร์ดไมโครคอนโทรเลอร์เพื่อส่งเอาต์พุตแบบแอนะล็อกออกจากขาเอาต์พุตต่างๆของบอร์ด ESPino32 เพื่อควบคุมอุปกรณ์ต่างๆ อาทิเช่น ใช้สัญญาณแอนะล็อกจากขาของบอร์ด ESPino32 เพื่อควบคุมความสว่างของหลอด LED ใช้สัญญาณแอนะล็อกจากขาของบอร์ด ESPino32 เพื่อควบคุมความเร็วของบอร์ดขับมอเตอร์ DC ใช้สัญญาณแอนะล็อกจากขาของบอร์ด ESPino32 เพื่อควบคุมเซอร์โวมอเตอร์ ใช้สัญญาณแอนะล็อกจากขาของบอร์ด ESPino32 เพื่อควบคุมหลอดไฟผ่าน dimmer ดังรูป การใช้งานค่า Analog Output ควบคุมอุปกรณ์ภายนอก

การใช้งานค่า Analog Output ควบคุมอุปกรณ์ภายนอก

ในบทความนี้จะประกอบไปด้วยเนื้อหาการใช้งาน Analog Output จำนวน 3 รูปแบบ คือ

– การใช้งาน Analog Output แบบ PWM

– การใช้งาน Analog Output แบบ SigmaDelta

– การใช้งาน Analog Output แบบ DAC

        สำหรับการใช้งานฟังก์ชัน Analog Output ในบอร์ด ESPino32 ขาของบอร์ดที่สามารถใช้งานฟังก์ชัน PWM และฟังก์ชัน SigmaDelta จะสามารถใช้งานได้ที่ขา I/O ในแถบสีเหลือง ส่วนฟังก์ชัน DAC จะรองรับที่ขา GPIO25 และ GPIO26 เท่านั้น ดังรูป ESPino32 Pinout

ESPino32 Pinout

การใช้งาน Analog Output แบบ PWM

        PWM ย่อมาจาก Pulse-width modulation เป็นเทคนิคการเข้ารหัสสัญญาณดิจิทัลให้มีเอาต์พุตเฉลี่ยคล้ายสัญญาณแอนะล็อก ลักษณะการทำงานคือตัวบอร์ดจะสร้างลอจิก HIGH(3.3V) และ ลอจิก LOW(0V) สลับกันทำให้ Pulse width (ค่าคาบเวลาช่วง HIGH ของสัญญาณ 1 ลูกคลื่น มีหน่วยเป็นเปอร์เซ็นต์หรือเรียกอีกอย่างว่า Duty Cycle) ดังรูป ตัวอย่างสัญญาณ PWM

ตัวอย่างสัญญาณ PWM

        การใช้งานฟังก์ชัน PWM ของบอร์ด ESPino32 ที่พัฒนาด้วยแพลดฟอร์มของ Arduino ไม่สามารถใช้งานฟังก์ชัน analogWrite() เช่นเดียวกับบอร์ด Arduino ได้ ดังนั้นจึงจำเป็นต้องใช้งานผ่านไลบรารี่ ledc ที่ติดตั้งมาพร้อมกับแพ็กเกจบอร์ดของ ESP32 ดังรูป Key Settings of LED PWM Controller’s API

Key Settings of LED PWM Controller’s API

ฟังก์ชันที่ควรรู้เกี่ยวกับการใช้งาน Analog Output แบบ PWM

double ledcSetup(uint8_t chan, double freq, uint8_t bit_num)

เป็นฟังก์ชันสำหรับกำหนดค่า แชนแนล ความถี่ และความละเอียด ที่ต้องการใช้งาน

Parameter

chan           หมายเลขแชลแนลที่ต้องการใช้งาน (0-15)
freq             ความถี่ที่ต้องการใช้งาน (สูงสุด 40 MHz)
bit_num      ค่าความละเอียดของสัญญาณ (1-13 Bit)

void ledcAttachPin(uint8_t pin, uint8_t channel);

เป็นฟังก์ชันสำหรับเชื่อมโยง Timer กับของขา GPIO ที่ต้องการส่งสัญญาณแบบ PWM

Parameter

pin             ขา GPIO ที่ต้องการส่งสัญญาณแบบ PWM
channel      หมายเลขแชลแนลที่ต้องการใช้งาน

void ledcWrite(uint8_t channel, uint32_t duty);

เป็นฟังก์ชันเอาต์พุตของสัญญาณ PWM

Parameter

channel      หมายเลขแชลแนลที่ต้องการใช้งาน
duty           Duty Cycle ที่ต้องการ

ส่วนประกอบหลักในการใช้งาน Analog Output แบบ PWM จะมีอยู่ 3 ส่วนคือ

1. การประกาศตัวแปร

2. ฟังก์ชัน setup สำหรับกำหนดค่าต่างๆที่เกี่ยวข้องกับการใช้งาน PWM

3. ฟังก์ชันที่ถูกเรียกงาน

ตัวอย่างการนำ Analog Output แบบ PWM มาประยุกต์ใช้กับบอร์ด ESPino32 โดยจะให้ตัวบอร์ด ESPino32 ส่งสัญญาณ PWM ค่าต่างๆ ออกทางขา GPIO04 ที่ต่ออยู่กับ LED เพื่อควบคุมความสว่างของหลอด LED

ต่อวงจรดังรูป ควบคุมความสว่างของหลอด LED ด้วยสัญญาณแอนะล็อกแบบ PWM

ควบคุมความสว่างของหลอด LED ด้วยสัญญาณแอนะล็อกแบบ PWM

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         ประกาศตัวแปร freq ชนิด Integer ที่เป็นค่าคงที่ให้มีค่ากับ 5000
บรรทัดที่ 2         ประกาศตัวแปร ledChannel ชนิด Byte ที่เป็นค่าคงที่ให้มีค่ากับ 0
บรรทัดที่ 3         ประกาศตัวแปร resolution ชนิด Byte ที่เป็นค่าคงที่ให้มีค่ากับ 8
บรรทัดที่ 4         ประกาศตัวแปร ledPin ชนิด Byte ที่เป็นค่าคงที่ให้มีค่ากับ 4
บรรทัดที่ 5         สร้างฟังก์ชัน setup()
บรรทัดที่ 6         เปิดฟังก์ชัน setup()
บรรทัดที่ 7         ใช้งานฟังก์ชัน ledcSetup โดยมีพารามิเตอร์คือ ledChannel, freq, resolution (ตั้งค่า Channel PWM ที่ใช้งานให้มีความถี่เท่ากับค่าตัวแปร freq และความละเอียดเท่ากับค่าในตัวแปร resolution)
บรรทัดที่ 8         ใช้งานฟังก์ชัน ledcAttachPin โดยมีพารามิเตอร์คือ ledPin, ledChannel (ตั้งค่า Channel PWM ให้ใช้งานที่แชนแนลในตัวแปร ledChannel และกำหนดให้สัญญาณ PWM ออกทางขา ledPin)
บรรทัดที่ 9         ปิดฟังก์ชัน setup()
บรรทัดที่ 10        สร้างฟังก์ชัน loop()
บรรทัดที่ 11        เปิดฟังก์ชัน loop()
บรรทัดที่ 12        ฟังก์ชันวนรอบการทำงาน โดยประกาศตัวแปร dutyCycle ให้มีค่าเท่ากับ 0, วนรอบการทำงานจนกว่าค่าในตัวแปร dutyCycle จะมีค่าน้อยกว่าหรือเท่ากับเกิน 255, เพิ่มค่าในตัวแปร dutyCycle ขึ้นทีละ 63
บรรทัดที่ 13        ใช้งานฟังก์ชัน ledWrite เพื่อส่งออกทางขา PWM
บรรทัดที่ 14        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 15        ปิดฟังชันวนรอบการทำงาน
บรรทัดที่ 16        ปิดฟังก์ชัน loop()

ผลการทดลอง 

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมในบอร์ดจะเรียกใช้งานไลบรารี่ ledc จากนั้นกำหนดค่าต่างๆของสัญญาณ PWM โดยใช้งาน ledc แชนแนล 0 ความถี่ขนาด 5000 Hz ความละเอียดขนาด 8 บิต และกำหนดให้สัญญาณ PWM ออกทางขา GPIO04 เมื่อเข้าสู่โปรแกรมหลักโปรแกรมจะวนรอบการทำงานโดยสั่งงานให้สัญญาณ PWM มีค่า 0, 63, 126, 189, 252 ตามลำดับ และหากวัดด้วยมัลติมิเตอร์จะเห็นได้ว่าค่าความต่างศักย์ของขา GPIO04 จะมีค่า 0, 8.13, 1.626, 2.439, 3.252 ตามลำดับ ทำให้ระดับความสว่างของ LED สว่างแตกต่างกันไป ดังรูป ผลลัพธ์ของสัญญาณ PWM เมื่อวัดค่าความต่างศักย์ด้วยมัลติมิเตอร์

ผลลัพธ์ของสัญญาณ PWM เมื่อวัดค่าความต่างศักย์ด้วยมัลติมิเตอร์

การเปรียบเทียบค่าสัญญาณแอนะล็อกแบบ PWM เป็นค่าความต่างศักย์สามารถทำได้โดยใช้สูตร

การใช้งาน Analog Output แบบ SigmaDelta

        Sigma-delta (ΣΔ) หรือ Delta-sigma (ΔΣ) คือ เทคนิคการเข้ารหัสสัญญาณที่มีความละเอียดสูง พบได้ทั้งในตัวแปลงสัญญาณ Analog to Digital Converter (ADC) และ Digital to Analog Converter (DAC) ในบทนี้จะกล่าวถึง Digital to Analog Converter (DAC) ที่ทำหน้าที่เข้ารหัสสัญญาญดิจิทัลให้มีเอาต์พุตเฉลี่ยคล้ายสัญญาณแอนะล็อก

ฟังก์ชันที่ควรรู้เกี่ยวกับการใช้งาน Analog Output แบบ SigmaDelta

uint32_t sigmaDeltaSetup(uint8_t channel, uint32_t freq)

เป็นฟังก์ชันสำหรับกำหนดแชลแนลของ SigmaDelta ที่ต้องการใช้งาน

Parameter

chan           หมายเลขแชลแนลที่ต้องการใช้งาน (0-7)
freq            ความถี่ที่ต้องการใช้งาน (1220-312500 Hz)

void sigmaDeltaAttachPin(uint8_t pin, uint8_t channel)

เป็นฟังก์ชันสำหรับเชื่อมโยงขา GPIO ที่ต้องการใช้งานเข้ากับแชนแนลของ SigmaDelta

Parameter

pin             ขา GPIO ที่ต้องการให้สัญญาณ PWM ออก
channel      หมายเลขแชลแนลที่ต้องการใช้งาน

void sigmaDeltaWrite (uint8_t channel, uint32_t duty);

เป็นฟังก์ชันเอาต์พุตของสัญญาณ Analog Output แบบ SigmaDelta

Parameter

channel      หมายเลขแชลแนลที่ต้องการใช้งาน
duty           Duty Cycle ที่ต้องการ (0-255)

ตัวอย่างการนำ Analog Output แบบ SigmaDelta มาประยุกต์ใช้กับบอร์ด ESPino32 โดยจะให้ตัวบอร์ด ESPino32 ส่งสัญญาณแอนะล็อกแบบ SigmaDelta ค่าต่างๆ ออกทางขา GPIO04 ที่ต่ออยู่กับ LED เพื่อควบคุมความสว่างของหลอด LED

ต่อวงจรดังรูป ควบคุมความสว่างของหลอด LED ด้วยสัญญาณแอนะล็อกแบบ SigmaDelta

ควบคุมความสว่างของหลอด LED ด้วยสัญญาณแอนะล็อกแบบ SigmaDelta

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         สร้างฟังก์ชัน setup()
บรรทัดที่ 2         เปิดฟังก์ชัน setup()
บรรทัดที่ 3         กำหนดให้สัญญาณแอนะล็อกแบบ SigmaDelta ใช้งานแชนแนล 0, ความถี่ 312500 Hz
บรรทัดที่ 4         เชื่อมโยงแชนแนลของสัญญาณแอนะล็อกแบบ SigmaDelta เข้ากับขา GPIO04
บรรทัดที่ 5         ปิดฟังก์ชัน setup()
บรรทัดที่ 6         สร้างฟังก์ชัน loop()
บรรทัดที่ 7         เปิดฟังก์ชัน loop()
บรรทัดที่ 8         ฟังก์ชันวนรอบการทำงาน โดยประกาศตัวแปร i ให้มีค่าเท่ากับ 0, วนรอบการทำงานจนกว่าค่าในตัวแปร i จะมีค่าน้อยกว่าหรือเท่ากับเกิน 255, เพิ่มค่าในตัวแปร i ขึ้นทีละ 63
บรรทัดที่ 9         สั่งให้สัญญาณแอนะล็อกแบบ SigmaDelta ออกทางขา GPIO04
บรรทัดที่ 10        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 11        ปิดฟังชันวนรอบการทำงาน
บรรทัดที่ 12        ปิดฟังก์ชัน loop()

ผลการทดลอง 

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะกำหนดค่าต่างๆของสัญญาณแอนะล็อกแบบ SigmaDelta ให้ใช้งาน SigmaDelta แชนแนล 0 ความถี่ขนาด 312500 Hz และกำหนดให้สัญญาณ PWM ออกทางขา GPIO04 เมื่อเข้าสู่โปรแกรมหลักโปรแกรมจะวนรอบการทำงานโดยสั่งงานให้สัญญาณแอนะล็อกแบบ SigmaDelta มีค่า 0, 63, 126, 189, 252 ตามลำดับ และหากวัดด้วยมัลติมิเตอร์จะเห็นได้ว่าค่าความต่างศักย์ของขา GPIO04 จะมีค่า 0, 0.784, 1.600, 2.436, 3.252 ตามลำดับ ทำให้ระดับความสว่างของ LED สว่างแตกต่างกันไป ดังรูป ผลลัพธ์ของสัญญาณ SigmaDelta เมื่อวัดค่าความต่างศักย์ด้วยมัลติมิเตอร์

ผลลัพธ์ของสัญญาณ SigmaDelta เมื่อวัดค่าความต่างศักย์ด้วยมัลติมิเตอร์

การเปรียบเทียบค่าสัญญาณแอนะล็อกแบบ SigmaDelta เป็นค่าความต่างศักย์สามารถทำได้โดยใช้สูตร

การใช้งาน Analog Output แบบ DAC

        Analog Output แบบ DAC คือ Digital to Analog Converter อีกแบบหนึ่ง ซึ่งบอร์ด ESPino32 มีช่องสัญญาณ DAC 8 บิต จำนวน 2 Channel แบ่งเป็น DAC Channel 1 ที่ขา GPIO25 และ DAC Channel 2 ที่ขา GPIO26

ฟังก์ชันที่ควรรู้เกี่ยวกับการใช้งาน Analog Output แบบ DAC

void dacWrite(uint8_t pin, uint8_t value);

เป็นฟังก์ชันเอาต์พุตของสัญญาณ Analog Output แบบ DAC

Parameter

pin             หมายเลขแชลแนลที่ต้องการใช้งาน
value          value ที่ต้องการ (0-255)

ตัวอย่างการนำ Analog Output แบบ DAC มาประยุกต์ใช้กับบอร์ด ESPino32 โดยจะให้ตัวบอร์ด ESPino32 ส่งสัญญาณแอนะล็อกแบบ DAC ค่าต่างๆ ออกทางขา GPIO25 จากนั้นใช้มัลติมิเตอร์วัดความต่างศักย์ที่ได้

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         ประกาศตัวแปร pin ชนิด Byte ที่เป็นค่าคงที่ ให้มีค่าเท่ากับ 25
บรรทัดที่ 2         สร้างฟังก์ชัน setup()
บรรทัดที่ 3         เปิดฟังก์ชัน setup()
บรรทัดที่ 4         ปิดฟังก์ชัน setup()
บรรทัดที่ 5         สร้างฟังก์ชัน loop()
บรรทัดที่ 6         เปิดฟังก์ชัน loop()
บรรทัดที่ 7         ฟังก์ชันวนรอบการทำงาน โดยประกาศตัวแปร i ให้มีค่าเท่ากับ 0, วนรอบการทำงานจนกว่าค่าในตัวแปร i จะมีค่าน้อยกว่าหรือเท่ากับเกิน 255, เพิ่มค่าในตัวแปร i ขึ้นทีละ 63
บรรทัดที่ 8         สั่งให้สัญญาณแอนะล็อกแบบ DAC ออกทางขา GPIO25
บรรทัดที่ 9         หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 10        ปิดฟังชันวนรอบการทำงาน
บรรทัดที่ 11        ปิดฟังก์ชัน loop()

ผลการทดลอง 

        เมื่อบอร์ด ESPino32 เริ่มทำงาน เมื่อเข้าสู่โปรแกรมหลักโปรแกรมจะวนรอบการทำงานโดยสั่งงานให้สัญญาณแอนะล็อกแบบ DAC ให้มีค่า 0, 63, 126, 189, 252 ตามลำดับ และหากวัดด้วยมัลติมิเตอร์จะเห็นได้ว่าค่าความต่างศักย์ของขา GPIO04 จะมีค่า 0.113, 0.859, 1.599, 2.375, 3.11 ตามลำดับ ทำให้ระดับความสว่างของ LED สว่างแตกต่างกันไป ดังรูป ผลลัพธ์ของสัญญาณ DAC เมื่อวัดค่าความต่างศักย์ด้วยมัลติมิเตอร์

ผลลัพธ์ของสัญญาณ DAC เมื่อวัดค่าความต่างศักย์ด้วยมัลติมิเตอร์

การเปรียบเทียบค่าสัญญาณแอนะล็อกแบบ DAC เป็นค่าความต่างศักย์สามารถทำได้โดยใช้สูตร

        สำหรับบทความ ESPino32 ในตอนที่ 6 การใช้งาน Analog Output เป็นพื้นฐานส่วนหนึ่งของการติดต่อระหว่างไมโครคอนโทรเลอร์กับอุปกรณ์ภายนอก หวังว่าผู้ใช้งานจะสามารถเข้าใจพื้นฐานของการใช้งาน Analog Output เพื่อเป็นพื้นฐานสำหรับประยุกต์ใช้กับอุปกรณ์อื่นๆ เช่น นำไปใช้ควบคุมความสว่างของ LED ควบคุมความสว่างของหลอดไฟ ควบคุมความเร็วของมอเตอร์กระแสตรง เป็นต้น

ขอขอบคุณข้อมูลอ้างอิงจาก

– https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/

หมายเหตุ เนื้อหาบางส่วนของการใช้งานฟังก์ชันที่เกี่ยวกับการใช้งาน PWM, DAC, SigmaDelta กำลังอยู่ในช่วงพัฒนาที่ยังไม่สมบูรณ์ ค่าเอาต์พุตค่าสัญญาณแอนะล็อกที่ได้อาจมีการผิดพลาดจากความเป็นจริง จึงอาจมีการเปลี่ยนแปลงเนื้อหาได้ในภายหลัง หากต้องการ DAC ที่มีความละเอียดที่ถูกต้องแนะนำใช้โมดูล DAC เพิ่มเติม เช่น  MCP4922 DAC MODULE เป็นต้น

สารบัญ บทความ ESPino32