雷竞技注册
项目

环境光监视器:理解和实现ADC

2015年8月5日通过罗伯特Keim

第2部分“如何制作环境光监测器”系列。我们的智能环境光显示器需要数字化和分析来自光学检测器的信号,因此是时候探索EFM8的集成模数转换功能了。

第2部分“如何制作环境光监测器”系列

推荐的水平

初级/中级

本系列之前的文章

所需的硬件/软件

描述 数量 Digi-Key p / n
面包板 1 377 - 2094
Receptacle-to-plug跳线 3. 1471-1231-nd.
100kΩ电阻 2 100kqbk-nd.

项目概况

我们的智能环境光显示器需要对来自光学探测器的信号进行数字化和分析,因此现在是时候探索EFM8的集成模数转换功能了。人们很容易将ADC视为一个神奇的盒子,只要我们在ADC控制寄存器中翻转右位,它就可以无缝地将模拟电压信号转换为二进制数,但这种表面上的方法是有风险的。在工程中,就像在生活中一样,对手头的事情有一个彻底和深思熟虑的理解,可以确保在未来的道路上避免微妙的、回避的问题。因此,该项目将作为使用EFM8的板载ADC和理解其体系结构和信号接口的指南。

将电压转换为寄存器中的位序列的方法不止一种。常见的ADC选项包括流水线、σ -delta和逐次逼近寄存器(SAR)拓扑。EFM8的ADC是SAR的变种。这个体系结构可以被描述为“通用用途”。Sigma-delta adc适用于非常高分辨率的应用,流水线adc提供更高的采样率。SAR adc适用于中高分辨率和中高采样率,它们经常集成到微控制器中,因为这种架构紧凑,与低功耗设计兼容。简化的SAR功能图如下:

ADC寄存器从最高有效位逻辑高开始,其余逻辑低,因此DAC最初产生的电压是参考电压的一半。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时间常数控制的指数增加的电压。如果在设置多路复用器后,将在SOME快速启动转换过程,转换结果将太低。如果您与ADC输入引脚串联具有显着电阻,则此问题会变得更糟糕,因为这有助于总输入电阻并使C上的电压样本向最终值上升得更慢。“稳定时间”指的是输入电压达到最终值所需要的时间,“跟踪时间”指的是你允许电压在开始转换之前稳定的时间。显然,如果你想要精确的测量,跟踪时间必须超过沉降时间。

该项目的目标是进行模拟到数字的转换,以证明ADC设置时间的影响。我们使用一个实验板,一些端接跳线和两个电阻,如下所示:

跳线连接到膨胀头上的适当引脚:

这个简单的电路给ADC发送稳定的1.65 V。通过夸大ADC输入电容的影响,大电阻有助于我们的分析。

端口I / O.

端口I/O配置与我们在前一篇文章中使用的相同,只是P1.1被配置为模拟输入。

外设和中断

SPI配置为上一篇文章。Timer4再次用于短延迟(根据微秒的顺序),现在我们也具有长延迟的Timer3(大约为毫秒或秒)。

如果我们希望它用作Timer3的时钟源,我们需要启用集成的低频振荡器(缩写LFOSC)。

ADC的启用和配置如下:

我们使用EFM8内部生成的参考电压,设置为2.4 V:

启用SPI中断是因为SPI传输由SPI中断服务例程中的状态机管理。中断在每个字节被传输之后触发。对于这个项目,我们还启用了“ADC0转换完全中断”。正如您可能已经猜到的那样,这个中断表明ADC寄存器保存了一个可以被处理的新转换值。

固件

该项目中的新固件包括用于ADC的简单中断服务例程,以及我们用于控制ADC和进程转换值的“AmbientLightMonitor_Main.c”中的代码。

adcfactor =(float)adc_vref_millivolts / adc_2power10;for(delay = 0;延迟<16; delay ++){//将ADC输入连接到地面SFRPAGE = ADC0_PAGE;ADC0MX = ADCMUXIN_GND;//延迟约20 US SFRPage = Timer4_Page;tmr4l = 0;而(TMR4L <40);//将ADC输入连接到P1.1并启动转换/ *在设置多路复用器和启动转换之间的延迟,并使用每个循环迭代开始转换* / 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); }

AmbientLightMonitor_Part2.zip

此代码的目的是重复取样输入电压,每个取样允许在设置多路复用器和开始转换之间有更多的时间。在每次转换之前,多路复用器首先配置为接地连接,以释放C上的任何电压样本。第一个转换使用可能的最小跟踪时间,因为该转换在为P1.1设置多路复用器后立即启动。接下来的16个转换在for循环中执行,跟踪时间随着每次迭代增加约500 ns。在应用标准公式将ADC值解释为物理测量后,每个测量结果都显示在LCD上:

每次转换后都包含一秒钟的延迟,以便我们有时间观察和思考测量结果。

分析

首先我们将使用LTSpice来预测C上的电压样本,假设我们的电路如下:

以下是结果:

正如预期的那样,我们有一个指数增长的电压,根据电路的总体RC时间常数接近标称值1.65 V。现在让我们运行固件(参考下面的视频)。我们看到显示的测量值随着跟踪时间的增加而逐渐增加;第一个测量值是1.04 V,因为在执行CPU指令和与SAR逻辑同步时出现不可避免的延迟,电压低于这个水平。你的直觉应该是“指数增长”,因为你观察到,随着时间的推移,从一个度量到下一个度量的增量逐渐减少。如果我们绘制17个测量值,假设样本之间的时间步长为490 ns,我们得到以下结果:

令人高兴的是,曲线的形状与指数增长相对应。然而,在实测数据中,从1v增加到1.6 V所需的时间约为4µs,而模拟预测为640 ns。为什么会有这么大的差异?首先,模拟中使用的ADC输入级是基于理想值的,不考虑阻抗的附加源。应用程序从硅实验室注意表明一个更现实的模型ADC输入阶段5 kΩ与10 pF系列,而不是550Ω系列5 pF。如果我们在仿真中使用这些值,1 V 1.6 V的时差是1.4µ年代。4µs与1.4µs之间仍存在显著差异;为了使实验和模拟结果一致,我们需要在ADC模块的外部加入寄生电容。如果我们假设输入引脚的杂散电容为20pf(这是数据表中给出的值),连接器垫、PCB轨迹或任何其他来源的杂散电容为2pf,我们有以下等效电路:

外部电容不能简单地添加到采样电容中,因为当多路复用器关闭开关时,外部电容已充满。相反,C上的电压样本上升非常快,因为外部电容通过R放电mux.,则当电压对C样本匹配C上的电压外部, C上的电压样本上升比之前的模拟要缓慢得多,因为可用的电流必须收取32 pF而不是10 pF。光标显示的标签在接下来的情节,电压增加所需的时间从1 3.8 V至1.6 V现在µ年代,同意与我们的实验值相当不错的大约4µ年代。

回顾

我们成功实现了EFM8的ADC功能,同时探索了与ADC输入级电阻和电容相关的限制。在我们的分压器中使用的大电阻和外部寄生电容的影响提醒我们,外部电路影响安定时间。EFM的ADC包括一个延迟跟踪模式(如上所述),它包含一个4 SAR时钟周期的跟踪周期,但你不能总是依赖于延迟跟踪模式,因为当外部电路包含大量电阻时,4个时钟的延迟可能不够。因此,精确的ADC测量取决于理解电路如何与ADC输入级相互作用,然后确保通过多路复用器选择ADC输入和开始转换之间有足够的延迟。

视频

系列的下一篇文章:环境光监测:测量和解释环境光线水平

自己试试这个项目吧!BOM。

1评论
  • Wouter Visee 2018年10月29日

    好文章!帮助我理解了EFM8 ADC的行为。自从本文发布以来,似乎有些寄存器名称已经发生了变化(例如,现在通过检查ADC中断标志ADC0CN0_ADINT来检查ADC是否准备好了),但是使用本文和数据表,就变得更加容易了。

    喜欢。 回复