|
本系列文章主要介绍如何使用EFM8控制器制作一款智能环境光监测仪,共包含5个部分: ● Part 1:在LCD上显示测量值 ● Part 2:理解和实现ADC ● Part 3:测量和解析环境光照度 ● Part 4:过零检测 ● Part 5:使用双向可控硅调节灯亮度
所需的硬件/软件 ● SLSTK2000A EFM8评估板 ● Simplicity Studio集成开发环境 ● SCILAB ● 面包板 ● 100k电阻
简介 我们制作的智能环境光监测仪需要对来自光学探测器的信号进行数字化和分析,因此现在是时候探索EFM8控制器集成的模数转换(ADC)功能了。ADC可以视为一个神奇的盒子,每当我们翻转ADC控制寄存器中的右边的位时,它就会将模拟电压信号无缝转换为二进制数,但这种表面上的方法存在风险。工程如同生活一样,对手头的问题有一个彻底和深思熟虑的理解,可以防止在未来发生的微妙的、回避的问题。因此,本篇文章将作为使用EFM8板载ADC的指南,并了解其架构和信号接口。
将电压转换为寄存器中的一系列位的方法不止一种。常见的ADC方法包括流水线型(Pipeline)、sigma-delta和逐次逼近寄存器(SAR)拓扑。 EFM8的ADC属于SAR形式。Sigma-delta ADC非常适合高分辨率应用,流水线型ADC提供更高的采样率。 SAR ADC适用于中到高分辨率和中到高采样率,并且它们通常集成到微控制器中,因为该架构结构紧凑且与低功耗设计兼容。简化的SAR功能图如下:
ADC寄存器启动时最高有效位为逻辑高电平,其余为逻辑低电平,因此ADC最初产生的电压为参考电压的一半。 MSb保持高电平或设置为低电平,具体取决于比较器的输出,此过程重复所有位,直到ADC寄存器值对应模拟输入电压。现在考虑的最重要的事情是:(1)ADC是同步的 - 每个输入时钟周期更新一个寄存器位;(2)在SAR处理过程中,模拟输入电压存储在采样保持电路中。
ADC时序 以下是EFM8 ADC的时序图:
这里表示两种模式:“延迟跟踪模式”和“正常模式”。本篇文章中,我们使用正常模式,并在本文的结尾处简要讨论延迟跟踪模式。在正常模式下,通过将一个写入ADBUSY位(还有其他方式开始转换)启动转换,然后转换过程由SAR时钟控制。该图应该可以帮助您理解“转换需要多长时间”或“最大采样率是多少”没有简单的答案。转换过程的持续时间取决于SAR时钟的频率以及是否ADC配置为8位、10位或12位,最大采样率受转换持续时间和转换过程开始前提供的跟踪时间的影响。
跟踪时间与建立时间 EFM8控制器仅包含一个ADC模块,但通过设置控制模拟多路复用器的寄存器中的相应位,可以将这一个ADC模块连接到20个不同端口引脚中的一个。您还可以将ADC连接到各种内部信号,例如接地、VDD和集成温度传感器的输出。这种有意义的多路复用器功能极大地增强了ADC的灵活性和实用性,但它也带来了一个重要问题:稳定时间。请考虑以下表示ADC输入的图表:
当多路复用器关闭特定引脚和ADC输入电路之间的连接时,引脚上的模拟电压开始通过多路复用器电阻对采样电容充电。换句话说,呈现给ADC的实际信号是由输入级的RC时间常数控制的指数增加的电压。如果在设置多路复用器后过早启动转换过程,则转换结果将太低。如果与ADC输入引脚串联的电阻很大,则此问题会变得更糟,因为这会影响总输入电阻并使Csample上的电压上升到最终值。 “稳定时间”是指输入电压达到最终值所需的时间,“跟踪时间”是指在启动转换之前允许电压稳定的时间。显然,如果您想要精确测量,跟踪时间必须超过稳定时间。
该项目的目标是,以这样的方式进行模数转换,以证明ADC建立时间的影响。我们使用面包板、一些端接跳线和两个电阻,如下所示:
跳线连接到扩展插头上的相应引脚:
这个简单的电路向ADC发送稳定的1.65 V电压。大阻值电阻通过夸大ADC输入电容的影响来促进我们的分析。
端口I / O 端口I / O配置与我们在上一篇文章中使用的相同,只是P1.1配置为模拟输入引脚。
外设和中断 SPI的配置与上一篇文章相同。 Timer4仍用于短延迟(大约几微秒),现在我们还使用Timer3用于长延迟(大约几毫秒或几秒)。
如果我们想要集成的低频振荡器(缩写为LFOSC)作为Timer3的时钟源,我们需要启用它。
使能ADC,配置如下:
我们使用EFM8的内部产生的参考电压,设置为2.4 V:
SPI中断使能,因为SPI传输由SPI中断服务程序中的状态机控制。发送每个字节后,将触发中断。对于这个项目,我们还启用“ADC0转换完成中断(ADC0 conversion complete interrupt)”。您可能已经猜到的,此中断表示ADC寄存器保存了一个准备处理的新转换值。
固件 该项目中的新固件包括ADC的简单中断服务程序和“AmbientLightMonitor_main.c”中的代码,该代码用于控制ADC和处理转换值。 - ADCFactor = (float)ADC_VREF_MILLIVOLTS/ADC_2POWER10;
- for(delay = 0; delay < 16; delay++)
- {
- //connect the ADC input to ground
- SFRPAGE = ADC0_PAGE;
- ADC0MX = ADCMUXIN_GND;
- //delay about 20 us
- SFRPAGE = TIMER4_PAGE; TMR4L = 0; while(TMR4L < 40);
- //connect the ADC input to P1.1 and initiate a conversion
- /*the delay between setting the multiplexer and
- starting the conversion increases with each loop iteration*/
- SFRPAGE = ADC0_PAGE;
- ADC0MX = ADCMUXIN_P1_1;
- SFRPAGE = TIMER4_PAGE; TMR4L = 0; while(TMR4L < delay);
- SFRPAGE = ADC0_PAGE;
- ADC0CN0_ADBUSY = START_CONV;
- //wait until the conversion is complete
- while(ADC_CONV_COMPLETE == FALSE);
- ADC_CONV_COMPLETE = FALSE;
- //Retrieve the 10-bit ADC value, convert it to a voltage amplitude, and display the measurement
- SFRPAGE = ADC0_PAGE;
- RawADCResult = ADC0;
- ADCMeasurement = RawADCResult*ADCFactor;
- ConvertMeasurementandDisplay(VOLTAGE, ADCMeasurement);
- //delay for about 1 second
- SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3 < 10000);
- }
复制代码
此代码的目的是重复采样输入电压,每个采样允许在设置多路复用器和启动转换之间有更多时间。在每次转换之前,多路复用器首先配置为接地连接,以释放Csample上的电压。第一次转换使用最小可能的跟踪时间,因为在为P1.1设置多路复用器后立即启动转换。接下来的16次转换在for循环中执行,每次迭代跟踪时间增加约500 ns。在应用标准公式将ADC值解释为物理测量值后,每个测量值都显示在LCD上:
每次转换后都会包含一秒钟的延迟,以便我们有时间观察和思考测量结果。
分析 首先,我们将使用LTSpice来预测Csample上的电压,假设我们的电路如下:
结果如下:
正如预期的那样,根据电路的总RC时间常数,我们有一个指数增加的电压接近1.65 V的标称值。现在让我们运行固件。我们看到随着跟踪时间的增加,显示的测量值逐渐增加;第一次测量是1.04 V,因为低于此电平的电压发生在执行CPU指令和与SAR逻辑同步所涉及的不可避免的延迟期间。当您观察到从一次测量到下一次测量的增加量随时间逐渐减少时,您的直觉应该是“指数增长”。如果我们绘制17个测量值,假设样本之间的时间步长为490 ns,我们得到以下结果:
令人高兴的是,曲线的形状对应于指数增长。然而,在测量数据中,从1 V增加到1.6 V所需的时间约为4μs,而模拟预测为640 ns。为什么主要的差异?首先,模拟中使用的ADC输入级基于理想值,并未考虑其他阻抗源。 Silicon Laboratories的应用笔记表明,ADC输入级的更真实的模型是5kΩ串联10 pF,而不是550Ω串联5 pF。如果我们在模拟中使用这些值,则1 V至1.6 V的时间差为1.4μs。 4μs和1.4μs之间仍然存在显着差异;为了使实验和模拟结果保持一致,我们需要在ADC模块外部包含寄生电容。如果我们假设输入引脚有20 pF的杂散电容(这是数据表中给出的值),而连接器焊盘、PCB走线或任何其他来源的另外2 pF,我们有以下等效电路:
外部电容不能简单地添加到采样电容,因为当多路复用器关闭开关时外部电容充满电。相反,当外部电容通过RMUX放电时,Csample上的电压上升非常快,然后当Csample上的电压与Cexternal上的电压相匹配时,Csample上的电压上升得比前一次模拟慢得多,因为可用电流必须充电32 pF而不是10 pF。如下图中的光标标记所示,电压从1 V增加到1.6 V所需的时间现在为3.8μs,这与我们大约4μs的实验值非常吻合。
总结 我们成功实现了EFM8控制器的ADC功能,同时探讨了ADC输入级中与电阻和电容相关的限制。我们的分压器中使用的大阻值电阻和外部寄生电容的影响提醒我们外部电路会影响建立时间。 EFM8的ADC包括延迟跟踪模式(如上所述),其中包含4个SAR时钟周期的跟踪周期,但您不能总是依赖延迟跟踪模式,因为当外部电路包含大量的时钟时,这4个时钟延迟可能不够抵抗性。因此,精确的ADC测量取决于您了解电路如何与ADC输入级交互,然后确保在通过多路复用器选择ADC输入和启动转换之间有足够的延迟。 |