ADC 使用相关注意事项以及常见问题
赛元的大部分芯片都具有 ADC 功能,其中 92F 系列大部分芯片的 ADC 有两个基准电 压可以选择,VDD 和内部 2.4V,内部 2.4V 要求的芯片供电电压为 2.9V 以上,低于 2.9V 内 部 2.4V 无 法 保 证 稳 定 ; 95F 系 列 芯 片 的 ADC 有 三 个 基 准 电 压 可 以 选 择 , VDD/2.048V/1.024V,内部 2.048V 要求芯片供电电压在 2.7V 以上,内部 1.024V 要求芯片 供电电压在 2.4V 以上,低于供电电压限制,内部参考电压的值会无法保证稳定;SC92F859X 系列芯片的 ADC 基准电压与 95F 系列芯片一致。
此文档主要对 ADC 使用过程中常见的问题以及相关注意事项进行说明,包含以下几个内容:
1、ADC 采样电路注意事项;
2、ADC 多通道转换注意事项;
3、怎样改善 ADC 的采样误差;
4、如何使用 ADC 检测电源电压;
5、加入 ADC 检测功能之后,出现程序跑死的现象是什么原因;
6、ADC 采样值如何计算;
7、ADC 测量电压的范围是多少。
以下为具体内容:
1、ADC 采样电路注意事项
ADC 采样口需要在靠近管脚处加 103 电容,ADC 转换需要让电源电压稳定,所以在使用 ADC 功能时,请在靠近 IC 的 VCC 和 GND 处加 104 电容,以保证转换结果准确。
2、ADC 多通道转换注意事项
赛元芯片大多数型号拥有多路 ADC 通道,但每次转换只能转换一个通道,若想实现多路 通道的ADC信号的采集,需要在一路ADC通道转换完毕后将转换口切换至另一路ADC, 如此反复以实现多通道的 ADC 转换。若在 ADC 通道切换后马上进行 AD 转换,通道口 线上的电压可能存在不稳定的现象,在切换通道后转换的第一个值可能会存在异常,建议 用户对某个通道做连续的多次采集和转换后,将切换通道后转换的第一个值或几个值去 除,或将最大值及最小值去除,再将剩余的 AD 转换值求平均值得到采集结果。
使用示例如下:
unsigned int ADC_Value0,ADC_Value1,ADC_Value2;
unsigned int ADC_Convert(void)
{
unsigned int Tad=0,MinAd=0x0fff,MaxAd=0x0000,TempAdd=0;
unsigned char t=0;
for(t=0;t<10;t++)
{
ADCCON |= 0X40; //开始 ADC 转换
while(!(ADCCON&0x20)); //等待 ADC 转换完成,具体转换完成标志位请参照规格。
ADCCON&=~(0X20); //清中断标志位
Tad = ((unsigned int)ADCVH<<4)+(ADCVL>>4); //取得一次转换值
if (Tad>MaxAd)
{
MaxAd=Tad; //获得当前的最大值
}
if (Tad<MinAd)
{
MinAd=Tad; //获得当前的最小值
}
TempAdd+=Tad; //转换值累加
}
TempAdd-=MinAd; //去掉最小值
TempAdd-=MaxAd; //去掉最大值
TempAdd>>=3; //求平均值
return(TempAdd);
}
void ADC_channel(unsigned char channel)
{
ADCCON = ADCCON &0xE0| channel; //ADC 输入选择为 ADCchannel 口
}
void ADC_Multichannel()
{
ADCCFG0 = 0x07; //设置 AIN0、AIN1、AIN2 设置为 ADC 口,并自动将上拉电阻移除。
ADCCON |= 0X80; //开启 ADC 模块电源
ADC_channel(0); //ADC 入口切换至 AIN0 口
ADC_Value1 = ADC_Convert(); //启动 ADC 转换,获得转换值
ADC_channel(1); //ADC 入口切换至 AIN1 口
ADC_Value1 = ADC_Convert(); //启动 ADC 转换,获得转换值
ADC_channel(2); //ADC 入口切换至 AIN2
ADC_Value2 = ADC_Convert(); //启动 ADC 转换,获得转换值
3、怎样改善 ADC 的采样误差
使用 ADC 采样实际值和理论值达到几百甚至上千个值,可以从以下几个方面进行检查:
1) 查看 ADC 初始化是否正确,ADC 电源是否提前打开,AD 口的选择除了需要设置 选择 ADC 采样通道以外,还要有 ADC 端口设置寄存器需要将 ADC 采样口所在的 IO 口设置为 ADC 输入口,检查 ADC 采样口选择是否正确;
2) ADC 转换完成标志位判断错误,或者是 bit 位搞错,导致启动 ADC 转换后没有等 待转换完成就进行了 ADC 值的读取,赛元各系列芯片的 ADC 转换完成的标志位 不是全部都在同一个 bit 位的,需要注意,大多数集中在 ADCCON 寄存器的 bit4 和 bit5,具体需要查看规格书;
3) ADC 检测需要将对应的 IO 口设置为输入模式,同时需要设置为 ADC 输入口,设 为输出模式的话在进行 AD 口切换时有可能导致 ADC 值偏差。
使用 ADC 采样实际值和理论值相差几十到一两百个值时,可以从以下几个方面进行检查:
1) 是否有切换 ADC 通道或者是参考电压,建议切换后延时一下等待电路稳定后再进 行 ADC 转换;
2) 输入电压或者是芯片供电电压不稳定,可以实验一下看切为内部参考电压 ADC 采 样值是否有改善;
3) 分压电阻太大,导致 ADC 采样值和理论值有偏差,可以减小分压电阻实验是否有 改善,分压电阻超过 1MΩ 就会有影响;
4) VDD 做参考时,VDD 电压有较大波动,或者是输入电压有较大波动,或者是 VDD 电压和输入电压波动的频率不一样,都会导致 ADC 采样值不准,可以将芯片电源 管脚上的 104 电容尽量靠近芯片管脚摆放,或将 ADC 采用管脚上的电容值减小, 使电源电压的波动与采样电压的波形频率与幅度尽量保持一致。
4、如何使用 ADC 检测电源电压
赛元芯片的 ADC 通道选择中提供了测量 1/4VDD 的通道用于测量电源电压,将 ADC 采 样通道设置为测量 1/4VDD 的通道,92F 系列芯片选择内部 2.4V 参考电压,95F 系列芯 片选择内部 2.048V 或 1.024V 参考电压,获取的 ADC 采样值就是 1/4VDD 的采样值,所 得到的的 ADC 采样值通过反算可以得到电源电压的 1/4,再乘以 4 就可以得到电源电压, 具体的 ADC 采样通道设置可查看对应芯片的规格书。
5、加入 ADC 检测功能之后,出现程序跑死的现象是什么原因
不同型号的芯片,ADC 转换完成的标志可能不同,有的在 ADCCON 寄存器的 bit4,有的 在 ADCCON 寄存器的 bit5,请检查 ADC 转换完成标志位是否操作有误,程序中一直在 等待转换完成的标志,导致出现程序跑死的现象。
6、ADC 采样值如何计算
ADC 采样值的计算方式为:(被采样电压/参考电压)*满偏值,其中被采样电压为 ADC 通 道检测的实际电压值,参考电压为用户所设置的参考电压值,92F 系列芯片的参考电压可 选 VDD 或内部 2.4V,95F 系列的参考电压可以选择 VDD,内部 2.048V 和内部 1.024V, 满偏值为 ADC 采样值能达到的最大值,例如 12 位的 ADC 满偏值是 4095,假如使用 12bit 的 ADC,选择内部 2.4V 为参考电压,ADC 采样通道上的电压值为 2V,那么得到 的采样值为:(2/2.4)*4096=3413。
7、ADC 测量电压的范围是多少
赛元芯片使用 ADC 功能可以检测的电压范围与所选择的 ADC 基准电压有关,电压检测 范围为 0V 到参考电压,不同系列的芯片,ADC 参考电压不同,用户需要根据被测量电压 的电压值范围选择合适的参考电压:
1) 92F 系列芯片的 ADC 有两个基准电压可以选择,VDD 和内部 2.4V,内部 2.4V 要 求的芯片供电电压为 2.9 以上,低于 2.9V 内部 2.4V 无法保证稳定的 2.4V;
2) 95F 系列芯片的 ADC 有三个基准电压可以选择 VDD/2.048V/1.024V,内部 2.048V 要求芯片供电电压在 2.7V 以上,内部 1.024V 要求芯片供电电压在 2.4V 以上,低 于供电电压限制内部参考电压的值会无法保证稳定;
3) 目前赛元的芯片还不能选择外部电压做 ADC 基准电压。
