28335学习之《模数转换器ADC》
模拟输入电压为3V,将ADResult中的值右移4位,值为OxFFF,即4095,(ADResult>>4) = ((Vinput-ADCLO)/3.0)*4095,实际中都是读取ADResult中的值,然后求得实际输入的模拟电压值。ADC可以对一个序列多个通道的转换进行排序,每当ADC收到一个转换的请求,便能自动完成这个序列所有通道的转换。如果在ADC转换SEQ1序列的时候,SEQ2序列仍在等待
文章目录
第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模块的特点
-
16个模拟量输入引脚,ADCINA0ADCINA7、ADCINB0ADCINB7
-
具备12位的ADC内核,内置两个采样保持器S/H-A、S/H-B
-
ADC模块的时钟频率最高可配置为25MHz,采样频率最高为12.5MSPS,即每秒最高完成12.5个百万次的采样。Million samples per second
-
ADC模块的自动序列发生器可以按两个独立的8状态序列发生器来运行,也可以按一个16为序列发生器来运行,每个通道都允许系统对同一个通道进行多次采样。
-
ADC采样输入的范围为03V,电压过高或者为负电压都会烧毁DSP,通常输入的采样信号先经过调理电路,使其输入电压范围03V。
-
ADC的参考电压是影响AD转换精度的重要因素,需要注意ADC参考源的电压纹波处理。
-
F28335可以通过寄存器来选择使用内部参考电压还是外部参考电压
-
ADC对一个序列的通道进行转换需要有一个启动信号,或者触发信号,当启动信号到来时,相应的序列发生器就开始对其内部预先指定的通道进行转换。
-
ADC模块共有16个结果寄存器,每个结果寄存器都是16位。采用左对齐,低4位被忽略。
-
模拟输入电压为3V,结果寄存器中数字量是0xFFF0,即65520;模拟输入电压为0V,结果寄存器中数字量是0x0000,即0,ADC转换特性为线性关系。则ADResult = ((Vinput-ADCLO)/3.0)*65520,ADResult是结果寄存器中的数字量,Vinput是模拟电压输入值,ADCLO是ADC转换的参考电平,通常将其与AGND接在一起,即ADCLO的值为0。
-
模拟输入电压为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))
- XCLKIN指外部输入的时钟,就是外部晶振产生的时钟
-
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
-
双序列模式下的顺序采样与级联模式下的顺序采样区别:
- 最大转换通道寄存器设置不同
- 通道选择控制寄存器使用不同
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模块的序列发生器支持两种中断方式:
- 中断请求出现在每一个序列转换结束时,每转换完一个序列,便产生一个中断
- 中断请求出现在每隔一个序列转换结束时
- 可以通过控制寄存器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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)