旧乡故客
发表于: 2018-7-30 09:51:32 | 显示全部楼层

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

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

●    Part 2:理解和实现ADC

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

●    Part 4:过零检测

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


所需的硬件/软件

●    SLSTK2000A EFM8评估板

●    Simplicity Studio集成开发环境

●    面包板

●    4.7k电阻

●    1MΩ 电阻


简介

在上一篇文章中,我们使用GA1A2S100光学传感器成功地产生并数字化了可靠的环境光测量方法。我们可以通过各种方式使用这些测量:例如,评估与一天中的时间和天气条件相关的室内光强度、跟踪居住者对人工照明的使用,或将环境光照水平与不同类型的灯泡或灯相关联。另一种应用是使用环境光数据来实时调整灯具提供的照明量。换句话说,我们可以根据GA1A2S100的环境光测量结果实现一个不是由手动开关控制而是由EFM8控制的灯调光器。


我们的灯调光器由两个主要部分组成。首先是过零检测电路,每当交流输入电压通过0V时,它就会向EFM8输出一个数字信号。其次是一个控制电路,其中EFM8使用一个称为三端双向可控硅的器件来限制通过灯的交流电流。过零检测电路允许EFM8将其三端双向可控硅开关驱动信号与AC周期的开始同步,并通过增加或减少周期开始与启用三端双向可控硅开关的信号之间的延迟,固件可以控制平均功率送到灯上。我们将在下一篇文章中讨论基于三端双向可控硅开关的控制电路;这里我们将重点关注过零检测部分。注意:此调光器实施适用于白炽灯泡 - 标准紧凑型荧光灯泡与此电路不兼容。


比较器

在这个单电源、轨到轨运算放大器和完全集成的ADC这一时代,比较器可能有些被忽视。但是比较器仍然有它们的位置:它们针对其声明的目的进行了优化 - 比较,而不是放大 - 它们有时包含诸如集成电压基准和方便可调滞后等有用功能。在本电路中,我们将使用凌力尔特公司的LTC1440,它包括刚才提到的功能以及用于信号接地和负电源的独立引脚。这意味着我们可以使用双极性(即+/- 5 V)电源,但仍然有比较器的输出信号以地为参考;这很重要,因为我们不想将-5 V发送到EFM8通用输入/输出(GPIO)引脚。本文讨论的电路利用这个独立的接地参考引脚,这就是输出在+5 V和0 V之间转换而不是+5 V和-5 V的原因。正5 V电源不是一个问题,因为EFM8的GPIO电路虽然由3.3 V供电,但设计用于安全接受5 V输入。


电源

从理论上讲,这样的调光电路可以在电源插座上输出标准的120 V电源。但是我们不希望将120 V带到面包板上(安全第一),我们不需要那种电源来简单地演示电路的功能。因此,我们将使用12 V壁挂式AC / AC变压器引入交流电压。

AC-AC.jpg


除此之外,我们还需要三个其他电压:用于光学传感器的3.3 V,用于比较器的+/- 5 V(我们还将使用5 V而不是3.3 V为运算放大器供电,主要是因为这样可以更好地使用在面包板上可用的两个正电源导轨)。 3.3 V和+5 V电源来自EFM8评估板,通过扩展插头,-5 V很容易从第二个壁挂式电源获得:

AC-DC.jpg


这些超薄设备是一种便宜的(约7美元)和方便的方式为面包板或原型PCB提供双极电源:在这种情况下,您只需将正极线连接到现有的接地节点,然后负极线变为-5 V。


滞后

比较器电路非常简单:如果正输入端的电压高于负输入端的电压,则输出电压被驱动到正电源轨。如果正输入端的电压低于负输入端的电压,则输出被驱动至负电源轨或电路的地电位。 (实际上,一些比较器使用漏极开路/集电极开路输出级,因此实际上并没有将输出“驱动”到正电源电压。)但这样的比较器电路可能会产生严重的噪声问题,这就是滞后现象。请考虑以下基本电路:

basic_comp2.jpg

如果输入是理想的正弦波信号,则输出如下:

ideal_out.jpg


到目前为止一直很好,但理想的正弦波不存在的;如果我们在输入信号中加入50 mV的100 kHz噪声,我们会得到以下输出转换:

pos_trans.jpg


neg_trans_2.jpg


虽然感兴趣的信号(即理论上无噪声的60 Hz正弦波)仅使一个转换高于或低于比较器阈值(在这种情况下为0 V),但噪声信号会导致杂散输入转换,从而导致同样的杂散输出过渡。当然,本例中的100 kHz噪声可以通过低通滤波器轻松抑制,但实际输入信号可能受到许多噪声频率以及不可预测的瞬态的影响。因此,我们转向滞后,在这个特定的应用中,这是一种技术,其中负到正转换的比较器阈值不同于正到负转换的阈值:

diff_thresholds.jpg


如光标所示,负到位输入转换的阈值比标称阈值高约50 mV,正到负转换的阈值比标称阈值低50 mV。在输入电压增加超过50 mV,导致输出转换后,输入必须降至50 mV以下但负50 mV以便引起另一次输出转换。结果是滞后电压带:在输入转换导致比较器输出转换之后,只要波动保持在滞后带内,输入电压就会波动而不会触发另一个输出转换。在该示例中,滞后电压带是50mV - (-50mV)= 100mV。由于电路中包含迟滞,输出转换如下所示:

hysteresis_trans.jpg


将滞后结合到比较器电路中有各种方法;在这个项目中,我们将使用LTC1440的集成磁滞功能。 LTC1440配置所需滞后带的过程将在下一节中介绍。


电路

这是我们的过零检测电路的原理图:

overall_circuit_schem.jpg

这是面包板实现:

breadboard_ZCD.jpg


R1和R2组成一个电阻分压器网络,可将输入电压降至与比较器输入级兼容的电平。您可能还记得,壁挂式AC / AC变压器的额定输出为12 V,但这是指均方根(RMS)电压。峰值幅度为

RMS_eq.jpg

我们需要确保输入电压始终在可接受的输入范围内,因此电阻分压器网络设计为在输入电压为17 V时产生约3 V.


滞后电压(即,标称阈值与实际正负或负至正阈值之间的差值)等于REF引脚和HYST引脚之间的电压差;因此,滞后电压带等于REF和HYST之间电压的两倍。 REF引脚始终比负电源高1.182 V,因此通过R3的电流为1.182 V /(10kΩ+1MΩ)=1.17μA(LTC1440要求此电流介于0.1和5μA之间)。因此,滞后电压为1.17μA×10kΩ= 12mV。我们从适度的滞后开始,因为该电路的目的是识别输入波形超过0 V的时刻,并且滞后导致输入转换和输出信号之间的小延迟。如果我们遇到虚假转换的严重问题,我们只需增加R3的值。


固件

使用EFM8的两个外部中断检测比较器的输出信号,其中一个捕捉上升沿转换,另一个捕捉下降沿转换。

exint_config_1.jpg

exint_config_2.jpg

(由于某种原因,最初的8051架构包括定时器控制寄存器中的外部中断配置位。)这两个中断都可以分配给同一个GPIO引脚。 当P0.0捕捉到一个上升沿时,将触发中断,而当P0.0捕捉到一个下降沿时,将触发另一个中断。

interrupt_config.jpg


当前固件的功能是计算上升沿和下降沿转换并显示相应的频率。 目的仅仅是确认检测到的转变的数量对应于预期的频率,即60Hz。 以下是外部中断的两个中断服务程序:

  1. SI_INTERRUPT (INT0_ISR, INT0_IRQn)
  2. {
  3.         //the interrupt flag is cleared by hardware
  4.         FallingEdgeCount++;
  5. }


  6. //-----------------------------------------------------------------------------
  7. // INT1_ISR
  8. //-----------------------------------------------------------------------------
  9. SI_INTERRUPT (INT1_ISR, INT1_IRQn)
  10. {
  11.         //the interrupt flag is cleared by hardware
  12.         RisingEdgeCount++;
  13. }
复制代码

上一篇文章中的主要while循环已修改如下:

  1. while(1)
  2. {
  3.         ADC0CN0_ADBUSY = START_CONV;

  4.         //wait until the conversion is complete
  5.         while(ADC_CONV_COMPLETE == FALSE);
  6.         ADC_CONV_COMPLETE = FALSE;

  7.         //retrieve the 10-bit ADC value and add it to the accumulating sum in RawADCResult
  8.         SFRPAGE = ADC0_PAGE;
  9.         RawADCResult = RawADCResult + ADC0;
  10.         NumberofMeasurements++;

  11.         /*if we have enough measurements to compute an average,
  12.          shift right to divide the sum by the number of measurements*/
  13.         if(NumberofMeasurements == TWO_POWER_5)
  14.         {
  15.                 RawADCResult = RawADCResult >> 5;
  16.                 NumberofMeasurements = 0;

  17.                 //convert the averaged conversion result to a current measurement and display
  18.                 //the actual value of the resistor in the test circuit is 4.6 kOhms
  19.                 ADCMeasurement = (RawADCResult*ADCFactor)/4.6;
  20.                 //ConvertMeasurementandDisplay(CURRENT, ADCMeasurement);

  21.                 //display the number of cycles counted in the last second
  22.                 ConvertMeasurementandDisplay(FREQUENCY, RisingEdgeCount);

  23.                 RisingEdgeCount = 0;
  24.                 FallingEdgeCount = 0;
  25.         }

  26.         /*the value 10700 (rather than 10000) was empirically found
  27.         to produce a delay closer to one second*/
  28.         SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3 < (10700/TWO_POWER_5));
  29. }
复制代码

我们没有显示光学传感器的输出电流值,而是显示在一秒内计数的上升沿个数,这对应于每秒的正弦波周期数。 固件包含一个用于单位为赫兹的新像素数据数组,因此我们不会因使用错误的单位显示频率而混淆自己。 从一秒到下一秒的周期数有一些变化。 这主要归因于时序不规则性,因为我们没有使用精确的方法来测量和同步一秒间隔(这通过向输入引脚施加稳定的60Hz方波来证实;观察到类似的变化)。 此时的重点是测量值保持在大约60 Hz,这表明我们的过零检测器运行正常。

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

本版积分规则

主题 29 | 回复: 32



手机版|

GMT+8, 2024-4-20 22:07 , Processed in 0.134036 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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