文章目录
一、ADC介绍
1.1 ADC功能框图
简介:12位ADC,16路通道;
2个采样保持器,1个转换器,16路结果寄存器;
ADC 转换时钟频率最高可配置为 25MHz,采样带宽 12.5MHz
电压输入范围:0-3V;
触发源:软件触发、ePWM、GPIO XINT2。
1.2 ADC时钟分配
外设时钟 HSPCLK 还可以经过 ADCTRL3 寄存器的ADCCLKPS[3-0]位来分频,然后再经过寄存器ADCTRL1 中的 CPS 位来控制进行 2 分频或者不分频。此外,ADC 模块还通过延长采样获取周期调整信号源阻抗,这由 ADCTRL1 寄存器中的 ACQPS3-0位控制。这些位并不影响采样保持和转换过程,但通过延长转换脉冲(SOC)的长度可以增加采样时间的长度。
ADC模块具有若干预分频器级以产生任何期望的ADC操作时钟速度(下图是时钟树提供到ADC)
ADC时钟分频举例:
系统时钟无法直接给ADC模块提供时钟源,因此需要经过分频得到HISPCLK,因此ADC时钟最大为25MHz
*注:
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 触发源
各种模式下对应的触发源选择:
- 软件触发(software):软件执行ADC转换
- ePWMx SOCA & SOCB:设置PWM计数器,定时触发ADC转换(参考Example_2833xAdcSoc.c)
- 外部触发源(external pin):外部引脚触发
1.6 ADC_Cal()两种调用方法
1.6.1 添加汇编文件
- 工程内添加DSP2833x_ADC_cal.asm文件
- 使用ADC_Cal()进行调用
1.6.2 使用指针指向内部固化地址
如下图所示,定义函数指针,指向0x380080(不同芯片不同),使用(*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(采样时间大小)
ADCTRL3[1-4]:ADCCLKPS
ADCCLK = HSPCLK / [n*(ADCTRL1[7]:CPS + 1)]
本例中:ADCCLKPS=0x01,CPS = 0
即:ADCCLK = HSPCLK / 2*1 = 25MHz / 2 = 12.5MHz
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配置的学习记录,结合官方例程作代码讲解。(个人学习记录分享,若侵权删)