28335学习笔记5——F28335 ADC相关介绍

1.AD转换原理

将模拟量转换为数字量通常要经过4个步骤:采样、保持、量化和编码。
采样:将一个时间上连续变化的模拟量转换为时间上离散变化的模拟量。
保持:将采样结果存储起来, 直到下次采样。
量化:将采样电平归化为与之接近的离散数字电平。
编码:将量化后的结果按照一定数制形式表示。
主要有两类方法:直接比较型与间接比较型。
直接比较型:就是将输入模拟信号直接与标准的参考电压比较, 从而得到数字量。 常见的有并行 ADC 和逐次比较型 ADC。
间接比较型:输入模拟量不是直接与参考电压比较, 而是将二者变为中间的某种物理量在进行比较, 然后将比较所得的结果进行数字编码。 常见的有双积分型 ADC。

2.F28335 ADC

F28335具有12位的模数转换器。ADC转换模块具有16个通道,由2个独立的8通道转换模块组成,这两个独立的8通道模块也可以级联成一个16通道模块。尽管AD转换器中有多个输入通道和两个序列发生器,但只有一个转换器。内部结构如下图所示:
在这里插入图片描述
在级联模式下,自动序列发生器是16通道的。对每个序列发生器而言,一旦完成转换,所选通道的转换值将存储到相应的ADCRESULTn寄存器中。序列发生器支持对同一通道进行多次采样,从而支持用户的过采样算法。
F28335ADC模块主要特点:
–12 位模数转换
–2 个采样保持器(S/H)
–同时或顺序采样
–模拟电压输入范围 0-3V
–ADC 转换时钟频率最高可配置为 25MHz,采样带宽 12.5MHz
–16 通道模拟输入
–排序器支持 16 通道独立循环“自动转换” , 每次转换通道可以软件编程选择。
–16 个结果寄存器存放 ADC 转换的结果, 转换后的数字量表示为:
数字值=4095*(输入模拟值-ADCLO) /3, 输入模拟值在 0-3V 之间
–多个触发源启动 ADC 转换(SOC) :
–灵活的中断控制, 允许每个或者每隔一个序列转换结束产生中断请求
–排序器可工作在启动/停止模式
–采样保持(S/H) 采集时间窗口有独立的预定标控制
注:F28335的AD输入范围为0-3V,若输入负电压或高于3V的电压就会烧坏AD模块。超出输入范围的电压可在前级电路,通过电阻进行分压,或经过运放比例电路进行处理后再输入。连接到ADCINxx引脚的模拟输入信号要尽可能的远离数字电路信号线,ADC模块的电源供电要与数字电源隔离开,避免数字电源的高频干扰,ADC的参考源是影响AD精度的一个重要因数。

3.排序器工作原理

ADC 转换模块有 2 个独立的 8 状态排序器(SEQ1 与 SEQ2),这两个排序器还可以级联为 1 个 16 状态的排序器(SEQ)。2 个排序器可有两种操作方式, 分别为单排序器方式(级联为1 个 16 状态排序器, 即级联方式) 和双排序器方式(2 个独立的 8 状态排序器) 。排序器级联操作方式的结构如下图所示:
在这里插入图片描述
双排序器方式内部结构图如下所示
在这里插入图片描述

4.ADC配置步骤

ADC相关库函数在DSP2833x_Adc.c和DSP2833x_Adc.h文件中。
(1)使能ADC外设时钟及设置ADC工作时钟(有一个最大的工作频率)

EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC
EDIS;

系统时钟 150M 不能直接供 ADC 工作时钟使用, 需分频后才行

EALLOW;
SysCtrlRegs.HISPCP.all = 3; // HSPCLK = SYSCLKOUT/(2*3)=25MHz
EDIS;

(2)ADC初始化设置,包括对 ADCREFSEL 和 ADCOFFTRIM 寄存器设置等。TI 已经提供了一个函数完成该初始化。 调用的 ADC 初始化函数如下:

void InitAdc(void);

(3)ADC 工作方式设置, 包括采样方式、 工作频率、 采样通道数等。

AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0f;//设置启动脉冲的宽度
AdcRegs.ADCTRL3.bit.ADCCLKPS = 1;//ADCLK=HSPCLK/2=12.5MHz
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;// 1 序列发生器工作在级联模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;//A0 为采样通道
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;//连续采样模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0;//最大采样通道数, 因为只用到 A0, 所以只有 1 个, 即数值为 0。

(4)选择ADC触发方式,开始转换

AdcRegs.ADCTRL2.all = 0x2000;//软件触发,ADC开始工作

(5)读取ADC转换值,有效数据是高 12 位,所以读取后的值要将低 4 位移除。

Uint16 Read_ADCValue(void)
{
    
    
while (AdcRegs.ADCST.bit.INT_SEQ1== 0);//查询转换是否结束
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除中断标志位
return AdcRegs.ADCRESULT0>>4;//将转换结果返回出去
}

猜你喜欢

转载自blog.csdn.net/qq_39529052/article/details/106272016