一个小型微控制器(8 位 Atmel)控制多个灯光,以呈现具有许多花哨的随机灯光序列的灯光秀。
一个合适的伪 RNG 可以很好地完成它的工作,但我正在为它寻找一个好的种子。种子是必要的,因为如果有人同时打开多个这样的设备,如果它们都产生相同的效果序列,直到它们由于各自时钟源的微小差异而慢慢分散开来,看起来就不好看。
在必须通过按下按钮或翻转开关启动设备的情况下,可以使用一种非常好的方法来播种我经常使用的伪 RNG。一旦µc 通电,就可以启动一个非常快的计时器,并且一旦第一次按下按钮,该计时器的值就会为 RNG 播种。
问题是,在这种情况下,没有按钮。该程序必须在设备通电后立即启动。
PCB 上的位置非常有限(可能只适合一些非常小的 SMD 部件),所以我正在寻找最小和最简单的解决方案。因此,我将排除像真正的 RNG 硬件、无线电接收器等花哨的解决方案。
我所拥有的只是 CPU 中的一个 16 位定时器计数器,以及一个可以访问 ADC 的未使用端口引脚。
我目前的解决方案是仅使用一个电阻器(尽可能不准确)为 ADC 引脚提供大约一半的电源电压,并使用第一个 AD 转换值为 RNG 播种。然而,现在大多数 10% 的电阻器的误差都远低于 1%(当我告诉供应商我们想要他们能找到的最差质量的 SMD 电阻器时,想象一下供应商的表情会很有趣),所以很有可能从同一个种子开始的多个单元。
一个更好的选择是进行多次转换并从这些测量的最低有效位中建立一个值。但是,我之前使用过这种 µc 类型的 ADC,我知道它非常准确。以尽可能快的速度运行 ADC 可能会有所帮助。
有人有更好的建议吗?种子不需要完全均匀分布,但分布越均匀越好。具有完全均匀分布的 16 位种子将是一个好得令人难以置信的梦想,但我认为 5 或 6 位的一半体面分布可能就足够了。