1.AD转换原理介绍

1.1 ADC 转换步骤

AD 转换器(ADC)将模拟量转换为数字量通常要经过 4 个步骤:

采样、保持、量化和编码。所谓采样即是将一个时间上连续变化的

模拟量转换为时间上离散变化的模拟量。

将采样结果存储起来,直到下次采样,这个过程叫做保持。一般采样器和保

持电路一起总称为采样保持电路。将采样电平归化为与之接近的离散数字电平,

这个过程叫做量化。将量化后的结果按照一定数制形式表示就是编码。

将采样电平(模拟值)转换为数字值时,主要有两类方法:直接比

较型与间接比较型。

--直接比较型:就是将输入模拟信号直接与标准的参考电压比较,从而得到数字量。常见的有并行 ADC 和逐次比较型 ADC。

--间接比较型:输入模拟量不是直接与参考电压比较,而是将二者变为中间的某种物理量在进行比较,然后将比较所得的结果进行数字编码。常见的有双积分型 ADC。

1.2 ADC 转换原理

(1)逐次逼近型 ADC

基本原理是:从高位到低位逐次试探比较,就像用天平秤物体,从重到轻逐 级增减砝码进行试探。逐次逼近法的转换过程是:初始化时将逐次逼近寄存器各 位清零,转换开始时,先将逐次逼近寄存器最高位置 1,送入 DA 转换器,经 DA 转换后生成的模拟量送入比较器,称为 U0,与送入比较器的待转换的模拟量 Ux 进行比较,若 U0<Ux,该位 1 被保留,否则被清除。然后再将逐次逼近寄存器次 高位置 1,将寄存器中新的数字量送 DA 转换器,输出的 U0 再与 Ux 比较,若 U0<Ux, 该位 1 被保留,否则被清除。重复此过程,直至逼近寄存器最低位。转换结束后, 将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的 操作过程是在一个控制电路的控制下进行的。

(2)双积分型 ADC

 其基本原理:将输入电压变换成与其平均值成正比的时间间隔,再把此时间 间隔转换成数字量,属于间接转换。双积分法 AD 转换的过程是:先将开关接通 待转换的模拟量 Vi,Vi 采样输入到积分器,积分器从零开始进行固定时间 T 的 正向积分,时间 T 到后,开关再接通与 Vi 极性相反的基准电压 Vref,将 Vref 输入到积分器,进行反向积分,直到输出为 0V 时停止积分。Vi 越大,积分器输 出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是 输入模拟电压 Vi 所对应的数字量,实现了 AD 转换。

1.3 ADC 核心技术指标

(1)分辨率(Resolution)

分辨率指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与 2^n 的比值。分辨率又叫做精度,通常以数字信号的位数来表示。

(2)转换速率(Conversion Rate)

(3)量化误差(Quantizing Error)

(4)偏移误差(Offset Error)

(5)满刻度误差(Full Scale Error)

(6)线性度(Linearity)

2.F28335的ADC介绍

F28335 片内集成的 ADC 转换模块的核心资源是一个 12 位的模数

转换器。

F28335 ADC 转换模块具有 16 个通道,由 2 个独立的 8 通道模

块组成,这两个独立的 8 通道模块也可以级联成一个 16 通道模

块。尽管 AD 转换器中有多个输入通道和两个序列发生器,但只有

一个转换器。

两个 8 通道模块能够自动排序构成一系列转换器,每个模块可以通过模拟的 多路开关(MUX)选择 8 个通道中的任何一个通道。在级联模式下,自动序列发 生器是 16 通道的。对每一个序列发生器而言,一旦完成转换,所选通道的转换 值将存储到相应的 ADCRESULT 寄存器中。自动排序过程允许系统对同一个通道进 行多次变换,允许用户进行过采样算法从而得到比一般的单采样更精确的结果。

F28335 的 ADC 模块主要包括以下特点:

--12 位模数转换

--2 个采样保持器(S/H)

--同步或顺序采样

--模拟电压输入范围 0-3V

--ADC 转换时钟频率最高可配置为 25MHz,采样带宽 12.5MHz

--16 通道模拟输入

--排序器支持 16 通道独立循环“自动转换”,每次转换通道可以软件编程选择。

--16 个结果寄存器存放 ADC 转换的结果,转换后的数字量表示为:

数字值=4095*(输入模拟值-ADCLO)/3,输入模拟值在 0-3V 之间。

--多个触发源启动 ADC 转换(SOC):

①S/W--软件立即启动

②外部引脚

③ePWMx SOCA 启动

④ePWMx SOCB 启动

--灵活的中断控制,允许每个或者每隔一个序列转换结束产生中断请求

--排序器可工作在启动/停止模式

--采样保持(S/H)采集时间窗口有独立的预定标控制

2.1 ADC 时钟控制

外设时钟 HSPCLK 是通过 ADCTRL3 寄存器的 ADCCLKPS[3-0]位来分频的,然后 再通过寄存器 ADCTRL1 中的 CPS 位进行 2 分频或者不分频。此外,ADC 模块还通 过扩展采样获取周期调整信号源阻抗,这由 ADCTRL1 寄存器中的 ACQPS3-0 位控 制。这些位并不影响采样保持和转换过程,但通过延长转换脉冲的长度可以增加采样时间的长度,如下图所示:

 ADC 模块有几种时钟预定标方法,从而产生不同速度的操作时钟。如下图所 示,图中给出了 ADC 模块时钟的选择方法。

2.2 排序器的工作原理

(1)级联操作方式

启动 ADC 之前,首先要进行一些初始化的工作。初始化转换的最多通道数 (MAX_CONV),这个参数限制了最多有效通道数,对于级联模式,最大为 16, 在双排序方式下,最大为 8。假如输入信号为 6,设置值为 4,实际只有 4 个输 入有效通道。配置需要的转换输入信号对应的转换次序(CHSELxx),最终的转 换结果存放在各自的结果寄存器(RESULT0-RESULT15),结果寄存器不与输入通 道完全对应,而是结果寄存器与转换次序对应。16 通道对应结果寄存器如下:

1.级联排序器顺序采样模式

在级联排序器操作方式下,2 个 8 状态排序器(SEQ1 和 SEQ2)构成一个 16状态的排序器 SEQ 控制外部输入的模拟信号的排序,通过控制寄存器 CONVxx 的 4 位值确定输入引脚,其中最高位确定采用哪个采样保持缓冲器,其他 3 位定义 具体输入引脚。两个采样保持器对应各自的 8 选 1 多路选择器和 8 个输入通道。

2.级联排序器同步采样模式

如果一个输入来自 ADCINA0-ADCINA7,另一个输入来自 ADCINB0-ADCINB7, ADC 能够实现 2 个 ADCINxx 输入的同时采样。此外,要求 2 个输入必须有同样的 采样和保持偏移量(比如 ADCINA4 和 ADCINB4,不能是 ADCINA7 和 ADCINA6)。 为了让 ADC 模块工作在同步采样模式,必须设置 ADCTRL3 寄存器中的 SMODE_SEL 位为 1。

在同步采样模式下,CONVxx 寄存器的最高位不起作用,每个采样和保持缓冲 器对 CONVxx 寄存器低 3 位确定的引脚进行采样。例如,如果 CONVxx 寄存器的值 是 0110b,ADCINA6 就由采样保持器 A 采样,ADCINB6 有采样保持器 B 采样,和 1110b 的效果是一样的,如果 CONVxx 寄存器的值是 1001b,ADCINA1 由采样和保 持器 A 采样,ADCINB1 由采样和保持器 B 采样。采样保持两路可以同步进行,因 为有两个采样保持器,但是转换不可能同时进行。转换器首先转换采样保持器 A 中锁存的电压量,然后转换采样保持器 B 中锁存的电压量。采样保持器 A 转换的 结果保存到当前的 ADCRESULTn 寄存器(如果排序器已经复位,SEQ1 的结果放到 ADCRESULT0),采样保持器 B 转换的结果保存到下一个(顺延)ADCRESULTn 寄 存器(如果排序器已经复位,SEQ1 的结果放到 ADCRESULT1),结果寄存器指针 每次增加 2。

(2)双排序器操作方式

当 ADC 工作在双排序器工作方式下时,2 个 8 状态排序器(SEQ1 和 SEQ2)彼 此独立。在这种方式下 PWMA 触发 SEQ1,PWMB 触发 SEQ2,触发源是独立的。双 排序器工作方式可以将 ADC 看成两个独立的 AD 转换单元,每个单元由各自的触 发源触发转换。 在双排序器连续采样模式下,一旦当前工作的排序器完成排序,任何一个排 序器的挂起 ADC 开始转换都会开始执行。例如,当 SEQ1 产生 ADC 开始转换请求 时,AD 单元正在对 SEQ2 进行转换,完成 SEQ2 的转换后会立即启动 SEQ1。SEQ1 排序器有更高的优先级,如果 SEQ1 和 SEQ2 的 SOC 请求都没有挂起,并且 SEQ1 和 SEQ2 同时产生 SOC 请求,则 ADC 完成 SEQ1 的有效排序后,将会立即处理新的 SEQ1 的转换请求,SEQ2 的转换请求处于挂起状态。

双排序方式使用了 2 个排序器,SEQ1/SEQ2 能在一次排序过程中对 8 个任意 通道进行排序转换。每次转换结果保存在相应的结果寄存器中,这些寄存器由低 地址到高地址依次填充。

每个排序器中的转换通道个数依然受 MAXCONVn 控制,最大控制通道数为 7, 而不是前面的 16。该值在自动排序转换的开始时被载到自动排序状态寄存器 (AUTO_SEQ_SR)的排序计数器控制位(SEQ CNTR3-0),MAX CONVn 的值在 0-7 内变化。当排序器安排内核从 CONV00 开始按顺序转换时,SEQ CNTRn 的值从装 载值开始向下计数,直到 SEQ CNTRn 为 0.一次自动排序完成的转换数为 MAXCONVn+1。

一旦排序器接收到触发源开始转换(SOC)信号就开始转换,SOC 触发信号也 会装载 SEQ CNTRn 位,ADCCHSELSEQn 位自动减 1。一旦 SEQCNTRn 递减到 0,根 据寄存器 ADCTRL1 中的连续运行状态位(CONT_RUN)的不同会出现 2 种情况:

①如果 CONT_RUN 置 1,转换序列重新自动开始(比如 SEQ_CNTRn 装入最初的 MAX_CONV1 的值,并且 SEQ1 通道指针指向 CONV00)。在这种情况下,为了避免 覆盖先前转换的结果,必须保证在下一个转换序列开始之前读走结果寄存器的 值。当 ADC 模块产生冲突时(ADC 向结果寄存器写入数据的同时,用户从结果寄 存器读取数据),ADC 内部的仲裁逻辑保证结果寄存器的内容不会被破坏,发出 延时写等待。

②如果 CONT_RUN 没有置位,排序指针停留在最后的状态,SEQ_CNTRn 继续保 持 0。为了在下一个启动时重复排序操作,在下一个 SOC 信号到来之前不需使用 RST_SETQn 位复位排序器。

SEQ_CNTRn 每次归零时,中断标志位都置位,用户可以在中断服务子程序中 用 ADCTRL2 寄存器的 RST_SETQn 位将排序器手动复位。这样可以将 SETQn 状态复 位到初始值(SEQ1 复位值 CONV00,SEQ2 复位值 CONV08),这一特点在启动/停 止排序器操作时非常有用。

  1. 双排序器顺序采样

【例①】SEQ1 完成 7 个通道的模数转换,分别是模拟输入 ADCINA2、ADCINA3、 ADCINA2、ADCINA3、ADCINA6、ADCINA7 和 ADCINB4。

使用 SEQ1 完成 7 个通道的模数转换(模拟输入 ADCINA2、ADCINA3、ADCINA2、 ADCINA3 、ADCINA6 、 ADCINA7 和 ADCINB4) , 则 MAX_CONV 应 被 设为 6 ,且 ADCCHSELSEQn 寄存器的值确定如下所示:

  1. 双排序器同步采样

如果一个输入来至 ADCINA0-ADCINA7,另一个输入来至 ADCINB0-7,ADC 能够实现 2 个 ADCINxx 输入的同时采样。此外要求 2 个输入必须有同样的采样保持偏 移量(如 ADCINA4 和 ADCINB4,不能是 ADCINA7 和 ADCINB6)。为了让 ADC 模块 工作在同步采样模式,必须设置 ADCTRL3 寄存器中的 SMODE_SEL 位为 1.在同步 采样模式下,双排序器同级联排序器相比,主要区别在于排序器控制:在双排序 器中每个排序器分别控制 4 个转换 8 个通道,共构成 16 通道,而在级联排序器 的同步采样模式下,实际只是用 SEQ1 作为排序器,控制 8 个转换 16 个通道。

下面给出了双排序器模式下同步采样设计例子。

【例②】双排序器同步采样模式 ADC 应用实例

AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;//设置同步采样模式 AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x33;//设置 4 对转换,共 8 通道 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;//设置 ADCINA0 和 ADCINB0 AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;//设置 ADCINA1 和 ADCINB1 AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;//设置 ADCINA2 和 ADCINB2AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;//设置 ADCINA3 和 ADCINB3 AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x4;//设置 ADCINA4 和 ADCINB4 AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x5;//设置 ADCINA5 和 ADCINB5 AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x6;//设置 ADCINA6 和 ADCINB6 AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x7;//设置 ADCINA7 和 ADCINB7 AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;//使能 PWMA SOC 触发 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 =  1;//使能 SEQ1 中断

SEQ1 和 SEQ2 同时运行,将相应通道的转换结果存储到结果寄存器中:

3.排序器启动/停止模式

排序器的启动/停止模式是相对于连续的自动排序模式而言的,任何一个排 序器(SEQ1、SEQ2 或 SEQ)都可以工作在启动/停止模式,这种方式可在不同时 间上分别和多个启动触发信号同步。一旦排序器完成了第一个排序(假定排序器 在中断服务子程序中未被复位),可允许排序器不需要复位初始状态 CONV00 情 况下重新触发排序器。因此当一个转换序列结束时,排序器就停止在当前转换状 态。在这种工作模式下,ADCTRL1 寄存器中的连续运行位(CONT_RUN)必须设置 为 0。

4.输入触发源

每个排序器都有一系列可以使能或禁止的触发源。SEQ1、SEQ2 和级联 SEQ 的有效输入触发源如下图所示:

只要排序器处于空闲状态,SOC 触发源就能启动一个自动转换排序器。空闲 状态是指在收到触发信号前,排序器的指针指向 CONV00,或者是排序器已经完 成了一个转换排序,也就是 SEQ_CNTRn 为 0。如果转换序列正在运行时,到来一 个新的 SOC 触发信号,则 ADCTRL2 寄存器中的 SOC_SEQn 位置 1(该位在前一个 转换开始时已经清除)。但如果又一个 SOC 触发信号到来,则该信号将被丢失, 也就是当 SOC_SEQn 位置 1 时(SOC 挂起),随后的触发不起作用。被触发后, 排序器不能在中途停止或中断。程序必须等到一个序列的结束或复位排序器,才 能使排序器恢复到初始空闲状态(SEQ1 和级联的排序器指针指向 CONV00,SEQ1 的指针指向 CONV08)。当 SEQ1/2 用于级联同步采样模式时,SEQ2 的触发源被忽 略,SEQ1 的触发源有效。因此级联模式可以看做 SEQ1 有 16 个转换通道。

5.排序器转换的中断操作

排序器有两种中断工作模式,中断模式 1 为每个 EOS 转换结束信号到来时产生中断请求,中断模式 2 为每隔一个 EOS 转换结束信号到来时产生中断请求。这 两种方式由 ADCTRL2 寄存器中的中断模式使能控制位决定。

6.排序器覆盖功能

通常在运行模式下,排序器 SEQ1、SEQ2 或者级联 SEQ 用于选择 ADC 通道, 并将转换的结果存储在相应的 ADCRESULTn 寄存器中。在 MAX_CONVn 设置的转换 结束时,排序器自动返回 0。在使用排序器覆盖功能时,排序器的自动返回可通 过软件控制,这由 ADC 控制寄存器 1(ADCCTRL1)的第 5 位控制。例如假定 SEQOVRD 位为 0,ADC 工作在级联模式下的连续转换模式,MAX_CONV1 设置为 7,通常情况 下,排序器会递增并将 ADC 转换结果更新结果寄存器到 ADCRESULT7 寄存器,然 后返回到 0,。当 ADCRESULT7 寄存器更新完成后,相应的中断标志位被置位。当 SEQ_OVRD 位被重新置位,排序器在更新 7 个结果寄存器后不再回绕到 0,而将继 续增加,并更新 ADCRESULT8 寄存器,直到 ADCRESULT15 为止。ADCRESULT15 寄 存器更新完毕再返回到 0。这可以将结果寄存器看成 FIFO,用于 ADC 对连续数据 的捕捉。当 ADC 在最高数据速率下进行转换时,这个功能有助于捕捉 ADC 的数据。

2.3 ADC 电气特性

(1)参考电压选择

F28335 处理器的模数转换单元的参考电压有 2 种提供方式,即内部参考电压 和外部参考电压,外部参考电压分别为 2.048V、1.5V 或 1.024V。具体选择哪种 参考电压由控制寄存器 3 的第 8 位(EXTREF)控制,一般情况下,尽量选择内部 参考源。如下图所示:

这种设计方式为模数转换的增益校准提供了方便。为了获取良好的增益性 能,处理器要求 2 个参考引脚 ADCREFP 和 ADCREFM 的电压差为 1V。一般情况下, ADCREFP 电压为 2*(1±5%)V,ADCREFM 的电压为(1±5%)V。

(2)低功耗模式

ADC 支持 3 种不同的供电模式,分别为:ADC 上电、ADC 断电、ADC 关闭。这3 种模式由 ADCTRL4 寄存器控制。

(3)ADC 校验

ADC 校验子程序 ADC_cal()由生产商嵌入 TI 保留的 OTP 存储内。根据设备的具体校验数据,boot ROM 自动调用 ADC_cal()子程序来初始化 ADCREFSEL 和ADCOFFTRIM 寄存器。在通过运行过程中,该校验过程是自动完成的,用户无需进行任何操作。

(4)DMA 接口

位于外设 0 地址单元的 ADC 结果寄存器(0x0B00-0x0B0F)支持DMA 直接访问模式,由于 DMA 访问无需通过总线,所以这些寄存器同时支持 CPU 访问。位于外设 2 地址单元的 ADC 结果寄存器(0x7108-0x710F)不支持 DMA 访问。

2.4 ADC 相关寄存器

(1)ADC 模块控制寄存器 1(ADCTRL1)

(2)ADC 模块控制寄存器 2(ADCTRL2)

(3)ADC 模块控制寄存器 3(ADCTRL3)

(4)最大转换通道数(ADCMAXCONV)

(5)自动排序状态寄存器(ADCASEQSR)

(6)ADC 状态和标志寄存器

(7)ADC 输入通道选择排序控制寄存器

(8)结果寄存器(ADCRESULTn)

F28335 内部 AD 只有 12 位,用 16 位的结果寄存器来存储,所以还有 4 位是 保留位,当结果寄存器映射在外设帧 2 中需经 2 个等待状态,并采用左对齐,若 映射在外设帧 0 中,不需要等待,采用的是右对齐。

3.ADC配置步骤

ADC 相关库函数在 DSP2833x_Adc.c 和 DSP2833x_Adc.h 文件中。

(1)使能 ADC 外设时钟及设置 ADC 工作时钟

EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC
EDIS;EALLOW;
SysCtrlRegs.HISPCP.all = 3; // HSPCLK=SYSCLKOUT/(2*3)=25MHz
EDIS;

(2)ADC 初始化设置,包括对 ADCREFSEL 和 ADCOFFTRIM 寄存器设置等。

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

AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0f;//顺序采样方式
AdcRegs.ADCTRL3.bit.ADCCLKPS = 1;//ADC 工作 25M 下不分频
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;//软件出触发

(5)读取 ADC 转换值

Uint16 Read_ADCValue(void)
{while (AdcRegs.ADCST.bit.INT_SEQ1== 0);//查询转换是否结束AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除中断标志位return AdcRegs.ADCRESULT0>>4;//将转换结果返回出去(DSP寄存器为16位,而ADC采样结果为12位,且数据值放在了高12位,因此需要将低四位移除)
}

4.硬件设计

5.软件设计

本章所要实现的功能是:通过 ADCINA0 通道采集电位器电压,并将电压值通过数码管显示,定时器 0 控制 D1 指示灯闪烁,指示系统工作状态。

(1)ADC_seqmode

#define ADC_MODCLK 3
#define ADC_CKPS   0x1   // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz
#define ADC_SHCLK  0xf   // S/H width in ADC module periods = 16 ADC clocksvoid ADC_Init(void)
{// Specific clock setting for this example:EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADCEDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)EDIS;InitAdc();  // For this example, init the ADC// Specific ADC setup for this example:AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded modeAdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous runAdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0;// Start SEQ1AdcRegs.ADCTRL2.all = 0x2000;}Uint16 Read_ADCValue(void)
{while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4;
}void main()
{int i=0;float adc_vol;InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();TIM0_Init(150,200000);//200ms//SMG_Init();ADC_Init();while(1){adc_vol=(float)Read_ADCValue()*3.0/4096;}
}

(2)ADC_seqmode_ovd

#define ADC_MODCLK 3
#define ADC_CKPS   0x1   // ADC module clock = HSPCLK/2*ADC_CKPS   = 25.0MHz/(1*2) = 12.5MHz
#define ADC_SHCLK  0xf   // S/H width in ADC module periods                        = 16 ADC clocks// Global variable for this example
Uint16 SampleTable[BUF_SIZE]={0};//---------------------------------------------------------------------------
// InitAdc:
//---------------------------------------------------------------------------
// This function initializes ADC to a known state.
//
void InitAdc(void)
{extern void DSP28x_usDelay(Uint32 Count);// *IMPORTANT*// The ADC_cal function, which  copies the ADC calibration values from TI reserved// OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the// Boot ROM. If the boot ROM code is bypassed during the debug process, the// following function MUST be called for the ADC to function according// to specification. The clocks to the ADC MUST be enabled before calling this// function.// See the device data manual and/or the ADC Reference// Manual for more information.EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;ADC_cal();EDIS;// To powerup the ADC the ADCENCLK bit should be set first to enable// clocks, followed by powering up the bandgap, reference circuitry, and ADC core.// Before the first conversion is performed a 5ms delay must be observed// after power up to give all analog circuits time to power up and settle// Please note that for the delay function below to operate correctly the// CPU_CLOCK_SPEED define statement in the DSP2833x_Examples.h file must// contain the correct CPU clock period in nanoseconds.AdcRegs.ADCTRL3.all = 0x00E0;  // Power up bandgap/reference/ADC circuits/˳�����DELAY_US(ADC_usDELAY);         // Delay before converting ADC channels
}void ADC_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADCEDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK;    // HSPCLK = SYSCLKOUT/2*ADC_MODCLKEDIS;InitAdc();  // For this example, init the ADC// Specific ADC setup for this example:AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;  //Sequential mode: Sample rate   = 1/[(2+ACQ_PS)*ADC clock in ns]//                  = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)//                  = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)// If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded modeAdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous runAdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;       // Enable Sequencer override featureAdcRegs.ADCCHSELSEQ1.all = 0x0;         // Initialize all ADC channel selects to A0AdcRegs.ADCCHSELSEQ2.all = 0x0;AdcRegs.ADCCHSELSEQ3.all = 0x0;AdcRegs.ADCCHSELSEQ4.all = 0x0;AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7;  // convert and store in 8 results registers// Start SEQ1AdcRegs.ADCTRL2.all = 0x2000;
}Uint16 Read_ADC_CH0_Value(void)
{while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4;
}void Read_ADC_SEQ1_Value_OVD(void)
{Uint16 array_index=0;while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
}void main()
{int i=0;InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();TIM0_Init(150,200000);//200ms//SMG_Init();ADC_Init();while(1){Read_ADC_SEQ1_Value_OVD();}
}

(3) ADC_soc

#define ADC_MODCLK 3
#define BUF_SIZE   16  // Sample buffer sizevoid ADC_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADCSysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Disable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1EDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK;    // HSPCLK = SYSCLKOUT/2*ADC_MODCLKEDIS;// Interrupts that are used in this example are re-mapped to// ISR functions found within this file.EALLOW;  // This is needed to write to EALLOW protected registerPieVectTable.ADCINT = &adc_isr;EDIS;    // This is needed to disable write to EALLOW protected registersInitAdc();  // For this example, init the ADC// Enable ADCINT in PIEPieCtrlRegs.PIEIER1.bit.INTx6 = 1;IER |= M_INT1; // Enable CPU Interrupt 1EINT;          // Enable Global interrupt INTMERTM;          // Enable Global realtime interrupt DBGMAdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;       // Enable Sequencer override featureAdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;// Setup ADCINA1 as 2nd SEQ1 conv.AdcRegs.ADCMAXCONV.bit.MAX_CONV1= 0x1;  // Setup 2 conv's on SEQ1AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)// Assumes ePWM1 clock is already enabled in InitSysCtrl();EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A groupEPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcountEPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st eventEPwm1Regs.CMPA.half.CMPA = 0x0080;    // Set compare A valueEPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1EPwm1Regs.TBCTL.bit.CTRMODE = 0;          // count up and start
}interrupt void  adc_isr(void)
{static Uint16 i=0;i++;AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1if(i==1000){i=0;SampleTable[0]= ( (AdcRegs.ADCRESULT0)>>4);SampleTable[1]= ( (AdcRegs.ADCRESULT1)>>4);}// Reinitialize for next ADC sequenceAdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bitPieCtrlRegs.PIEACK.bit.ACK1 = 1;   // Acknowledge interrupt to PIE
}Uint16 Read_ADC_CH0_Value(void)
{while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4;
}void Read_ADC_SEQ1_Value_OVD(void)
{Uint16 array_index=0;while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT1)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT2)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT3)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT4)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT5)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT6)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT7)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT8)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT9)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT10)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT11)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT12)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT13)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT14)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT15)>>4);
}void main()
{int i=0;InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();TIM0_Init(150,200000);//200ms//SMG_Init();ADC_Init();while(1){//SMG_DisplayInt(SampleTable[ADC_Sample_CH_Num]);}
}

DSP ADC模数转换相关推荐

  1. STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)

    嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节 ...

  2. STM32 ADC模数转换

    STM32 ADC模数转换 独立模式/双重DMA/三重DMA //使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //APB2 ...

  3. 51单片机ADC模数转换

    51单片机ADC模数转换 ADC介绍 1.ADC简介 ​        ADC(analog to digital converter)也称为模数转换器,是指一个将模拟信号转变为数字信号.单片机在采集 ...

  4. 30、T5L 迪文屏 C51开发之 ADC模数转换

    T5L 迪文屏 C51开发之 ADC模数转换 1.介绍 2.例程功能介绍 3.GUI界面设计 4.C51程序设计 1.介绍   T5L 芯片内部的 ADC 模数转换外设,有一点需要注意的是此 ADC ...

  5. STM32CubeMX系列|ADC模数转换

    ADC模数转换 1. ADC简介 ADC(analog to digital converter)即模数转换器,它可以将模拟量信号转换为数字信号,按照转换原理主要分为逐次逼近型.双积分型.电压频率转换 ...

  6. STM32-(28):ADC模数转换(理论分析)

    上一篇:STM32-(27):RTC实时时钟 下一篇:STM32-(29):ADC模数转换(实验) ADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模数转换器 ...

  7. 51单片机 | ADC模数转换实验

    文章目录 一.ADC介绍 1.ADC简介 2.ADC 转换原理 二.XPT2046 芯片介绍 三.硬件设计 四.软件设计 1.ADC 读写函数 2.主函数 五.实验现象   前面我们介绍的都是对数字信 ...

  8. STM32之ADC模数转换

    对于STM32的GPIO来说,只能读取引脚的高低电平,要么低电平,要么高电平,只有两个值,而使用了ADC之后,我们就可以对这个高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量, ...

  9. 用Proteus仿真Arduino UNO ADC模数转换

    用Proteus仿真Arduino UNO ADC模数转换 官方示例代码地址:https://docs.arduino.cc/built-in-examples/basics/AnalogReadSe ...

  10. 51单片机——ADC模数转换实验

    目录 一.功能描述 二.ADC介绍 2.1 逐次逼近型ADC转换原理 2.2 ADC的主要技术指标 三.XPT2046芯片介绍 3.1 XPT2046外部引脚 3.2 XPT2046的命令字 3.3 ...

最新文章

  1. VMware CTO:未来VMware NSX与思科ACI将有更多整合
  2. npm install 时--save-dev和--save的区别
  3. SAP与Ariba在数据分析领域的互补共赢
  4. C语言extern关键字(去使用外部全局变量、函数)
  5. C语言中要改变循环语句的流程可以使用的语句有哪些
  6. 用php实现随机点名,使用javascript做的一个随机点名程序
  7. leetcode 1223 python
  8. 电子商务有哪些相关工作?
  9. VB SendMessage向其他程序窗口发送字符串消息实例
  10. springboot2集成hbase2环境搭建
  11. 微信接口_收货地址共享
  12. python3基础题目 100例_Python3.x 基础练习题100例(51-60)
  13. 基于cat12和SPM12进行SBM数据分析笔记
  14. ITPUB的若干牛人
  15. 大数据新闻推送你怎么看_如何看待大数据精准推送,使人的视界越来越窄?
  16. 光谱辐射计算(MATLAB)
  17. maven打包报错:-source 1.5 中不支持 diamond 运算符
  18. [中国近代史] 第四章测试
  19. 放弃去FBI的机会,在美做了2年数据研究工作,如今回国创业,他把全球最顶级的智能预测算法带到了国内
  20. java——财务支票大写汉字转换

热门文章

  1. 微软服务器如何启动tomcat,Windows服务器下重启Tomcat服务步骤
  2. 微信小程序开发者工具详解
  3. 英语语音识别软件_识别英语语音的软件_英文语音识别软件 - 云+社区 - 腾讯云...
  4. [LTE] LTE基本架构
  5. BM3D(Block-Matching and 3D filtering)读后感
  6. at24c32 linux,AT24C32使用方法总结
  7. 软件测试项目实战学习路线
  8. (2020)最新 java 多线程面试题(其一)
  9. 聊天室 作业 java_java大作业设计报告-java聊天室.docx
  10. com词根词缀_英语词根字典 - 词根词缀大全 - 优词英语词根表