在最近評測了低于 0.10 美元的微控制器后,是時候使用 Padauk PFS154 和 PMS150C 進行一些項目了。考慮到我之前對電子和非電子蠟燭的研究,選擇這個作為最低成本微控制器的目標似乎是理所當然的。
為了簡單起見,我將硬件簡化為直接連接到 PA0 和 PA4 GPIO 的 LED。Padauk GPIO 的采購能力相當有限,范圍從 3V 時的 4 mA 到 5 V 時的 12 mA。這意味著沒有損壞直接連接到引腳而不使用電阻器的 LED 的危險。有限的驅動能力可能是由于設計人員不想在 I/O 驅動晶體管上花費太多 IC 空間。
硬件
該軟件基于對閃爍 LED IC 的模擬。我使用 PFS154 和 PMS150C 中的一個 PWM 來控制 LED 的亮度。PWM 值每秒更新 30 次,使用一種算法生成偏向最大亮度的隨機數分布。有關詳細說明,請參閱我之前的文章。
我引入了一個 IIR 低通濾波器來稍微改善視覺效果。
lowpass = lowpass - (lowpass>>1) + (newval<<7);
如果沒有低通濾波器,亮度變化看起來太突然了。我發現使用系數為 0.5 的 IIR 濾波器可以產生最佳效果(“滯后 2”)。較低的截止頻率不能很好地再現“閃爍”。您可以在下面看到使用不同 IIR 濾波器設置時亮度變化的痕跡。
PFS154 的 C 代碼可以在這里找到。 PMS150C 的匯編程序實現可以在這里找到。
三個 LED 蠟燭,分別帶有 PFS154(左)、PMS150C(中)和閃爍 LED(右)
我將這兩個版本都安裝在廉價電子蠟燭的外殼中。在上面的視頻中,您可以看到這兩個版本的實際運行情況,并將其與基于燭光閃爍 LED 的蠟燭進行比較。
與專用的燭光閃爍 LED 相比,微控制器版本有什么優勢嗎?目前還沒有,但仍有足夠的代碼空間來添加其他功能。
嘗試將 LED 用作光傳感器
當我最初發布這篇文章時,很快就有人建議將 LED 也用作光傳感器,以便在黑暗中自動打開 LED 蠟燭。事實上,這將是一個非常好的附加功能。實際上,我從一開始就計劃添加它。這就是我將 LED 的兩個端子連接到 GPIO 的原因。然而,盡管花了大量時間,但我從未設法讓它讓我滿意地工作。我最初省略了這一集,因為報告故障顯然不那么有趣。我將以 Barrys 的建議為線索來總結我的發現。
眾所周知,LED 也可以充當光電二極管(這里有一篇很好的論文)。當它們反向偏置時,入射光將產生可在端子上測量的光電流。主要的挑戰是這種電流非常低,通常在正常室內照明條件下在納安培范圍內。大多數 MCU 不提供任何外圍設備來測量電流,尤其是沒有這么低的電流。有各種技巧和調整可以解決這個問題,這增加了使用 LED 作為光傳感器的吸引力。不幸的是,網絡上充斥著沒有解釋方法論并且經常使用可疑方法的指導。
一種比較可靠的方法是使用內部 LED 電容作為單斜率積分 ADC 中的電流積分器。實際上,這是通過首先將 LED 反向偏置充電至固定電壓(例如 VDD)來實現的,讓輸出浮動,然后監控電荷消失需要多長時間。從 dQ=C*dV 和 dQ=Iphoto*dt 可知 Iphoto=C*dV/dt。因此,LED 中產生的光電流與電壓降低到固定閾值所需的時間成反比。
我之前在各種 ATtiny 上成功使用了這種方法。由于 Padauk PFS154 有一個內部模擬比較器,我預計同樣的方法也能奏效。我將比較器配置為使用內部電阻分壓器作為電壓參考,使用 PA4 作為輸入。為了測試目的,我將比較器輸出路由到 PA0,以便可以從外部對其進行監控。
mov a,#(GPCC_COMP_MINUS_VINT_R | GPCC_COMP_PLUS_PA4 | GPCC_COMP_INVERSE | GPCC_COMP_ENABLE)
mov _gpcc,a
上面的示波器圖像顯示了 LED (ch2) 和比較器輸出 (ch1) 兩端的電壓??梢郧宄乜吹?,在初始充電后,LED 上的電壓消散,比較器在參考電平(本例中約為 2.5V)處切換。不幸的是,這已經顯示出一些問題:從比較器輸出到 LED 引腳存在顯著的串擾,并且還存在大量噪聲。比較器不會在精確的電壓下切換,但會引入顯著的時序 ji