我们确定了用PWM方案实现电子荧火虫,接下来就是实现它了。这里用的是一个内置了PWM模块的单片机,当然,这个芯片的价格是远远高于我们说过的1块钱了。不过,实现的道理是一样的。而且我们想要讨论的并不是电路的问题,也不是代码的问题,所以我没有给出完整的电路图,也没有完整的代码,那么,我想要谈的是什么呢?还是请大家看吧。最后的那段红色的文字就是我想要说的。
要对真实的荧火虫发光情况进行模拟,需要巨大的工作量,要使用仪器对荧火虫的发光周期,光强度等参数进行精确的测量。这里不去讨论这一工作,仅是对其中一项参数进行调试,即均匀发光。由于发光二极管的非线性特征,因此,其发光强度与流过其中的电流并非线性关系。即便将PWM输出的线性做得非常好,但是反映到发光上,就表现为亮度的不线性。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
前例中有:
if(inCrease)
timCount++;
else
timCount--;
显然,这样仅是保证PWM波形输出的线性,而不能保证亮度的线性变化。有时timCount变化1到2个数字,亮度就会感到有时显的变化;而有时timCount变化10个数字,亮度变化也不明显。要实现亮度的线性变化,就要通过观察亮度的变化,找到相应timCount的值。接下来的工作,就是不断地重复劳动—按下按键,记录CCAP0H的值,然后记录亮度的变化。当然,细微的变化用肉眼是难以分辨的,但大致还是能够分出一些级别来。在此,我们将亮度分为10级,并将其对应的数据记录在下表中。
表 LED亮度与CCAP0H关系表
亮度等级 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
CCAP0H | 1 | 4 | 12 | 22 | 35 | 70 | 128 | 165 | 208 | 254 |
有了表格以后,在程序中实现这样表格并不困难,用一个数组就可以,详见下面的源程序。相对而言,工作量很大的部分是表格的生成,也就是通过按键调节,观察亮度,并记录下当前CCAP0H这项工作。这项工作不仅工作量大,而且烦燥乏味,没有技术含量,因而很容易被开发者在项目规划初期忽略掉。但在实际项目中,做出来的产品能否被用户接受,却很有可能就体现在这样的工作中。这实际上也是很多项目开发中面临的问题,忽视这一点,往往会造成项目开发周期的拖延甚至最终失败。最终完成的代码如下所示。
void main()
{
uint timCount=0x10;
uchar xPos,yPos;
uchar *s="CCAP0H is:";
uchar caTmp[4];
uchar cTmp1,cTmp2;
bit inCrease=1;
uchar i;
initPCA();
initTmr();
xPos=0; yPos=1;
RstLcd();
ClrLcd();
SetCur(CurFlash); //开光标显示、闪烁
WriteString(s,xPos,yPos);
for(;;)
{ if(inCrease)
{ timCount=brightTab;i++;}
else
{ timCount=brightTab;i--;}
CCAP0H=timCount;
mDelay(100);
if(i==9)
inCrease=0;
else if(i==0)
inCrease=1;
}
}
当然,读者对于这个表格不必太关心。这个表格只适用于作者所做实验的电路板,因为LED的发光特性与限流电阻、自身特性等有关,所以这个表格并没有普遍性,而且将亮度仅十等分,也是比较粗糙的。读者应该从中看到的是一个产品的功能如何不断演化,并最终得到结果这样的一个过程。
在各论坛逛常有这样的感觉,有很多牛气冲天的大虾,不论什么最新技术,都有人懂且精。但一旦论到用这些知识做个什么东西出来,却往往有点底气不足。当然,论坛本是华山论剑之地,并非屠龙斩虎之所,所以专门讨论技术也无可厚非。但再看一看国内的电子产品,与国外的产品相比,其差别并非在于技术的先进性,而往往在于一些细节,如产品的稳定性、产品使用时的手感、美感等。我们在用一些大品牌的手机时往往有这样的感觉:一开始不熟悉只会一些简单功能,用了一段时间后就会逐渐拓展应用,此时往往会想“要有**功能就好了”,结果一找,还真就有这功能。。。。给人的感觉是这些品牌在细节处做复非常到位。
用户1435026 2011-7-4 17:02