อุปกรณ์พกพาต่าง ๆ ที่จำเป็นต้องใช้แบตเตอรี่เป็นแหล่งพลังงาน จำเป็นที่จะต้องมีการควบคุมการใช้กระแสไฟฟ้าอย่างเคร่งครัด เพราะการใช้กระแสไฟฟ้าที่น้อยลง ส่งผลให้อุปกรณ์สามารถทำงานได้นานขึ้น ลดขนาดแบตเตอรี่ลงได้ และส่งผลให้ต้นทุนค่าแบตเตอรี่ต่ำลง
ไมโครคอนโทรลเลอร์สมัยใหม่มักมีโหมดประหยัดพลังงานมาให้แตกต่างกันไปตามแต่ละผู้ผลิตออกแบบ สำหรับ STM32F103x มีโหมดประหยัดพลังงานมาให้ถึง 3 โหมด คือ 1) Sleep Mode 2) Stop Mode และ 3) Standby Mode แต่ละโหมดแตกต่างกันอย่างไร การเข้าโหมดประหยัดพลังงานต้องทำอย่างไร และผลการทดสอบการใช้พลังงานแต่ละโหมดเป็นอย่างไร เป็นเรื่องที่ติดตามได้จากบทความนี้
สนับสนุนบทความดี ๆ แบบนี้ได้ โดยเลือกสั่งซื้อสินค้ากับเรา |
|
STM32F103C8T6 Blue Pill ARM STM32 Minimum System Development Board Module ราคา 139.00 บาท |
ST-Link V2 Mini STM8 STM32 Simulator Download Programmer ราคา 144.00 บาท |
STM8S103F3P6 STM8S STM8 development board ราคา 86.00 บาท |
STM8S105K4T6 Development Board ราคา 123.00 บาท |
STM32F030F4P6 Development Board ARM Cortex-M0 ราคา 107.00 บาท |
|
หมายเหตุ. บทความนี้เรียบเรียงจากเอกสาร STM32F101xx, STM32F102xx and STM32F103xx low-power modes และ STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx Reference manual ข้อความบางส่วนในบทความนี้เกิดจากการแปลเอกสารดังกล่าว
หมายเหตุ 2. บอร์ดที่ใช้ทดสอบโค้ดในบทความนี้คือ STM32F103C8T6 Blue Pill
โหมดการทำงานของ STM32F103x ที่อยู่ในสภาวะปกติ เรียกว่า Run Mode เมื่อต้องการลดการใช้พลังงานลงโดยหยุดการทำงานของซีพียูภายในไมโครคอนโทรลเลอร์และปิดวงจรส่วนต่าง ๆ จะเรียกว่าการเข้าสู่โหมดใช้พลังงานต่ำ (Low-Power Mode) (ต่อไปนี้เรียกโหมดใช้พลังงานต่ำ ว่า โหมดประหยัดพลังงาน) โหมดประหยัดพลังงานมีโหมดย่อย ๆ อยู่ 3 โหมด คือ 1) Sleep Mode 2) Stop Mode และ 3) Standby Mode แต่ละโหมดจะปิดการทำงานของซีพียูเหมือนกัน แต่จะมีการปิดวงจรย่อย ๆ ภายในไมโครคอนโทรลเลอร์ที่แตกต่างกัน ขึ้นอยู่กับแต่ละงานว่าวงจรใดควรเปิดไว้ หรือควรปิดทิ้งไป
โหมดประหยัดพลังงานทั้ง 3 โหมด แตกต่างกันดังนี้
โหมดประหยัดพลังงาน | ผลกระทบที่เกิดขึ้นภายในไมโครคอนโทรลเลอร์ |
---|---|
1.Sleep Mode |
|
2.Stop Mode |
|
3.Standby Mode |
|
การเข้าสู่โหมดประหยัดพลังงานทั้ง 3 โหมด เกี่ยวข้องการกับตั้งค่ารีจิสเตอร์ และการใช้คำสั่ง WFI (Wait for Interrupt) หรือ WFE (Wait for Event) ซึ่งแต่ละแพลตฟอร์มที่ใช้ในการพัฒนา จะมีขั้นตอนการตั้งค่ารีจิสเตอร์และการเข้าถึงคำสั่ง WFI หรือ WFE ที่แตกต่างกัน ในบทความนี้จะยกตัวอย่างการพัฒนาด้วยแพลตฟอร์ม Arduino โดยใช้ Arduino STM32 by Roger Clark (หากยังไม่เคยใช้งาน Arduino STM32 by Roger Clark ให้อ่านขั้นตอนการติดตั้งและใช้งานเบื้องต้นได้ที่บทความ การใช้งาน STM32 ร่วมกับ Arduino เบื้องต้น)
การเข้าสู่ Sleep Mode - สามารถทำได้โดย
การออกจาก Sleep Mode - สามารถทำได้โดยกดปุ่ม Reset บนบอร์ด STM32 (โปรแกรมจะเริ่มทำงานใหม่ทั้งหมด) หรือเปิดใช้อินเตอร์รัพท์ (ได้ทั้งภายนอกและภายใน) โดยเมื่อเกิดอินเตอร์รัพท์ขึ้น STM32 จะเริ่มทำงานต่อจากเดิม
เนื่องจากการออกจาก Sleep Mode เกิดขึ้นจากการอินเตอร์รัพท์ เมื่อนำมาใช้งานกับแพลตฟอร์ม Arduino จึงมองไม่เห็นผลลัพธ์ที่ชัดเจนนัก เนื่องจากแพลตฟอร์ม Arduino เปิดใช้งานอินเตอร์รัพท์จาก Timer 1 เพื่อนับเวลาที่ใช้ในฟังก์ชัน millis() ดังนั้นจึงเกิดอินเตอร์รัพท์ขึ้นจาก Timer 1 ตลอดเวลา ส่งผลให้เมื่อเข้าสู่ Sleep Mode แล้วตัว Timer 1 ที่สร้างอินเตอร์รัพท์อยู่ตลอดเวลา จะไปทำให้ออกจาก Sleep Mode อย่างรวดเร็ว ด้วยเหตุผลดังกล่าว การใช้งาน Sleep Mode ในแพลตฟอร์ม Arduino จึงเป็นไปได้ยาก
โค้ดโปรแกรมฟังก์ชัน goSleep() ที่ใช้เข้าสู่ Sleep Mode แสดงดังด้านล่าง
การเข้าสู่ Stop Mode - สามารถทำได้โดย
การออกจาก Stop Mode - สามารถทำได้โดยกดปุ่ม Reset บนบอร์ด STM32 (โปรแกรมจะเริ่มทำงานใหม่ทั้งหมด) หรือเปิดใช้อินเตอร์รัพท์ (ได้ทั้งภายนอกและภายใน) โดยเมื่อเกิดอินเตอร์รัพท์ขึ้น STM32 จะเริ่มทำงานต่อจากเดิม
เนื่องจาก Stop Mode ใช้การตัดไฟเลี้ยงวงจรสร้างสัญญาณนาฬิกา ทำให้เมื่อออกจาก Stop Mode วงจรสร้างสัญญาณนาฬิกาจะกลับมาทำงานอีกครั้ง โดยสร้างสัญญาณนาฬิกาออกมาเพียง 8 MHz (ตามค่าเริ่มต้น) ทำให้ฟังก์ชันที่เกี่ยวกับเวลา เช่น delay millis ทำงานผิดเพียน การปัญหา คือต้องเรียกใช้ฟังก์ชันตั้งค่าวงจรสร้างสัญญาณใหม่อีกครั้ง
โค้ดโปรแกรมฟังก์ชัน goStop() ที่ใช้เข้าสู่ Stop Mode แสดงดังด้านล่าง
การเข้าสู่ Standby Mode - สามารถทำได้โดย
การออกจาก Standby Mode - สามารถทำได้โดยกดปุ่ม Reset บนบอร์ด STM32 หรือเปิดใช้งานขา WKUP (อยู่ที่ขา PA0) หรือเปิดใช้ RTC alarm หรือเปิดใช้ IWDG Reset การออกจาก Standby Mode ไม่ว่าจะด้วยวิธีใดก็ตาม โปรแกรมจะเริ่มทำงานใหม่ทั้งหมด
โค้ดโปรแกรมฟังก์ชัน goStandby() ที่ใช้เข้าสู่ Stop Mode แสดงดังด้านล่าง
จากหัวข้อ การเข้าสู่โหมดประหยัดพลังงาน ทำให้ได้ทราบว่า โหมดประหยัดพลังงานที่ใช้งานได้มีอยู่ 2 โหมด คือ 1) Stop Mode และ 2) Standby Mode โดยทั้ง 2 โหมด สามารถ Wakeup ได้ดังนี้
คือการเข้าสู่โหมดประหยัดพลังงาน และออกจากโหมดประหยัดพลังงานอัตโนมัติ เมื่อถึงเวลาที่กำหนดไว้ โดยการตั้งเวลาให้ออกจากโหมดประหยัดพลังงานสามารถทำได้โดยใช้ RTC alarm ใน Arduino STM32 by Roger Clark มีคำสั่งที่ใช้งานเกี่ยวกับ RTC อยู่แล้ว การทำ Wakeup ด้วยเวลา จึงทำได้ง่าย เพียงใช้คำสั่ง rt.createAlarm() เท่านั้น
โค้ดโปรแกรมตัวอย่าง Wakeup ด้วย RTC alarm ด้วยฟังก์ชัน wakeupByTime()
คือการออกจากโหมดประหยัดพลังงานด้วยสัญญาณทางไฟฟ้าที่เข้ามาที่ขาใด ๆ ก็ตามของไมโครคอนโทรลเลอร์ ตามที่ได้ตั้งไว้
กรณี Stop Mode สามารถตั้งขาที่ใช้ Wakeup ได้โดยเปิดใช้อินเตอร์รัพท์ภายนอกจากขาที่ต้องการ โดยใช้คำสั่ง attachInterrupt() โค้ดโปรแกรมตัวอย่างด้านล่างตั้งให้ขา PB11 เป็นขา Wakeup
กรณี Standby Mode สามารถตั้งให้ขาที่ใช้ Wakeup เป็นขา WKUP (อยู่ที่ขา PA0) ได้เท่านั้น โดยหากเปิดใช้งานขา WKUP แล้ว จะ Wakeup เมื่อขาดังกล่าวได้รับสัญญาณลอจิก 1 โค้ดโปรแกรมตัวอย่างด้านล่างแก้ไขฟังก์ชัน goStandby() ให้เปิดใช้งาน Wakeup ที่ขา WKUP ด้วย
ผู้เขียนเชื่อว่าผู้อ่านหลาย ๆ ท่านอาจจะกำลัง งง สับสน กับข้อความในบทความนี้ เนื่องจากบทความนี้เข้าไปยุ่งเกี่ยวกับเรื่องรีจิสเตอร์ และวงจรส่วนต่าง ๆ ที่ผู้ใช้แพลตฟอร์ม Arduino ไม่คุ้นเคย และอาจจะทำให้ส่วนใหญ่ของบทความนี้ ผู้อ่าน อ่านแล้ว ไม่เข้าใจ เพื่อให้ผู้ใช้งานแพลตฟอร์ม Arduino สามารถใช้งานโหมดประหยัดพลังงานของ STM32 ได้ง่ายขึ้น และไม่ต้องมีความรู้ด้านเทคนิคเกี่ยวกับ STM32 มากนัก ผู้เขียนจึงจัดทำไลบรารี่ STM32byRogerLowPower ขึ้นมา
การพัฒนาไลบรารี่ STM32byRogerLowPower อ้างอิงมาตรฐานจากไลบรารี่ Low Power ที่ Arduino ได้พัฒนาขึ้น โดยไลบรารี่ Low Power ที่พัฒนาด้วย Arduino แบ่งโหมดประหยัดพลังงานเป็น 3 โหมด ดังนี้
ไลบรารี่ STM32byRogerLowPower มีคำสั่งให้ใช้งานดังนี้
ใช้เข้าสู่ Idle Mode และกำหนดให้ WakeUp ด้วยเวลา
รูปแบบคำสั่ง
พารามิเตอร์
ค่าที่ส่งกลับ
ไม่มี (void)
ใช้เข้าสู่ Sleep Mode และกำหนดให้ WakeUp ด้วยเวลา
รูปแบบคำสั่ง
พารามิเตอร์
ค่าที่ส่งกลับ
ไม่มี (void)
ใช้เข้าสู่ Deep Sleep Mode และกำหนดให้ WakeUp ด้วยเวลา
รูปแบบคำสั่ง
พารามิเตอร์
ค่าที่ส่งกลับ
ไม่มี (void)
ใช้เข้าสู่ Low-power Mode และกำหนดให้ WakeUp ด้วยสัญญาณจากภายนอก
รูปแบบคำสั่ง
พารามิเตอร์
ค่าที่ส่งกลับ
ไม่มี (void)
หมายเหตุ. กรณีพารามิเตอร์ LowPowerMode เลือกเป็น DEEPSLEEP_MODE ขาที่ใช้ Wakeup จะเป็น PA0-WKUP ที่โหมด RISING โดยอัตโนมัติ
โปรแกรมตัวอย่างที่ 1 ทำไฟกระพริบ ทุก ๆ 1 วินาที แต่แทนที่จะใช้คำสั่ง delay(); เปลี่ยนมาใช้คำสั่ง LowPower.sleep(); แทน
โปรแกรมตัวอย่างที่ 2 ให้ไฟกระพริบจำนวน 10 ครั้ง แล้วเข้าโหมดประหยัดพลังงาน และจะออกจากโหมดประหยัดพลังงานเมื่อกดปุ่ม Reset บนบอร์ด
การทดสอบใช้อุปกรณ์ดังนี้
ในการทดสอบ ใช้ไฟจากเพาเวอร์ซัพพลายต่อผ่านดิจิตอลมัลติมิเตอร์เพื่อวัดกระแสไฟฟ้าที่ใช้ไปเข้าบอร์ด STM32F103C8T6 Blue Pill
อัพโหลดโปรแกรมทดสอบดังนี้
โดยโปรแกรมทดสอบบรรทัดที่ 26 เปลี่ยนไปใช้คำสั่ง LowPower.idle(); LowPower.sleep(); LowPower.deepSleep(); เพื่อทดสอบการใช้พลังงานในโหมดประหยัดพลังงาน Sleep Mode Stop Mode และ Standby Mode ตามลำดับ
ผลการทดสอบ แสดงดังตารางด้านล่างนี้
Mode | แรงดันที่ป้อน | กระแสที่ใช้ | คิดเป็นกำลังไฟฟ้า |
---|---|---|---|
Run Mode | 3.25V | 40mA | 130mW |
Sleep Mode | 3.31V | 20.70mA | 68.52mW |
Stop Mode | 3.31V | 2.95mA | 9.76mW |
Standby Mode | 3.32V | 0.00mA(1) | 0W(1) |
หมายเหตุ. (1) กระแสไฟฟ้าที่ใช้น้อยเกินกว่าที่มัลติมิเตอร์จะวัดได้ ทำให้วัดได้ 0mA และเมื่อคิดเป็นกำลังไฟฟ้า จึงได้ 0W ไปด้วย
STM32F103x มีโหมดประหยัดพลังงาน 3 โหมด คือ Sleep Stop และ Standby หากต้องการเปิดใช้โหมดประหยัดพลังงานแล้วโปรแกรมทำงานต่อจากเดิม ให้ใช้ Stop Mode หากต้องการให้โปรแกรมเริ่มทำงานใหม่ทั้งหมด ให้ใช้ Standby Mode โดยโหมดที่ใช้ไฟน้อยที่สุดคือโหมด Standby และหากต้องการเขียนโปรแกรมให้ STM32 เข้าโหมดประหยัดพลังงาน ให้ใช้ไลบรารี่ STM32byRogerLowPower