ADC的总结学习笔记

    xiaoxiao2021-04-19  91

    C8051F020/1 的ADC0 子系统包括一个9 通道的可编程模拟多路选择器(AMUX0),一个可编程增益放大器(PGA0)和 一个100ksps、12 位分辨率的逐次逼近寄存器型 ADC, (F020 ADC0 只有 一个逐次逼近的 ADC, 它能实现 9 路输入是因为它有一个 9 通道的多路选择器 ( AMUX0))) 片上的特殊功能寄存器(简称SFR)有11个与ADC0的控制相关,它们是:

    AMUX0SL-AMUX0通道选择寄存器;AMX0CF-AMUX0配置寄存器;

    ADC0CF-ADC0配置寄存器;ADC0CN-ADC0控制寄存器;

    ADC0H-ADC0数据字MSB寄存器;ADC0L-ADC0数据字LSB寄存器;

    ADC0GTH-ADC0下限数据高字节寄存器;ADC0GTL-ADC0下限数据低字节寄存器;

    ADC0LTH-ADC0上限数据高字节寄存器;ADC0LTL-ADC0上限数据低字节寄存器;

    REF0CN-基准电压控制寄存器。

     

     ADC0工作方式

    ADC0 的最高转换速度为100ksps,其转换时钟来源于系统时钟分频,分频值保存在寄存

    器ADC0CF 的ADCSC 位。

      启动转换

           有4 种转换启动方式,由ADC0CN 中的ADC0 启动转换方式位(AD0CM1,AD0CM0)的状态决定。转换触发源有:

    1. 向ADC0CN 的AD0BUSY 位写1;

    2. 定时器3 溢出(即定时的连续转换);

    3. 外部ADC 转换启动信号的上升沿,CNVSTR;

    4. 定时器2 溢出(即定时的连续转换)。

    备注:(关于ADC0的开始转换,1,可以在软件里面设置,直接给AD0BUSY写1,然后直接输出转换结果。这种方式需要不断的扫描,不断的输出结果,似乎有点费劲。如果采用第三种方式,即用一个开关来控制ADC的启动,那样,在没有按键的情况下,ADC不需要扫描,或许可以用第二种或者第四种方式,我用一个按键来启动定时器的开始计数,技术满之后再启动ADC的转换。总之,除非处理芯片的主要目的就是为了AD转换,要不采用第一种方法只会显得有点笨。)

     

    关于 ADC0CN

    AD0EN

    AD0TM

    AD0INT

    AD0BUSY

    AD0CM1

    AD0CM0

    AD0WINT

    AD0LJST

    位7

    位6

    位5

    位4

    位3

    位2

    位1

    位0

      1        0       0        0          0          0         0          0

    (该寄存器可以位寻址,所以在清零的时候,可以直接写AD0INT=0就可以。)

    位7: AD0EN:ADC0 使能位

    0:ADC0 禁止。ADC0 处于低耗停机状态。

    1:ADC0 使能。ADC0 处于活动状态,并准备转换数据。

    (在ACD0初始化里,该位肯定是被置高的。)

    位6: AD0TM:ADC 跟踪方式位

    0:当ADC 被使能时,除了转换期间之外一直处于跟踪方式。

    1:由ADSTM1-0 定义跟踪方式。(该位设置为“0”)

     

    位5: AD0INT:ADC0 转换结束中断标志,该标志必须用软件清‘0’。

    0:从最后一次将该位清0 后,ADC0 还没有完成一次数据转换。

    1:ADC 完成了一次数据转换。

    (该位为标志位,可以用来查询,如果为1了,则说明ADC已经完成了一次转换,直接清零就ok)

    位4: AD0BUSY:ADC0 忙标志位

    读:

    0:ADC0 转换结束或当前没有正在进行的数据转换。AD0INT 在AD0BUSY 的

    下降沿被置‘1’。

    1:ADC0 正在进行转换。

    写:

    0:无作用

    1:若ADSTM1-0=00b 则启动ADC0 转换。

    备注:(该位可以用来做启动指令,也可以用来做查询等待。While(!(AD0BUSY));

    位3-2: AD0CM1-0:ADC0 转换启动方式选择位。

    如果AD0TM = 0:

    00:向AD0BUSY 写1 启动ADC0 转换。

    01:定时器3 溢出启动ADC0 转换。

    10:CNVSTR 上升沿启动ADC0 转换。

    11:定时器2 溢出启动ADC0 转换。

    如果AD0TM = 1:

    00:向AD0BUSY 写1 时启动跟踪,持续3 个SAR 时钟,然后进行转换。

    01:定时器3 溢出启动跟踪,持续3 个SAR 时钟,然后进行转换。

    10:只有当CNVSTR 输入为逻辑低电平时ADC0 跟踪,在CNVSTR 的上升沿

    开始转换。

    11:定时器2 溢出启动跟踪,持续3 个SAR 时钟,然后进行转换。

    (在这里,由于前面的AD0TM被设置为0,采用软件控制AD0BUSY启动转换,因此,这里写为“00”)

    位1: AD0WINT:ADC0 窗口比较中断标志。该位必须用软件清0。

    0:自该标志被清除后未发生过ADC0 窗口比较匹配。

    1:发生了ADC0 窗口比较匹配。(这里直接写0)

    位0: AD0LJST:ADC0 数据左对齐选择位。

    0:ADC0H:ADC0L 寄存器数据右对齐。

    1:ADC0H:ADC0L 寄存器数据左对齐(选择数据右对齐,写0)

     

    综上所述:在初始化的时候,采用ADC0BUSY控制ADC启动,寄存器数据右对齐读出。因此ADC0CN=0X80;在AD转换函数里面,另外再写ADC0BUSY=1;delay();            

    while(!(ADC0BUSY));即为启动转换,在转换的时候,ADCOBUSY保持高电平,转换完毕后,ADC0BUSY恢复低电平。

     

     

     

    (转换数据被保存在ADC数据字的MSB 和LSB 寄存器:ADC0H 和ADC0L。至于转换后的数据是选择左对齐还是右对齐,则由ADC0CN里面的AD0LJST决定。在前面已经选择了右对齐)

    当通过向AD0BUSY 写‘1’启动数据转换时,应查询AD0INT 位以确定转换何时结束(也可以使用ADC0 中断)。建议的查询步骤如下:

    1. 写‘0’到AD0INT;

    2. 向AD0BUSY 写‘1’;

    3. 查询并等待AD0INT 变‘1’;

    4. 处理ADC0 数据

     

     关于AMX0CF

     

    ——

    ——

    ——

    ——

    AIN67IC

    AIN45IC

    AIN23IC

    AIN01IC

    7

    6

    5

    4

    3

    2

    1

    0

    (该寄存器主要用来配置输入通道作为单端输入还是双端差分输入。由于我的八路通道都需要作为单端输入,所以该寄存器全部写0,即为AMX0CF=0X00;)

    位7-4: 未使用。读 = 0000b;写 = 忽略

    位3  AIN67IC:AIN6、AIN7 输入对配置位

    0: AIN6 和AIN7 为独立的单端输入

    1: AIN6, AIN7 为(分别为)+, -差分输入对

    位2  AIN45IC:AIN4、AIN5 输入对配置位

    0: AIN4 和AIN5 为独立的单端输入

    1: AIN4, AIN5 为(分别为)+, -差分输入对

    位1  AIN23IC:AIN2、AIN3 输入对配置位

    0: AIN2 和AIN3 为独立的单端输入

    1: AIN2, AIN3 为(分别为)+, -差分输入对

    位0  AIN01IC:AIN0、AIN1 输入对配置位

    0: AIN0 和AIN1 为独立的单端输入

    1: AIN0, AIN1 为(分别为)+, -差分输入对

     

     

     

     关于 AMX0SL

    ——

    ——

    ——

    ——

    AMX0AD3

    AMX0AD2

    AMX0AD1

    AMX0AD0

    7

    6

    5

    4

    3

    2

    1

    0

    (该寄存器用来做AMUX9路选择开关的配置,即为通道选择寄存器)

    位7-4: 未使用。读 = 0000b;写 = 忽略

    位3-0: AMX0AD3-0: AMUX0 地址位

    0000-1111b: 根据下表选择ADC 输入

    (具体请参照C8051F02X.PDF里面第40页说明。)

    在这里,由于我的八路通道都设置为输入 ,前面的AMX0CF设置为了0X00,所以这里只需要按顺序,从0X00、0X01、0X02、0X03、0X04、0X05、0X06、0X07依次选择一遍就可以。

     

     

     关于 ADC0CF: ADC0 配置寄存器

    AD0SC4

    AD0SC3

    AD0SC2

    AD0SC1

    AD0SC0

    AMP0GN2

    AMP0GN1

    AMP0GN0

    7

    6

    5

    4

    3

    2

    1

    0

    位7-3:  AD0SC4-0: ADC0 SAR 转换时钟周期控制位

    SAR 转换时钟来源于系统时钟,由下面的方程给出,其中AD0SC 表示AD0SC4-0

    中保持的数值,CLKSAR0 表示所需要的ADC0 SAR 时钟(注:ADC0 SAR 时钟

    应小于或等于2.5MHz)。(具体参考C8051F02X.PDF第41页)

     

    位2-0: AMP0GN2-0: ADC0 内部放大器增益(PGA)

    000: 增益 = 1

    001: 增益 = 2

    010: 增益 = 4

    011: 增益 = 8

    10x: 增益 = 16

    11x: 增益 = 0.5

     

    关于电压基准(C8051F020/2)

    电压基准电路为控制ADC 和DAC 模块工作提供了灵活性。有三个电压基准输入引脚,允许每个ADC 和两个DAC 使用外部电压基准或片内电压基准输出。通过配置VREF 模拟开关,ADC0 还可以使用DAC0 的输出作为内部基准,ADC1 可以使用模拟电源电压作为基准.

    REF0CN: 电压基准控制寄存器

    -----------

    -----------

    -----------

    AD0VRS

    AD1VRS

    TEMPE

    BIASE

    REFBE

    7

    6

    5

    4

    3

    2

    1

    0

    位7-5: 未用。读 = 000b,写 = 忽略。

    位4: AD0VRS:ADC0 电压基准选择位

    0:ADC0 电压基准取自VREF0 引脚。

    1:ADC0 电压基准取自DAC0 输出。

    位3: AD1VRS:ADC1 电压基准选择位

    0:ADC1 电压基准取自VREF1 引脚。

    1:ADC1 电压基准取自AV+。

    位2: TEMPE:温度传感器使能位

    0:内部温度传感器关闭。

    1:内部温度传感器工作。

    位1: BIASE:ADC/DAC 偏压发生器使能位(使用ADC 和DAC 时该位必须为1)

    0:内部偏压发生器关闭。

    1:内部偏压发生器工作。

    位0: REFBE:内部电压基准缓冲器使能位

    0:内部电压基准缓冲器关闭。

    1:内部电压基准缓冲器工作。内部电压基准提供从VREF 引脚输出。11x: 增益 = 0.5

     

    转载请注明原文地址: https://ju.6miu.com/read-675839.html

    最新回复(0)