第11章 模数转换器ADC

  • 现实世界很多量都是模拟量,在DSP中,所有的量都是数字量。
  • Analog-to-Digital converter=ADC模数转换器
  • 将模拟量转化为数字量,通常需要4步:
    • 采样:将一个时间上连续变化的模拟量转化为时间上离散变化的模拟量
    • 保持:将采样结果存储起来,直到下次采样
    • 量化:将采样电平归化为与直接进的离散数字电平
    • 编码:将量化后的结果按照一定数制形式表示
  • ADC的关键指标:
    • 分辨率:数字量变化一个最小量时,模拟信号的变化量
    • 转换速率
    • 量化误差
    • 偏移误差
    • 满刻度误差
    • 线性度

11.1 F28335内部的ADC模块

  • F28335内部12位分辨率的、具有流水线结构的模数转换器
  • 由16个采样通道,分为两组ADCINA0ADCINA7、ADCINB0ADCINB7
  • A组通道采用采样保持器A,即S/H/A
  • B组通道采用采样保持器B,即S/H/B
  • 虽然有多通道输入,内部只有一个转换器,同一时刻只能对一路输入信号进行转换
  • 当有多路输入信号需要转换时,ADC模块通过前端模拟多路复用器analog mux进行控制,同一时刻,只允许让一路信号输入到ADC的转换器中。
  • 通过控制analog mux中的开关闭合,使得选择的通道信号进入转换器中
  • 用户可以通过编程为序列发生器指定需要转换的通道顺序
  • F28335的ADC模块有2个8状态的序列发生器SEQ1和SEQ2,分别对应两个通道,此时ADC工作于两个独立的8通道模块之上。当ADC级联成一个16通道的模块时,SEQ1和SEQ2也级联成一个16状态的序列发生器SEQ。
  • F28335共有16个结果寄存器ADCRESULT0~ADCRESULT15
    多路转换示意图

11.1.1 ADC模块的特点

  1. 16个模拟量输入引脚,ADCINA0ADCINA7、ADCINB0ADCINB7

  2. 具备12位的ADC内核,内置两个采样保持器S/H-A、S/H-B

  3. ADC模块的时钟频率最高可配置为25MHz,采样频率最高为12.5MSPS,即每秒最高完成12.5个百万次的采样。Million samples per second

  4. ADC模块的自动序列发生器可以按两个独立的8状态序列发生器来运行,也可以按一个16为序列发生器来运行,每个通道都允许系统对同一个通道进行多次采样。

  5. ADC采样输入的范围为03V,电压过高或者为负电压都会烧毁DSP,通常输入的采样信号先经过调理电路,使其输入电压范围03V。

  6. ADC的参考电压是影响AD转换精度的重要因素,需要注意ADC参考源的电压纹波处理。

  7. F28335可以通过寄存器来选择使用内部参考电压还是外部参考电压

  8. ADC对一个序列的通道进行转换需要有一个启动信号,或者触发信号,当启动信号到来时,相应的序列发生器就开始对其内部预先指定的通道进行转换。
    在这里插入图片描述

  9. ADC模块共有16个结果寄存器,每个结果寄存器都是16位。采用左对齐,低4位被忽略。

  10. 模拟输入电压为3V,结果寄存器中数字量是0xFFF0,即65520;模拟输入电压为0V,结果寄存器中数字量是0x0000,即0,ADC转换特性为线性关系。则ADResult = ((Vinput-ADCLO)/3.0)*65520,ADResult是结果寄存器中的数字量,Vinput是模拟电压输入值,ADCLO是ADC转换的参考电平,通常将其与AGND接在一起,即ADCLO的值为0。

  11. 模拟输入电压为3V,将ADResult中的值右移4位,值为OxFFF,即4095,(ADResult>>4) = ((Vinput-ADCLO)/3.0)*4095,实际中都是读取ADResult中的值,然后求得实际输入的模拟电压值。

11.1.2 ADC的时钟频率和采样频率

在这里插入图片描述

  • ADC模块的时钟ADCLK:

    • XCLKIN指外部输入的时钟,就是外部晶振产生的时钟
      • m≠0 : SYSCLKOUT = OSCCLK*m/2
      • m=0 : SYSCLKOUT = OSCCLK
    • HSPCLK指高速外设时钟
      • n≠0 : HSPCLK = SYSCLKOUT / (2*n)
      • n=0 : HSPCLK = SYSCLKOUT
    • 当PCLKCR[ADCENCLK]=1,HSPCLK输入ADC模块
    • AD控制寄存器ADCTRL3的0~3位ADCLKPS,可以对HSPCLK进行分频
    • AD控制寄存器ADCTRL1的CPS位可以提供一个二分频
    • ADCLK指ADC模块的时钟:
      • ADCLKPS=0 : ADCLK = HSPCLK / (CPS+1)
      • ADCLKPS≠0 : ADCLK = HSPCLK / (2ADCLKPS(CPS+1))
  • AD时钟频率不能超过25MHz

  • 设置完ADCLK,需要选择采样窗口的大小

  • 对于S/H电路,采样窗口就是采样时间,或者采样脉冲的宽度

  • 为了获得准确和稳定的ADC转换值,通常需要设置较低的时钟频率和较大的采样窗口。

  • ADC的时钟频率是指每秒有多少个时钟脉冲,取决于外部的时钟输入和各个环节的倍频或者分频的系数。

  • 转换时间:ADC完成一个通道或者一个序列的转换所需要的时间。由ADC的时钟频率来决定

  • 采样频率:ADC模块每秒能够完成多少次采样,取决于启动ADC的频率

  • 例如每隔1ms启动一次ADC,则采样频率就是1kHz,采样频率跟时钟频率和转换时间没有关系,根据采样定理和工程需求来确定。

  • F28335最高采样频率为12.5MSPS

    在这里插入图片描述

11.2 ADC模块的工作方式

  • 序列发生器:为需要转换的通道安排转换的顺序。

  • 双序列发生器方式:2个8状态发生器

  • 单序列发生器方式(级联方式):2个8序列发生器级联为1个16位发生器

  • ADC可以对一个序列多个通道的转换进行排序,每当ADC收到一个转换的请求,便能自动完成这个序列所有通道的转换。在转换过程中,模拟复用器选择序列发生器中指定的通道进行转换,转换后的结果保存到相应的结果寄存器中。

  • F28335的16个通道可以通过编程来为序列发生器中需要转换的通道安排顺序。这个功能需要通过ADC输入通道选择序列控制寄存器ADCCHSELSEQx(x=1,2,3,4)来实现。每个输入通道选择序列控制寄存器都是16位的,被划分成4个功能位CONVxx,每一个功能位占据寄存器4位。在AD转换过程中,当前CONVxx的位定义了要进行转换的引脚。

  • 双序列发生器模式下时,SEQ1使用ADCCHSELSEQ1、2;SEQ2使用ADCCHSELSEQ3、4

  • 单序列发生器模式下,SEQ使用ADCCHSELSEQ1、2、3、4
    在这里插入图片描述

  • 采样方式:

    • 顺序采样:
      • 按照序列发生器内的通道顺序一个通道的采样,即ADCINA0、ADCINA1…
      • 通道选择控制寄存器中CONVxx的4位均用来定义引脚,最高位0,表示采样A组,最高位1,表示采样B组,低3位定义的是偏移量,决定某一组内的某个特定引脚。
      • CONVxx=0101b,选择的通道是ADCINA5
      • CONVxx=1011b,选择的通道是ADCINB3
    • 并发采样:
      • 一对一对通道进行采样,即ADCINA1&ADCINB1、ADCINA2&ADCINB2…
      • 通道选择控制寄存器中CONVxx的最高位被舍弃,低3位有效
      • CONVxx=0101b,采样保持器S/H-A对通道ADCINA5进行采样,紧接着采样保持器S/H-B对通道ADCINB5进行采样
      • CONVxx=1011b,采样保持器S/H-A对通道ADCINA35进行采样,紧接着采样保持器S/H-B对通道ADCINB3进行采样
  • 最大转换通道寄存器ADCMAXCONV,决定了一个采样序列所要进行转换的通道总数。

    • 当ADC工作于双序列模式时,SEQ1使用位MAXCONV1_0MAXCONV1_2,即ADCMAXCONV[0:2],SEQ2使用位MAXCONV2_0MAXCONV2_2,即ADCMAXCONV[4:6]
    • 当ADC工作于级联模式时,SEQ使用位MAXCONV1_0~MAXCONV1_3,即ADCMAXCONV[0:3]
    • 最大通道数等于MAXCONVn+1,如果某个序列发生器需要转换6个通道,则MAXCONVn的值为5
      在这里插入图片描述

11.2.1 双序列发生器模式下顺序采样

在这里插入图片描述

  • 使用序列发生器SEQ1、SEQ2

  • 最大转换通道寄存器MAXCONV1和MAXCONV2,两个位都是7

  • SEQ1用到采样通道选择控制寄存器ADCCHSELSEQ1&2,SEQ2用到采样通道选择控制寄存器ADCCHSELSEQ3&4
    在这里插入图片描述

  • 在双序列发生器模式下,SEQ1&2是独立工作的,但是ADC转换模块只有1个,SEQ1的优先级高于SEQ2的优先级

  • 如果在ADC转换SEQ1序列的时候,SEQ2序列仍在等待,这是SEQ1又产生了一个转换请求,则当ADC转换完成之后,仍然先响应SEQ1的转换请求,SEQ2继续等待。

11.2.2 双序列发生器模式下并发采样

  • ADC工作于双序列模式下,需要序列发生器SEQ1和SEQ2
  • 最大转换通道寄存器用到位MAXCONV1和MAXCONV2,2个位的值是3
  • SEQ1需要用到通道选择控制寄存器ADCCHSELSEQ1,SEQ2需要用到通道选择控制寄存器ADCCHSELSEQ3
    在这里插入图片描述

11.2.3级联模式下顺序采样

  • 级联模式下,SEQ1与SEQ2级联成16状态的序列发生器SEQ

  • 需要对16个通道进行采样,MAXCONV1=15

  • 顺序采样,需要用到ADCCHSELSEQ1&2&3&4
    在这里插入图片描述

  • 双序列模式下的顺序采样与级联模式下的顺序采样区别:

    1. 最大转换通道寄存器设置不同
    2. 通道选择控制寄存器使用不同

11.2.4 级联模式下并发采样

  • MAXCONV1=7
  • SEQ用到通道选择控制寄存器ADCCHSELSEQ1&2
  • 最多使用级联模式下的顺序采样
  • 需要计算瞬时功率,可以采样并发采样,一路采集电压,一路采集电流

11.2.5 序列发生器连续自动序列化模式和启动/停止模式

  • ADC序列发生器工作流程:
    请添加图片描述

  • 根据ADC控制寄存器ADCCTRL1的位CONT RUN状态的不同,ADC序列发生器可工作于连续自动序列化模式或者启动/停止模式

    • CONT RUN=1,连续自动序列化模式,为了避免重写数据,必须确保在下一次转换序列开始前,读取结果寄存器。
    • CONT RUN=0,启动/停止模式,完成一次序列转换后,为了再一次转换,需要手动复位序列发生器,使得状态指针重新指向CONV00,否则状态指针将指向CONV08,然后必须等待转换请求SOC的到来。手动复位序列发生器SEQ1的方式:AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    • 通常选择启动/停止模式,该模式下比较容易设置ADC采样的频率,1s内启动多少次ADC的转换,采样频率就是多少。

11.3 ADC模块的中断

  • 当序列发生器完成一个序列的转换时,会对该序列发生器的中断标志位进行置位,如果该发生器的中断使能,则ADC模块向PIE控制器提出中断请求。
  • 工作在双序列模式时,2个序列发生器可以单独设置中断标志位和使能位
  • 工作在级联模式时,设置序列发生器SEQ1的中断标志位和使能位便可以产生ADC转换的中断。
  • 双序列模式下,产生的中断都是ADCINT,位于PIE控制器第一组第6个
  • ADC模块的序列发生器支持两种中断方式:
    1. 中断请求出现在每一个序列转换结束时,每转换完一个序列,便产生一个中断
    2. 中断请求出现在每隔一个序列转换结束时
    3. 可以通过控制寄存器ADCCTRL2的中断方式使能控制位来设置

11.4 参考电压的选择

  • 参考电压是影响AD转换精度的一个重要因素。
  • F28335内部的ADC通过ADCREFSEL来选择使用内部参考电压还是外部参考电压。
  • 默认采用内部参考电压。

11.5 ADC模块的寄存器

在这里插入图片描述

  • 位于外设0地址单元内的结果寄存器地址(0x0B000x0B0F)支持DMA直接访问,DMA访问无需通过总线,支持CPU的直接访问,位于外设2地址单元内的结果寄存器(0x71080x7117)不支持DMA访问

11.6 ADC采样的例程

  • 若ADC模块工作与级联模式,实现对引脚ADCINA07、ADCINB0B7的采样。
  • 建议对于不使用的ADC引脚,最好将其接地,采样的数据就是0
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐