Atmega328P Datasheet 14. PM - Power Management and Sleep Modes

Started by tha, November 01, 2017, 11:51:44 AM

Previous topic - Next topic

tha

14.9. Extended Standby Mode
เมื่อ the SM[2:0] bits ถูกเขียนเป็น '111' และ an external crystal/resonator clock option ถูกเลือก, คำสั่ง the SLEEP instruction ทำให้ the MCU เข้าสู่ Extended Standby mode. โหมดนี้ก็เหมือนกันกับ Power-Save mode โดยมีข้อยกเว้นที่ให้ the Oscillator รันต่อไป จาก Extended Standby mode, the device จะ wakes up ใน 6 clock cycles.

ไม่ยกตัวอย่างนะ พิมพ์ได้คล่องแล้ว ค่อยยังชั่วหน่อย  :)

tha

14.10. Power Reduction Register
The Power Reduction Register (PRR) จัดให้มีวิธีหยุด the clock ของแต่ละ individual peripherals เพื่อลด power consumption. สถานะปัจจุบันของ the peripheral ถูกแช่แข็งและ the I/O registers ไม่สามารถถูกอ่านและเขียนได้. ทรัพยากรถูกใช้โดย the peripheral เมื่อหยุด the clock ก็ยังคงถือครองอยู่, ดังนั้น the peripheral โดยมากแล้วควรที่จะถูกปิดการใช้งานก่อนที่จะหยุด the clock. การ Waking up a module, ซึ่งทำโดยการเคลียร์ the corresponding bit ใน the PRR รีสจีสเตอร์, ผลัก the module ไปอยู่ในสถานะเดียวกันกับก่อนที่จะ shutdown.

Module shutdown สามารถถูกใช้ใน Idle mode และ Active mode เพื่อลด the overall power consumption. ใน sleep modes อื่นๆทั้งหมด, the clock ถูกหยุดอยู่แล้ว.

(ดูที่รีสจีสเตอร์ PRR ท้ายบทว่า บิทไหนหยุดอะไรบ้าง จะยังไม่ยกตัวอย่างเพราะ peripheral อย่าง spi, i2c, uart ยังไปไม่ถึงเลย ลืมไปหมดแล้ว)  :o

tha

14.11. Minimizing Power Consumption(ลดการสิ้นเปลืองพลังงาน)
มีความเป็นไปได้หลายอย่างที่จะต้องพิจารณาเมื่อพยายามลดการใช้พลังงานลงใน an AVR controlled system. โดยทั่วไป, sleep modes ควรถูกใช้ให้มากที่สุดเท่าที่จะเป็นไปได้และ the sleep mode ควรถูกเลือกเพื่อให้ฟังก์ชั่นของอุปกรณ์ทำงานให้น้อยที่สุดเท่าที่จะเป็นไปได้. โดยเฉพาะอย่างยิ่งโมดูลต่อไปนี้อาจต้องได้รับการพิจารณาเป็นพิเศษเมื่อพยายามทำให้การใช้พลังงานต่ำสุด  ฟังก์ชันทั้งหมดที่ไม่จำเป็น ต้องปิดใช้งาน โดยเฉพาะอย่างยิ่งโมดูลต่อไปนี้อาจต้องได้รับการพิจารณาเป็นพิเศษเมื่อพยายามทำให้การใช้พลังงานต่ำสุด

14.11.1. Analog to Digital Converter
หากเปิดใช้งาน ADC จะถูกเปิดใช้งานใน sleep modes ทั้งหมด เพื่อเป็นการประหยัดพลังงานควรปิดใช้งาน ADC ก่อนเข้าโหมด sleep ใด ๆ เมื่อ ADC ถูกปิดและเปิดใหม่อีกครั้งการแปลงครั้งต่อไปจะเป็นการแปลงแบบ an extended conversion.

14.11.2. Analog Comparator[/size]
เมื่อเข้าสู่ Idle mode, the Analog Comparator ควรถูกปิดการใช้งานถ้าไม่ได้ใช้. เมื่อเข้าสู่ ADC Noise Reduction mode, the Analog Comparator ควรถูกปิดการใช้งาน. ใน sleep modes อื่น, the Analog Comparator จะถูกปิดการใช้งานโดยอัตโนมัติ อย่างไรก็ตาม, ถ้า the Analog Comparator ถูกตั้งค่าโดยใช้ the Internal Voltage Reference เป็นอินพุท, the Analog Comparator ควรถูกปิดการใช้งานในทุกๆ sleep modes. มิฉะนั้น, the Internal Voltage Reference จะถูกเปิดใช้งาน โดยไม่ขึ้นอยู่กับ sleep mode.


tha

14.11.3. Brown-Out Detector (ตรวจจับแรงดัน)
หาก the Brown-Out Detector (BOD) ไม่ถูกต้องการโดย the application, โมดูลนี้ควรถูกปิด. หาก the BOD ถูกเปิดใช้งานโดย the BODLEVEL Fuses, มันจะถูกเปิดใช้งานในทุก sleep modes, และดังนั้น, มันจะกินพลังงานเสมอ. ใน the deeper sleep modes, นี้จะมีส่วนอย่างมีนัยสำคัญกับ the total current consumption.

14.11.4. Internal Voltage Reference
The Internal Voltage Reference จะถูกเปิดใช้งานเมื่อถูกต้องการโดย the Brown-Out Detection, the Analog Comparator หรือ the Analog-to-Digital Converter. ถ้าโมดูลเหล่านี้ถูกปิดการใช้งานดังอธิบายในส่วนข้างบนนี้, the internal voltage reference จะถูกปิดการใช้งานและมันจะไม่กินพลังงาน. เมื่อเปิดอีกครั้ง, ผู้ใช้ต้องยอมให้ the reference นี้ start up ก่อนที่ the output จะถูกใช้. หาก the reference นี้ถูก on อยู่ใน sleep mode, the output สามารถถูกใช้ได้โดยทันที.

14.11.5. Watchdog Timer
หาก the Watchdog Timer ไม่ถูกต้องการใน the application(โปรแกรมนี้), the module นี้ควรถูก turned off. หาก the Watchdog Timer ถูกเปิดการใช้งาน, มันจะถูกเปิดใช้งานในทุก sleep modes และดังนั้นมันจะกินพลังงานเสมอ. ใน the deeper(ลึกๆนานๆ) sleep modes, นี้จะมีส่วนอย่างมีนัยสำคัญกับ the total current consumption.

tha

14.11.6. Port Pins
เมื่อเข้าสู่ a sleep mode, all port pins ควรถูกกำหนดให้ใช้พลังงานต่ำสุด. สำคัญที่สุดนั้นคือเพื่อให้แน่ใจว่าไม่มี pins ไหนขับ resistive loads. ใน sleep modes ที่ทั้ง the I/O clock(clkI/O) และ the ADC clock (clkADC) ถูกหยุด, the input buffers ของ the device จะถูก disabled.  นี้เพื่อให้แน่ใจว่าไม่มีการใช้พลังงานโดย the input logic เมื่อไม่ต้องการ. ในบางกรณี, the input logic ถูกต้องการสำหรับการตรวจจับ wake-up conditions, และมันจะต้องถูก enabled. ดูที่ส่วน Digital Input Enable and Sleep Modes สำหรับรายละเอียดเกี่ยวกับ pins ถูก enabled. ถ้า the input buffer ถูก enabled และ the input signal ถูกปล่อยลอยหรือมีระดับสัญญาณอนาล็อกใกล้กับ VCC/2, the input buffer จะใช้พลังงานมากเกินไป.

สำหรับ analog input pins, the digital input buffer ควรถูก disabled ทุกครั้ง. An analog signal level ใกล้กับ VCC/2 บน an input pin อาจทำให้เกิดคู่ของกระแสได้อย่างมีนัยสำคัญใน active mode. Digital input buffers สามารถถูก disabled โดยการเขียนถึง the Digital Input Disable Registers (DIDR0 for ADC, DIDR1 for AC).

14.11.7. On-chip Debug System
ถ้า the On-chip debug system ถูก enabled โดย the Fuse และ the chip เข้าสู่ sleep mode, the main clock source ถูก enabled และดังนั้นจะกินพลังงานเสมอ.  ใน the deeper(ลึกๆนานๆ) sleep modes, นี้จะมีส่วนอย่างมีนัยสำคัญกับ the total current consumption.

ปล. เป็นเหมือนตูนเลย มองคอมนานๆชักแย่ ตาขวาเริ่มพร่ามัว ไปตรวจที่รพ.คลองขลุง หมอบอกมันเป็นไปตามอายุ แล้วทำเรื่องส่งต่อไปรพ.กำแพงเพชร(ยังไม่ได้ไป) ไม่รู้จะยังไง แต่ก็พอไหวอยู่ ตาเดียวก็เริ่มจะชินแล้ว  ;)

tha

14.12. Register Description

14.12.1. Sleep Mode Control Register
The Sleep Mode Control Register บรรจุ control bits สำหรับ power management.
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลงไป 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.



Bit 3 – SM2: Sleep Mode Select 2
The SM[2:0] bits เลือกในระหว่าง 5 sleep mode ที่มีให้ใช้ประโยชน์ (the five available sleep modes)



Note:
1. Standby mode แนะนำให้สำหรับใช้กับ external crystals หรือ resonators เพียงเท่านั้น.

Bit 2 – SM1: Sleep Mode Select 1
ดูที่ SM2.
Bit 1 – SM0: Sleep Mode Select 0
ดูที่ SM2.

Bit 0 – SE: Sleep Enable
The SE bit ต้องถูกเขียนด้วย 1 (logic one) เพื่อทำให้ the MCU เข้าสู่ the sleep mode เมื่อคำสั่ง SLEEP ถูก executed(ปฏิบัติ). เพื่อหลีกเลี่ยง the MCU เข้าสู่ the sleep mode เว้นแต่ว่ามันเป็นความมุ่งหมายของโปรแกรมเมอร์, แนะนำให้เขียน the Sleep Enable (SE) bit เป็น "1" เพียงแค่ก่อนการปฏิบัติคำสั่ง SLEEP และเคลียร์มันโดยทันทีหลังจาก waking up

ตัวอย่างยกกันไปก่อนแล้วนะท่านๆ มีอะไรก็บอกมานะ  ;D

tha

14.12.2. MCU Control Register
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลงไป 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.



Bit 6 – BODS: BOD Sleep
The BODS bit ต้องถูกเขียนเป็น '1' เพื่อที่จะ turn off BOD ในระหว่าง sleep. การเขียนถึง the BODS bit ถูกควบคุมโดย a timed sequence และ the enable bit BODSE. เพื่อ disable BOD ใน relevant(ซึ่งสัมพันธ์กัน) sleep modes, ทั้ง BODS และ BODSE ต้องถูกเขียนเป็น '1'ก่อน. จากนั้น, BODS ต้องถูกเขียนเป็น '1' และ BODSE ต้องถูกขียนเป็น "0" ภายใน 4 clock cycles

The BODS bit จะ active อยู่ three clock cycles หลังจากที่มันเซท. A sleep instruction ต้องถูก executed ขณะที่ BODS แอคทีฟอยู่เพื่อที่จะ turn off the BOD สำหรับ the actual sleep mode. The BODS bit ถูกเคลียร์โดยอัตโนมัติหลังจาก three clock cycles
Note: BOD disable มีให้ใช้ใน ATmega328P เท่านั้น

Bit 5 – BODSE: BOD Sleep Enable
BODSE เปิดใช้งานการเซทของ BODS control bit, ตามที่อธิบายในคำอธิบายบิตของ BODS. BOD disable ถูกควบคุมโดย a timed sequence.
Note: BOD disable มีให้ใช้ใน ATmega328P เท่านั้น

ป.ล. BOD disable ปิด brown-out detector เพื่อลดกระแส และไม่ให้มัน BOD Reset เวลาเข้าสู่ sleep mode อันนี้ไม่ยาก ลองเสริจกูเกิ้ล "avr bod sleep" พอจะมีตัวอย่างอยู่ ดูที่ดาต้าชีทบท Reset ด้วย ก้จะเข้าใจ brown-out detector มากขึ้น ดูที่เราตั้งค่า fuse bit ไว้ด้วยว่าเราตั้ง BOD ไว้กี่โวลท์ ถ้ามี power supply ที่ปรับค่าได้ ก็จะได้ทดลองปรับดูให้ power supply ของ mcu ต่ำกว่า Vbod ที่เราตั้งใน fuse bit ไว้ว่าจะมีผลเป็นอย่างไรในแบบต่างๆ ตอนนี้ผมขอเวลาศึกษาทำความเข้าใจกับมันก่อนครับ  >:(
ไล่เช็ค library ในนี้ด้วย C:\WinAVR-20100110\avr\include\avr

tha

ลองทำโดยใช้ library ดู ตามนี้ ทำ bod disable ก่อนเข้า sleep mode
http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html
เขาบอกว่าใช้ library ทำตามนี้แล้ว timed sequence มันได้
ส่วนรายละเอียดของ library ว่าบิทไหนเป็นบิทไหน ก็ไล่เช็คเอาที่ sleep.h
ส่วน cli();, sei(); ก็อยู่ใน interrupt.h
ลองเปรียบเทียบดูระหว่างที่มี BOD disable กับเอา BOD disable ออก ว่ามันกินกระแสต่างกันหรือเปล่า อันนี้มันเหมาะกับที่เราใช้ถ่านจ่ายให้ mcu แล้วต้องการประหยัดไฟ
ถ้าเซทเป็นบิทเอาก็ทำตามนี้ http://www.avrfreaks.net/forum/turn-bod-during-sleep-atmega324p

http://www.mediafire.com/file/ji8zwxk4dy487bc/sleep_bod1.rar