讓 LED 閃爍無(wú)疑是任何新興電子專家要解決的首批問(wèn)題之一,無(wú)論是使用古老的 NE555 還是最近的微控制器來(lái)控制 LED。事實(shí)證明,我們可以通過(guò)改變約束條件將任何微不足道的問(wèn)題變成更困難的問(wèn)題。
那么,讓 LED 盡可能長(zhǎng)時(shí)間地閃爍的挑戰(zhàn)又如何呢?當(dāng)然,這也不是一個(gè)新的問(wèn)題。我過(guò)去遇到過(guò)兩種有趣的方法:1) Burkhard Kainkas Ewiger Blinker(“永恒的閃爍”)和 2) Ted Yapos TritiLED。
B. Kainkas 項(xiàng)目是一個(gè)由分立晶體管制成的 LED 閃光器電路,消耗約 50µA 電流,可使用一節(jié) AA 電池運(yùn)行數(shù)年。Ted Yapo 將標(biāo)準(zhǔn)提高了一點(diǎn),并詳細(xì)研究了如何讓 LED 在非常低的強(qiáng)度下使用 CR2032 紐扣電池發(fā)光數(shù)年。他的項(xiàng)目日志絕對(duì)值得一讀。一個(gè)非常有趣的細(xì)節(jié)是,他得出結(jié)論,使用低功耗微控制器來(lái)控制 LED 實(shí)際上是最有效的選擇。這可能有點(diǎn)違反直覺(jué),但在查看他構(gòu)建離散版本的嘗試時(shí),這一點(diǎn)似乎更加明顯。
許多微控制器提供高度優(yōu)化的低功耗睡眠模式,可用于在閃爍之間等待。微控制器僅在 LED 需要閃爍時(shí)才會(huì)激活。此時(shí),微控制器的有效功耗是多少并不重要,因?yàn)?LED 需要幾毫安的電流才能發(fā)出足夠水平的光。
進(jìn)入臭名昭著的“3 美分” Padauk 微控制器系列,我之前在幾個(gè)項(xiàng)目中使用過(guò)它。令我驚訝的是,這些設(shè)備提供了非常有競(jìng)爭(zhēng)力的低功耗睡眠模式,似乎與價(jià)格高出十倍的幾個(gè)“低功耗” 8 位微控制器不相上下。我研究了如何在 PFS154 上實(shí)現(xiàn)超低功耗 LED 閃光燈。
實(shí)施
降低 MCU 功耗的第一步是使用低速振蕩器作為時(shí)鐘源。在 PFS154 中,這被稱為“ILRC”,根據(jù)電源電壓提供大約 52 kHz 的時(shí)鐘。我發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象是,第一步必須同時(shí)激活高速和低速振蕩器,第二步只禁用高速振蕩器。直接切換到 ILRC 會(huì)暫停 MCU。下面的代碼示例基于 free-pdk 包含的內(nèi)容。
/* Activate low frequency oscillator as main clock. */
CLKMD = CLKMD_ILRC | CLKMD_ENABLE_ILRC | CLKMD_ENABLE_IHRC;
CLKMD = CLKMD_ILRC | CLKMD_ENABLE_ILRC ;
// Note: it is important to turn off IHRC only after clock
// settings have been updated. Otherwise the CPU stalls.
以如此低的時(shí)鐘頻率運(yùn)行 PFS154 已經(jīng)可以將功耗降低到遠(yuǎn)低于 100 µA。并非所有這些都是隨時(shí)鐘頻率變化的動(dòng)態(tài)功耗,因此唯一能進(jìn)一步降低功耗的方法是激活其中一種睡眠模式。
睡眠模式
PFS154 支持兩種睡眠模式:“STOPSYS”和“STOPEXE”。
STOPSYS 完全停止內(nèi)核和所有振蕩器。從此狀態(tài)喚醒的唯一方法是通過(guò)引腳更改。
STOPEXE 停止內(nèi)核,但低頻振蕩器保持活動(dòng)狀態(tài),可用于為定時(shí)器計(jì)時(shí)。內(nèi)核可以通過(guò)引腳更改或定時(shí)器事件喚醒。看起來(lái),盡管數(shù)據(jù)表中沒(méi)有明確說(shuō)明,但 8 位定時(shí)器和 16 位定時(shí)器都可以生成喚醒事件。請(qǐng)注意,看門狗定時(shí)器在 STOPEXE 期間也會(huì)停止。這與其他微控制器上的行為形成對(duì)比。
第一步,我使用萬(wàn)用表驗(yàn)證了睡眠模式下的電流消耗與電源電壓的關(guān)系,如上所示。我基本上能夠重現(xiàn)數(shù)據(jù)表中的曲線,這證實(shí)了數(shù)據(jù)表是正確的,而且我的手持式萬(wàn)用表實(shí)際上能夠準(zhǔn)確測(cè)量低至幾百納安的電流!老實(shí)說(shuō),這不是我所期望的。
在此期間,我發(fā)現(xiàn)了 PFS154 的一個(gè)奇怪行為。重置后,引腳更改喚醒始終默認(rèn)啟用。看來(lái)引腳上的非常小的變化可以產(chǎn)生喚醒。如果它們懸空,只需觸摸引腳即可喚醒核心。有趣的是,這甚至適用于未布線到封裝外部的引腳,這些引腳仍作為芯片上的焊盤存在。通過(guò)觸摸 IC 的表面,可以生成喚醒事件!因此,除非您有興趣構(gòu)建一個(gè) hacky 觸摸傳感器,否則建議禁用所有引腳作為喚醒源。
定時(shí)器喚醒的實(shí)現(xiàn)
因?yàn)槲蚁霕?gòu)建一個(gè) LED 閃光器,所以我使用 Timer2 以大約 1.6Hz 的頻率生成喚醒事件。您可以在下面看到 STOPEXE 配置和定時(shí)器初始化的完整代碼。
/* Configure STOPEXE mode and set up Timer 2 as wake up source */
PADIER = 0;
// disable pins as wakeup source
PBDIER = 0;
// Also port B needs to be disabled even if it is
// not connected to the outside of the package.
// Touching the package can introduce glitches and wake
// up the device
INTEN = 0;
// Make sure all interrupts are disabled
INTRQ = 0;
MISC = MISC_FAST_WAKEUP_ENABLE;
// Enable faster wakeup (45 clocks instead of 3000)
// This is important to not waste energy, as 40µA bias
// is already added during wakeup time
TM2C = TM2C_CLK_ILRC | TM2C_MODE_PWM;
// Oscilator source for timer 2 is LRC (53 kHZ)
TM2CT = 0;
TM2S = TM2S_PRESCALE_DIV16 | TM2S_SCALE_DIV8;
// Divide clock by 16*7=112 -> 53 kHz / 122 = 414 Hz
TM2B = 1;
// PWM threshold set to 1.
// The PWM event will trigger the wakeup.
// Wakeup occurs with 414 Hz / 256 = 1.66 Hz
一個(gè)重要的優(yōu)化是打開“快速喚醒模式”。正常喚醒模式需要大約 3000 個(gè)時(shí)鐘周期,在此期間消耗大約 40µA 的電流。我發(fā)現(xiàn) 8 位定時(shí)器在 STOPEXE 模式下也可以用作 PWM 發(fā)生器。但是無(wú)法阻止它們喚醒 CPU,因此它們不能自主使用。
LED 閃爍代碼
剩下的唯一部分是實(shí)際閃爍 LED 的代碼。這相當(dāng)簡(jiǎn)單,如下所示。
/* Initialize LED I/O and flash the LED */
PA = 1<<4; // LED is on PA4, set all other output to zero.
PAPH = 0; // Disable all pull up resistors
PAC = 0; // Disable all outputs
// Note: There is no series resistor for the LED
// The LED current is limited LOW IO driving setting
// See Setction 4.14 (p24) in PFS154 manual
// The output is disabled when the LED is off
// to avoid leakage
for (;;) {
PAC |=1<<4;
// Enable LED output (It's set to High)
__nop();
__nop();
__nop();
PAC &=~(1<<4);
// Disable LED output after 4 cycles => 4/53 kHz = 75.5 µS
__stopexe();
}
處理器核心將在定時(shí)器 2 生成的每個(gè)事件后喚醒,打開 LED 75.5µS,然后再次讓核心進(jìn)入休眠狀態(tài)。LED 直接連接到?jīng)]有串聯(lián)電阻的輸出引腳,同時(shí)引腳配置為低 I/O 驅(qū)動(dòng)強(qiáng)度以限制最大電流。這有點(diǎn)冒險(xiǎn),但允許將 LED 降至最低電壓 - 對(duì)于我使用的綠色 LED,大約為 2.1V。
電流消耗性能
好吧,代碼運(yùn)行良好,在電壓降至略高于 2V 時(shí)以 1.6 Hz 的頻率閃爍 LED。您可以在此處找到完整的源代碼。
為了評(píng)估一切是否正常工作,我建立了一個(gè)簡(jiǎn)單的電源模型,該模型考慮了睡眠模式電流、有功電流和 LED 使用的電流。通過(guò)測(cè)量連接到微控制器的 LED 在不同電源電壓下的導(dǎo)通電流并將其乘以占空比來(lái)確定 LED 電流。對(duì) MCU 的有??功電流也采取了相同的方法。您可以在上面看到模型的輸出并與測(cè)量值進(jìn)行比較。我必須使用幾千歐姆的串聯(lián)電阻和并聯(lián)電容器來(lái)確保電流紋波足夠平滑,以便在萬(wàn)用表上獲得穩(wěn)定的讀數(shù)。
如您所見(jiàn),模型和測(cè)量值之間有很好的一致性。由于 LED 的占空比極低,主要功耗仍然是 MCU 和定時(shí)器。這一貢獻(xiàn)高度依賴于電源電壓,因此在最低電壓下實(shí)現(xiàn)最節(jié)能的操作。
3V 時(shí)的總電流消耗僅為 1 µA 左右!這小于許多電池的自放電電流。一塊容量約為 200 mAh 的 CR2023 電池理論上可以為該閃光燈供電 200000 小時(shí),即 22 年!基于充電至 5V 的 330µF 電容器的電量,我能夠操作電路(如標(biāo)題圖所示)超過(guò) 10 分鐘。
摘要
盡管成本低廉,但 Padauk MCU 可用于極低功耗操作。當(dāng)然,還有更多方法可以進(jìn)一步改進(jìn)閃光燈電路,例如使用電感升壓轉(zhuǎn)換器,以允許 LED 在更低的電壓下進(jìn)行恒流操作。