旧乡故客
发表于: 2018-7-29 22:56:29 | 显示全部楼层

本系列文章主要介绍如何使用EFM8控制器制作一款智能环境光监测仪,共包含5个部分:

●    Part 1:在LCD上显示测量值

●    Part 2:理解和实现ADC

●    Part 3:测量和解析环境光照度

●    Part 4:过零检测

●    Part 5:使用双向可控硅调节灯亮度


所需的硬件/软件

●    SLSTK2000A EFM8评估板

●    Simplicity Studio集成开发环境

●    面包板

●    4.7k电阻


简介

我们之前的文章中讨论了如何在LCD上显示电流和电压测量值以及如何进行可靠的模数转换。现在,我们继续该项目,在面包板上构建环境光传感器电路、数字化电路的输出信号以及解析数字化测量值。


我们使用的光敏元件是由SHARP制造的GA1A2S100线性输出环境光传感器。这种三端器件不是简单的光电二极管或光电晶体管。相反,它包含三个光电二极管和调节电路,如下所示:

detector_internal.jpg


该器件其对光强度和光谱分量的敏感度与人眼的相似。换句话说,该传感器的输出可以合理准确地指示环境对人显示出来的亮度或暗度。


传感器产生的输出电流与环境光强度成正比:

output_characteristics.jpg


我们需要将此电流通过负载电阻以产生可由EFM8的ADC测量的电压,因此第一个设计任务是确定负载电阻的大小。传感器的数据表规定输出引脚的电压不应超过VCC - 1 V;我们使用VCC = 3.3 V,因此当传感器暴露在最高预期光照强度时,我们需要选择能产生约2.3 V的电阻。如输出电流与照度的关系图所示,传感器最高可达10,000 lux。然而,10,000 lux相当于在阴天的外面,有趣的是,它比任何正常的室内照度都要亮得多。由于该项目旨在监测室内光照强度,我们假设最大照度为1000勒克斯(光线充足的办公室可能为500勒克斯)。查看上图,我们看到1000 lux对应500μA,2.3 V除以500μA对应4600Ω。因此,我们将选择一个标准的4.7kΩ电阻将传感器的输出电流转换为电压。


正如我们在前一篇文章中所观察到的,ADC的输入阻抗可能以导致错误测量的方式与电路相互作用。该项目不会遇到上一个项目中存在的两个问题因素:外部电路不包含大量串联电阻,并且不需要更改多路复用器设置,因为我们只使用一个模拟输入。因此,建立时间不是该项目的主要关注点。尽管如此,我们仍然会包含一个运算放大器来缓冲传感器的输出,因为这是确保我们拥有一个可以快速为ADC采样电容充电的低阻抗驱动器的简单方法。另一个好处是,通过电路中的运算放大器,我们可以轻松地采用额外的增益或低通滤波器来抑制不必要的高频变化。但是,在本篇文章中,我们不需要更多增益,我们将通过固件过滤测量结果,因此运算放大器配置为1单位增益缓冲器。此外,我们不需要担心运算放大器弊大于利,因为其偏移电压和噪声不会产生显着影响。整体电路如下:

overall_circuit.jpg

ambientlightbreadboard_med.jpg


固件

所有端口I / O,外设和中断配置都与我们在上一篇文章中使用的相同。 唯一的变化是“AmbientLightMonitor_main.c”中的代码:

  1. ADCFactor = (float)ADC_VREF_MILLIVOLTS/ADC_2POWER10;

  2. SFRPAGE = ADC0_PAGE;
  3. ADC0MX = ADCMUXIN_P1_1;

  4. NumberofMeasurements = 0;
  5. RawADCResult = 0;

  6. while(1)
  7. {
  8.         ADC0CN0_ADBUSY = START_CONV;

  9.         //wait until the conversion is complete
  10.         while(ADC_CONV_COMPLETE == FALSE);
  11.         ADC_CONV_COMPLETE = FALSE;

  12.         //retrieve the 10-bit ADC value and add it to the accumulating sum in RawADCResult
  13.         SFRPAGE = ADC0_PAGE;
  14.         RawADCResult = RawADCResult + ADC0;
  15.         NumberofMeasurements++;

  16.         /*if we have enough measurements to compute an average,
  17.         shift right to divide the sum by the number of measurements*/
  18.         if(NumberofMeasurements == TWO_POWER_5)
  19.         {
  20.                 RawADCResult = RawADCResult >> 5;
  21.                 NumberofMeasurements = 0;

  22.                 //convert the averaged conversion result to a current measurement and display
  23.                 //the actual value of the resistor in the test circuit is 4.6 kOhms
  24.                 ADCMeasurement = (RawADCResult*ADCFactor)/4.6;
  25.                 ConvertMeasurementandDisplay(CURRENT, ADCMeasurement);
  26.         }

  27.         //delay for 1/32 second so that we get one averaged measurement per second
  28.         SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3 < (10000/TWO_POWER_5));
  29. }
复制代码

ADC多路复用器在while循环外设置为P1.1,因为我们只有一个ADC输入信号。通过将逻辑1(此处由预处理器定义START_CONV表示)写入ADBUSY位来启动转换。然后我们等待ADC_CONV_COMPLETE标志,该标志在ADC中断服务程序中设置。


在此项目中,ADC值不会立即解释为测量值并显示。相反,我们实现了一个简单的平均滤波器。如果修改此代码以显示每个转换结果,您可能会注意到相当多的低幅度变化。这是由电路噪声和10位ADC的相对较低的分辨率引起的,尽管GA1A2S100似乎也容易受到不太稳定的测量的影响,这可能是由于通过窗户反射的阳光的细微变化引起的。无论如何,我们的环境光监测器旨在评估室内环境照度的长期趋势,因此我们将通过显示32个连续样本的平均值来改进我们的测量。这就是为什么我们使用语句“RawADCResult = RawADCResult + ADC0”; RawADCResult变量从零开始并累积转换结果,直到累积测量的数量等于32,由预处理器定义TWO_POWER_5表示。用于平均滤波器的测量次数应为2的整数次幂,因为这允许我们使用有效的按位右移操作来执行除法。此外,我们需要确保累积的ADC结果不会超过RawADCResult的最大值,因为无符号16位变量将溢出超过65,535。理论上,10位ADC结果可以高达1023,因此64次测量将接近但可接受(64×1023 = 65,472),128次将太多(128×1023 = 130,944)。


无论我们选择平均多少样本,显示(即平均)测量之间的延迟总是一秒。这是通过“while(TMR3 <(10000 / TWO_POWER_5))”声明实现的:10,000个Timer3时钟对应一秒,因此将10,000除以平均样本数意味着各个ADC转换之间的延迟将以一定速率生成样本确保每秒平均测量一次。请记住,从实际角度来看,此更新速率仍然相当快 - 如果我们使用这些测量来控制灯调光器,我们不希望每当有人在光学传感器上投射临时阴影时调暗灯光。但是现在我们只想观察测量结果,每秒更新一次,我们可以更好地评估和思考传感器的响应度。


顺便说一句,您可能想知道为什么我们在计算平均值时决定使用有效的按位移位操作(而不是除法),如果我们如此随便使用(10000 / TWO_POWER_5)来计算每个延迟。答案是编译器的优化器将(10000 / TWO_POWER_5)识别为常量表达式并生成使用相应常量商的汇编代码。加载到EFM8中的程序实际上不会在此处执行除法。


ADC结果代表电压,但我们想知道GA1A2S100产生的电流。为此,我们必须通过上面讨论的负载电阻来分压电压。使测量更精确的一种简单方法是使用电阻器的实际值而不是标称值。在测试电路中,4.7kΩ电阻实际上是4.6kΩ,因此这是代码中使用的值,即“ADCMeasurement =(RawADCResult * ADCFactor)/4.6”;我们使用4.6代替4600,因为当它将电压解释为毫伏但电流为微安时,ConvertMeasurementandDisplay()函数有效地将除以1000除以。


分析

当您用拇指盖住传感器时,观察测量值会减少,然后在近距离使用灯泡照亮时,可以很容易地确认电路的基本功能。更深入的评估需要使用上面的输出电流与照度图将测量的输出电流等同于照度。幸运的是,这个赛道是在一个令人愉快的雷雨天在一个有六个窗户的房间里进行测试的,这个窗户承认了大量的间接阳光。没有使用人工照明,因此缓慢,不规则的乌云与8月初的阳光混合在一起产生了室内光照水平的极好变化。


有时,当光照水平似乎适度降低时(或反之亦然),测量结果会适度增加,这可能是由于光谱成分的变化与设备的“光谱灵敏度补偿”电路不利相互作用。毫无疑问,成功的实施需要仔细安装,因为传感器的位置或方向的变化 - 例如,更靠近地板,更远离地板,朝向窗户,朝向天花板 - 极大地影响输出。在无窗,统一照明的办公室中,性能可能更容易预测。尽管如此,GA1A2S100反应良好,其输出电流的变化方式似乎与房间的“亮度”或“黑暗”感觉一致,或者在其他时候,根据一天中的时间可以预期的照度水平。如果主要目标是通过根据太阳提供的照明量调节室内照明来节省能量,则后一种关系更为重要。电流水平通常在50至160μA的范围内,对应于100至300勒克斯。考虑到光线充足的住宅房间可能在200到700勒克斯之间,这个范围与预期一致。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 29 | 回复: 32



手机版|

GMT+8, 2024-12-21 21:17 , Processed in 0.048509 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表