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