我最近一直在玩LED,由8位微控制器供电.有时需要使用脉冲宽度调制的纯软件实现来控制LED亮度 - 即快速打开和关闭灯光以改变打开和关闭时间的比例.这种方法很有效,直到我达到约5%的亮度,其中频闪开始看起来令人不舒服地闪烁在眼睛上.
将PWM实现为一个循环,它会逐步调整0-255中的每个数字,以便在此时间打开或关闭指示灯.设置为20值的灯将在前20个循环中打开,然后关闭.
我正在寻找一个能够在这些数字周围移动的好函数,所以不是循环遍历0,1,2,3 ......我的循环可以从可能性池中随机抽样.总亮度随时间变化是相同的,但是20亮度值的光可以在256个循环中打开和关闭十几次,而不是仅仅点亮一次然后关闭大部分循环.即使循环运行稍慢,这也会减少闪烁效果.
当使用每个8位数调用时,一个好的抖动函数需要返回8位范围内的每个数字.因此,它也不需要产生重复的数字 - 不是随机的,只是改组.最好是它倾向于不按顺序将相似的数字放在一起 - 每个数字之间的差异要高 - 理想情况下我的数字大约为64-127.
限制也很有趣 - 这是一个时间关键的应用程序.加法,减法和按位运算花费1个任意单位时间,乘法成本为2个单位,分割成本为4个单位.浮点数不在问题中,并且中间数字中使用的每8位数的成本大约翻倍.查找表是可能的,但是将使用设备总内存容量的大约一半 - 因此快速算法最适合可重用性,但是当有预先计算空间时,优质慢速算法也非常有用.
感谢您帮助我解决任何想法或思考.:)