在最近评测了低于 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