一、ADC介绍

1.1 ADC功能框图

简介:12位ADC,16路通道;
2个采样保持器,1个转换器,16路结果寄存器;
ADC 转换时钟频率最高可配置为 25MHz,采样带宽 12.5MHz
电压输入范围:0-3V;
触发源:软件触发、ePWM、GPIO XINT2。

ADC框图

1.2 ADC时钟分配

时钟分频

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

ADC模块具有若干预分频器级以产生任何期望的ADC操作时钟速度(下图是时钟树提供到ADC)
ADC模块时钟

ADC时钟分频举例:

系统时钟无法直接给ADC模块提供时钟源,因此需要经过分频得到HISPCLK,因此ADC时钟最大为25MHz
ADC时钟分频举例
*注:
Acquistion time 采集时间
MSPS:每秒百万次采样
kSPS:每秒千次采样

1.3 级联模式与双排序模式

  • 级联模式与双排序模式区别是:序列器是否合并使用,合并使用触发源只有一个,分开则各自独立触发源。

1.3.1 级联模式

级联模式将两个独立的8通道序列器(SEQ1 & SEQ2)组合成一个16通道序列器(SEQ),触发源是其中某一种触发方式。

级联模式

1.3.2 双排序模式

两个独立序列器(SEQ1、SEQ2),其触发源也是独立的。

双序列模式

1.4 顺序采样与同步采样

顺序采样可以理解为串行,即采样完n通道,再采样n+1通道;
同步采样可以理解为并行,即同时进行,值得注意的是一次只有两通道同步采样。

1.4.1 顺序采样(ADCTRL3.bit.SMODE_SEL = 0,默认)

从图中可以看出,S为采样时间,C1为从采样窗口到结果寄存器更新时间(可以理解为转换时间),通道n转换时,可以进行通道n+1的采样,因为二者寄存器工作互不影响。
顺序采样

1.4.2 同步采样(ADCTRL3.bit.SMODE_SEL = 1)

从图中可以看出,S为采样时间,C1为Ax通道采样到结果寄存器更新时间,C2为Bx通道采样到结果寄存器更新时间,由于转换器(Converter)只有一个,所以转换不能同时进行,但采样保持器(S/H-A & S/H-B)有两个,采样与保持可以同步进行,然后将结果对应保存到ADCRESULTn(S/H-A结果)和ADCRESULTn+1(S/H-B结果)。
同步采样
在同步采样模式下, 如果 CONVxx 寄存器的值是 0110b(对应选择ADCINA6 ),就由采样保持器 A 采样,ADCINB6 有采样保持器 B 采样,和 1110b (对应选择ADCINB6 )的效果是一样的。转换结果对应存放在如下图所示的寄存器中:
存储结果

1.5 触发源

各种模式下对应的触发源选择:
触发源

  1. 软件触发(software):软件执行ADC转换
  2. ePWMx SOCA & SOCB:设置PWM计数器,定时触发ADC转换(参考Example_2833xAdcSoc.c)
  3. 外部触发源(external pin):外部引脚触发

1.6 ADC_Cal()两种调用方法

1.6.1 添加汇编文件

  1. 工程内添加DSP2833x_ADC_cal.asm文件
  2. 使用ADC_Cal()进行调用

1.6.2 使用指针指向内部固化地址

如下图所示,定义函数指针,指向0x380080(不同芯片不同),使用(*ADC_Cal)()进行调用

ADC_Cal指针指向

二、代码讲解及寄存器介绍

官方例程:Example_2833xAdcSeqModeTest.c


2.1 配置时钟源

2.1.1 配置高速时钟源

// ADC start parameters
#if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT
  #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
  #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)   = 25.0 MHz
#endif

// Specific clock setting for this example:
   EALLOW;
   SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/ADC_MODCLK
   EDIS;

高速外围时钟预分频器定义如下:

高速外围时钟预分频器


2.1.2 ADCCLK配置

#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

// Specific ADC setup for this example:
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;

ADCTRL1[11-8]:ACQ_PS
本例中,ACQ_PS = 0xF = 15,S/H width in ADC module periods = 16 ADC clocks
采样时间(Acquisition time)计算公式:A_t = (1 /25M) × (ACQ_PS + 1)
即1.4.1和1.4.2图中的SOC(采样时间大小)

采样时间计算
ACQ_PS


ADCTRL3[1-4]:ADCCLKPS
ADCCLK = HSPCLK / [n*(ADCTRL1[7]:CPS + 1)]
本例中:ADCCLKPS=0x01,CPS = 0
即:ADCCLK = HSPCLK / 2*1 = 25MHz / 2 = 12.5MHz

ADCCLKPS

2.1.3 其他配置

   InitAdc();  // 初始化ADC

   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode 级联配置
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0;    // 转换通道数
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;   // ADCINA0 通道设置
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;        // Setup continuous run 设置连续运行

	// Start SEQ1 级联模式只需要打开SEQ1
   AdcRegs.ADCTRL2.all = 0x2000;

2.1.4 采样读取

该例程一直进行ADC转换,只需判断中断标志位INT_SEQ1,完成转换后进行读取。

     for (i=0; i<AVG; i++)
     {
        while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt
        AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
        SampleTable[i] =((AdcRegs.ADCRESULT0>>4) );
     }

三、代码

ADC软件触发和ePWM触发代码如下:
adc.c
adc.h


总结

DSP F28335芯片ADC配置的学习记录,结合官方例程作代码讲解。(个人学习记录分享,若侵权删)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐