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