DSP28335的ADC模块

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位来右对齐



}

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值