发现一个应广科技单片机(Padauk)微控制器后,是时候进行一些使用 Padauk PFS154 和 PMS150C 的项目了。
考虑到之前对电子和非电子蜡烛的研究,选择它作为最低成本微控制器的目标似乎是很自然的。
为了简单起见,将硬件简化为直接连接到 PA0 和 PA4 GPIO 的 LED。 Padauk GPIO 的供电能力非常有限,范围从 3V 时的 4 mA 到 5 V 时的 12 mA。这意味着不存在损坏直接连接到引脚而不使用电阻器的 LED 的危险。 驱动能力有限可能是设计人员不想在 I/O 驱动晶体管上花费太多 IC 空间的结果。
为了简单起见,将硬件简化为直接连接到 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 滤波器设置的亮度变化痕迹。
如果没有低通滤波器,亮度的变化显得过于突然。 发现使用系数为 0.5 的 IIR 滤波器可以获得最佳结果(“滞后 2”)。 较低的截止频率不能很好地再现“闪烁”。 您可以在下面看到不同 IIR 滤波器设置的亮度变化痕迹。
PFS154 的 C 代码可以在此处找到。 可以在此处找到 PMS150C 的汇编实现。
三盏 LED 蜡烛,配有 PFS154(左)、PMS150C(中)和闪烁 LED(右)
将这两个版本安装在廉价电子蜡烛的外壳中。 在上面的视频中,您可以看到两个版本的实际效果,将其与基于烛光闪烁 LED 的蜡烛进行比较。
与专用蜡烛闪烁 LED 相比,微控制器版本有什么优势吗? 还没有,但是仍然有足够的代码空间来添加额外的功能。
尝试使用 LED 作为光传感器
逐高电子技术部整理分享,很快就有人建议使用 LED 和光传感器来在黑暗中自动打开 LED 蜡烛。 事实上,这将是一个非常好的附加功能。 其实一开始就打算加上这个了。 这就是将 LED 的两个端子都连接到 GPIO 的原因。 然而,尽管在这方面花费了大量时间,但从未使其达到令满意的效果。 最初省略了这一集,因为报告失败显然不那么有趣。 将以巴里的建议为线索来总结的发现。
众所周知,LED 还可以充当光电二极管(这里有一篇关于此的很好的论文)。 当它们反向偏置时,照射光将产生可在端子上测量的光电流。 主要挑战是该电流非常低,在正常室内照明条件下通常在纳安范围内。 大多数 MCU 不提供任何外围设备来测量电流,尤其是没有这么低的电流。 有各种技巧和调整可以解决这个问题,这增加了使用 LED 作为光传感器的魅力。 不幸的是,网络上充斥着不解释方法论并且经常使用可疑方法的指导。
一种工作较为可靠的方法是使用内部 LED 电容作为单斜率积分 ADC 中的电流积分器。 实际上,这是通过首先以反向偏压将 LED 充电至固定电压(例如 VDD),让输出浮动,然后监控电荷消失所需的时间来实现的。 从 dQ=C*dV 和 dQ=Iphoto*dt 可以得出 Iphoto=C*dV/dt。 因此,LED 中产生的光电流与电压降低至固定阈值所需的时间成反比。
之前在各种 ATtinys 上成功地使用过这种方法。 由于 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(通道 2)和比较器输出(通道 1)之间的电压。 可以清楚地看到,初始充电后,LED 两端的电压消失,比较器切换到参考电平(本例中约为 2.5V)。 不幸的是,这已经暴露了一些问题:从比较器输出到 LED 引脚存在显着的串扰,并且还存在大量噪声。 比较器不会以精确的电压进行切换,但会引入显着的时序抖动。 需要注意的是,示波器探头本身会增加大量的寄生电容和漏电。 因此不可能监控准确的操作条件。 移除了示波器探头并停用外部比较器输出以进行进一步调查。 使用内部16位定时器来测量放电时间。
尝试一下这个装置,发现它对光的反应很好。 较高的照明水平成比例地减少了放电时间。 不过,使用它来控制 LED 蜡烛有一些要求:由于要感测环境光,因此它需要非常敏感。 此外,测量应该是可重复的,以确保蜡烛始终在相似的环境照明水平下打开。
为了稳定结果,生成了上面所示的数据集。 扫描了三个照明级别的内部参考电压。 “高”对应于手电筒直接照射 LED,低和中是正常环境亮度级别。 每个数据点都是 16 个测量点的平均值,以减少噪音。
可以看出,放电时间跟随照明水平跨越数十年。 较高的参考电压意味着较早达到阈值,因此放电时间会减少。 这种趋势也得到了很好的再现。 对于中低亮度,事情变得非常可疑。 在高 Vref 下,无法区分低电压和中电压,并且迹线中存在奇怪的台阶。 所有这些都使得弱光检测的操作变得非常可疑。
为了研究这些非理想性,将注意力转向了噪音。 很快们就发现噪声实际上是相关的,因此会导致系统误差。 您可以在上面看到一个示例时间序列。 (源代码在这里。)
尝试了很多方法来理解并减少这个问题。:使用内部带隙电压参考而不是电阻分压器没有产生任何有益的影响,这表明电压参考不是问题的根源。 将电源改为电池并没有产生任何显着效果。 因此可以排除电源的影响。 尝试不同的外部条件