本帖最后由 johnrey 于 2014-9-12 14:50 编辑
三种模式全部实现了,为了看效果方便,现在上来先是手动设定光强,然后进入自动调光,最后是氛围灯。增加了三种模式的指示:用D2来做。手动调光是D2亮;自动调光是D2灭;氛围灯是D2闪烁。看图,
手动模式,D2亮
自动模式D2灭
流程图如下
视频V1中,是三种模式转换。
mode 0,手动,D2亮。转动电位器,LED光强改变。先调到较暗,切到自动模式。
mode 1,自动,D2灭。这也是原来定的主要内容,因为环境光变化时,视频中背景亮度也要变,所以用螺丝刀的遮挡来模拟环境光的变化。当螺丝刀把把光敏电阻挡住时,发现LED开始加亮,移开以后,LED又恢复到正常。基本实现自动调光,调整速度也较快。因为在验证的时候,还有环境光干扰,因此无法做到LED亮度和手动设定时完全一样。
mode 2,氛围灯,D2闪。其实就是呼吸灯。
初步成果视频
细心的观众可能注意到了,在从手动切换到自动时,切换前后亮度会有变化。照理说在手动模式中会记录下设定值,切换后如果环境没有太大变化,应该亮度也不怎么会变。于是去看了下波形,发现1K pwm下,光敏电阻有还是有较大波动,也就是说虽然人眼看不出LED亮度的闪烁,但是光敏电阻还是能感觉出来的。
所以在用AD测量光照的时候,其实不是一个固定的值,而是一个随时间变化的值。这样记录的结果对于后面的自动调光是没啥意义的。怎么改进呢?可能有两种方式,一个是加快PWM的速度,波动会更小;一种呢是干脆在控制端把pwm滤成比较平坦的直流,再去驱动。最后选择了控制端加个电容,通过观测波形发现,这是光敏电阻那边已经没啥波动了,用交流耦合可以看到大概在几十mV,而原来的变动可以在400mV左右。这时候我们再从手动切到自动,切换前后亮度是不会变的,如第二段视频中显示,当然调光依然有效。
改进后的光敏电阻分压输出,直流耦合和交流耦合观测
改进后从手动切换到自动,亮度基本不变
未来还可能增加的功能,利用D2做报警。当LED的调光不能控制所需亮度(比如LED全灭,还是太亮或者LED最亮,照度还是不够)时,D2是闪烁报警。D2闪烁已经实现了,怎么加到自动调光模式中去,还没想好。本来还想加入串口手动调光方式,可是想想和旋钮比,不太实用,暂时先不弄了。
最后统调过程中有些心得也和大家分享一下。
1、PWM默认开了2个中断,但是作品中只需要一个,所以开始只copy了一个中断过来,结果,陷入了无休止的中断中。因为第一次CH1的中断完了,没有处理。
2、P0.3一旦配置了ch0,其输出还有由TOE来控制的,光靠PMC和PM是不够的。但是一旦TOE了,输出就变样了,比如当P0.3=1时,输出高电平,当P0.3=0时,输出的则是定时器的IO口翻转输出。要将TO0n用作端口输出,TO0n必须置0;难道TOE也要置0?
3、最开始按照官方例程写的,做调整的时候先DI,然后最后EI。可是AD的值是通过查询EOC标志,而eoc标志由ad中断置位。那DI了,自然就不中断了。。。调了很久。
4、AD调试过程中有点小插曲,某天忽然干扰非常大, 10bit采样下,AD值变化范围挺明显的,通过AD设定PWM结果非常糟糕,占空比会缓慢变化,而且变化很明显。最后只好采用多次平均方式。实际情况是上到20次,就非常稳定了。然后隔一天再测,单次AD也很好了,好奇怪啊。
5、从自动再次切到手动后,开始很奇怪,AD读到的数值正好反了,0通道读到的是1通道的值,1通道读到的是0通道的值。死活改不了,最后多读一次0通道就好了,但是问题出在哪里一直没找到。
6、调试到最后,要拍视频了,居然LED灯废了,不发光了,难道一直闪给闪坏了。基极还是要滤波?