ADC模块
一、ADC时钟分频
// 使能ADC外设时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK=1;
EDIS;
// 高速外设时钟HSPCLK=SYSCLKOUT/(2*HISPCP)=25MHz
EALLOW;
SysCtrlRegs.HISPCP.bit.HSPCLK=3;
EDIS;
// FCLK = HSPCLK/(2*ADCCLKPS)=12.5MHz
AdcRegs.ADCTRL3.bit.ADCCLKPS=1;
// ADC工作时钟ADCCLK。
// CPS=0:ADCCLK=FCLK;CPS=1:ADCCLK=FCLK/2
AdcRegs.ADCTRL1.bit.CPS=0;
// ADC采样时间宽度SH Width = (ACQ_PS+1)*(1/ADCLK)
AdcRegs.ADCTRL1.bit.ACQ_PS=0xf;
二、ADC模块的工作方式
F28335的ADC一共有16个引脚,分成了2组:一组为ADCINA0~ADCINA7,使用采样保持器S/H-A,对应排序器SEQ1;另一组为ADCINB0~ADCINB1,使用采样保持器S/H-B,对应排序器SEQ2。
2.1 排序器工作方式
2.1.1 双排序器
排序器SEQ1使用通道选择控制寄存器ADCCHSELSEQ1和ADCCHSELSEQ2,可选择的通道为ADCINA0~ADCINA7;排序器SEQ2使用通道选择控制寄存器ADCCHSELSEQ3和ADCCHSELSEQ4,可选择的通道为ADCINB0~ADCINB7。
2.1.2 级联排序器
排序器SEQ使用通道选择控制寄存器ADCCHSELSEQ1~ADCCHSELSEQ4,可选择的通道为ADC所有的16个通道。
2.2 ADC的采样方式
2.2.1 顺序采样
通道选择控制寄存器中CONVxx的4位都用来定义输入引脚。最高位=0说明采样的是A组;最高位=1说明采样的是B组。低3位用来定义引脚。
2.2.2 同步采样
同步采样模式下,是成对通道进行采样,所有CONVxx的最高位被舍弃,只有低3位的数据有效。
2.3 ADC四种工作方式的ADCCHSELSEQn位情况
2.3.1 双排序器模式下顺序采样
2.3.2 双排序器模式下同步采样
2.3.3 级联模式下顺序采样
2.3.4 级联模式下同步采样
2.3.5 注意
(1)通道选择控制寄存器使用上的区别
双排序器模式下,A组通道只能选择ADCCHSELSEQ1和ADCCHSELSEQ2;B组通道只能选择ADCCHSELSEQ3和ADCCHSELSEQ4。
级联模式下,不管A组通道还是B组通道,都能选择ADCCHSELSEQ1~ADCCHSELSEQ4中的任意一个通道选择控制寄存器。
(2)还有最大转换通道寄存器的设置不同。
(3)究其本质,因为双排序器模式下使用的是两个8状态的排序器SEQ1和SEQ2,而级联模式下使用的是16状态的排序器SEQ。
三、ADC模块寄存器AdcRegs
3.1 ADC控制寄存器1(ADCTRL1)
Bit | Name | Description |
11-8 | ACQ_PS | 采样时间设置 SH Width = (ACQ_PS+1)*(1/ADCLK) |
7 | CPS | 分频 0:ADCCLK=FCLK 1:ADCCLK=FCLK/2 |
6 | CONT_RUN | 排序器运行方式 0:启停模式 1:连续运行 |
5 | SEQ_OVRD | 排序器连续运行时,指针复位方式 0:转换完MAX_CONV个通道后,排序器指针复位到初始状态。 1:最后一个排序状态后,排序器指针复位到初始状态。 |
4 | SEQ_CASC | 级联排序器工作方式 0:双排序器 1:级联排序器 |
3.2 ADC控制寄存器2(ADCTRL2)
Bit | Name | Description |
14 | RST_SEQ1 | 1:复位排序器SEQ1状态为CONV00 |
13 | SOC_SEQ1 | 1:启动SEQ1 |
3.3 ADC控制寄存器3(ADCTRL3)
Bit | Name | Description |
4~1 | ADCCLKPS | 分频 FCLK = HSPCLK/(2*ADCCLKPS) |
0 | SMODE_SEL | 采样方式选择 0:顺序采样 1:同步采样 |
3.4 ADC输入通道选择序列控制寄存器ADCCHSELSEQn(n=1~4)
3.5 最大转换通道寄存器 ADCMAXCONV
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=0;
//最大转换通道数=MAXCONVn+1
//SEQ1使用MAX_CONV1
//SEQ2使用MAX_CONV2
//级联模式SEQ使用MAX_CONV1
3.6 结果寄存器ADCRESULTn(n=0~15)
3.7 状态和标志寄存器ADCST
Bit | Name | Description |
5 | INT_SEQ2_CLR | 中断清除位 1:清除SEQ2中断标志位INT_SEQ2 |
4 | INT_SEQ1_CLR | 中断清除位 1:清除SEQ1中断标志位INT_SEQ1 |
1 | INT_SEQ2 | SEQ2中断标志位 0:没有SEQ2中断事件 1:产生了SEQ2中断事件 |
0 | INT_SEQ1 | SEQ1中断标志位 0:没有SEQ1中断事件 1:产生了SEQ1中断事件 |
四、代码示例
void ADC_Init(void)
{
//(1)使能ADC外设时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK=1;
EDIS;
//(2)ADC初始化函数
InitAdc();
//(3)ADC工作方式设置,包括工作时钟、采样方式、排序器设置、转换通道设置等
EALLOW;
SysCtrlRegs.HISPCP.bit.HSPCLK=3; // 高速外设时钟 HSPCLK=SYSCLKOUT/(2*HISPCP)=25MHz
EDIS;
AdcRegs.ADCTRL3.bit.ADCCLKPS=1; // FCLK = HSPCLK/(2*ADCCLKPS)=12.5MHz
AdcRegs.ADCTRL1.bit.CPS=0; // ADC工作时钟ADCCLK。CPS=0:ADCCLK=FCLK; CPS=1:ADCCLK=FCLK/2
AdcRegs.ADCTRL1.bit.ACQ_PS=0xf; // ADC采样时间宽度 SH Width = (ACQ_PS+1)*(1/ADCLK)
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; // 采样方式选择,0:顺序采样;1:同步采样
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; // 排序器工作方式,0:双排序器;1:级联排序器
AdcRegs.ADCTRL1.bit.CONT_RUN=1; // 排序器运行方式,0:启停模式,1:连续运行
AdcRegs.ADCMAXCONV.bit.MAX_CONV1= 0; // 最大转换通道数=MAXCONV+1
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0; // ADCINA0的通道为CONV00
//(4)选择ADC触发方式,开启转换
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; // 启动SEQ1
}
//(5)读取ADC转换值
Uint16 Read_ADCValue(void)
{
while(AdcRegs.ADCST.bit.INT_SEQ1==0); // 查询转换是否结束
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; // 清除中断标志位
return AdcRegs.ADCRESULT0 >> 4; // 返回转换结果,右移4位来右对齐
}