标题: STC15单片机ADC-10bit数字量问题很奇怪 [打印本页]

作者: SHANWAZI    时间: 2024-7-8 17:32
标题: STC15单片机ADC-10bit数字量问题很奇怪
先上程序:





uint ADC_DATA;

void delay(uchar ms)
{
        uchar i;
        while(ms--)
        for(i=0;i<220;i++);
}

void ADC_init()//初始化ADC
{
        //ADD采样输入口模式设置
        P1M1|=0x0C;//P1^2-P1^3设置位高阻模式 0000 1100
        P1M0&=0xF3;//P1^2-P1^3设置位高阻模式 1111 0011

        //P1口模拟控制功能寄存器 "P1AFS"
        P1ASF|=0x0C;//设置为P1^2-P1^3为ADC采样输入  0000 1100
        
        CLK_DIV&=0xDF;//采样数据左对齐ADRJ=0
        ADC_RES=0; //默认高字节高8位
        ADC_RESL=0;//默认低字节低2位
        
        ADC_CONTR|=0x80; //首先要开AD 转换电源 1000 0000
        delay(10);
}

unsigned int ADC()
{
        unsigned int ADC_DATA ;   
        unsigned char ADC_H,ADC_L;
        
        ADC_DATA=0;//清除转换结果
        /*
                ADC_CONTR寄存器
                第7位:电源开启
                第6,5:保持转换速度
                第4位:转换结束位标志
                第3位:设置开始
                最后三位:选择为转换位(P1.7)
                所以1110 0111
        */
        ADC_CONTR|=0xE2;
        
        delay(3);//延时3MS
        
        ADC_CONTR|=0xEA ; //转换开关 ,转换位置1开始转换: 1110 1010
        
        delay(2);//延时3MS
        
        while(ADC_CONTR&0x10==0); //查询转换是否结束,结束后读取结果
        
        ADC_CONTR&=0xE5;//清除转换结果标志位,关闭转换
        
        ADC_H=ADC_RES; //默认高字节高8位。
        ADC_L=ADC_RESL;//默认低字节低2位。
        
        //ADC_L=ADC_L&0x03; // 屏蔽无关位

        ADC_DATA=ADC_H;
        ADC_DATA=ADC_DATA<<2;
        
        ADC_DATA|=ADC_L;
        
        ADC_CONTR=0x00;
        
        return(ADC_DATA);// 返回转化结果
}





问题描述:
1:按照官方首册记载STC15单片机支持10位ADC数据存储位置为“ADC_RES和ADC_RESL"中。
2:按照上面程序各个寄存器配置ADC也可工作但是不正常,
(1):10位ADC数值正常应该是0-1023才对目前AD值显示为2-1023,可以排除采样电压等问题因为采样端口我是直接对地了仍然显示2就是不为


不知道哪里设置出问题还是我的数据读出后处理问题又或者是数据左右对齐问题还请朋友们指教。


作者: xiaobendan001    时间: 2024-7-8 18:21
这要求蛮高的好像
作者: 188610329    时间: 2024-7-8 20:13
飞线到 单片机的 GND 引脚就出0了
作者: SHANWAZI    时间: 2024-7-8 20:55
188610329 发表于 2024-7-8 20:13
飞线到 单片机的 GND 引脚就出0了

您肯定理解错我的问题了。
作者: 188610329    时间: 2024-7-8 22:46
SHANWAZI 发表于 2024-7-8 20:55
您肯定理解错我的问题了。

你肯定理解错GND的定义了。
作者: SHANWAZI    时间: 2024-7-9 07:43
xiaobendan001 发表于 2024-7-8 18:21
这要求蛮高的好像

没有啊  就是一个ADC采样   15单片机是支持10位ADC的当我只读8位数据时AD输出可以0-255。当我读10位数据时就不正常了AD值是从2-1023变化的!


正常不应该是从0-1023吗?
作者: SHANWAZI    时间: 2024-7-9 07:45
188610329 发表于 2024-7-8 22:46
你肯定理解错GND的定义了。

不知道是?
作者: Y_G_G    时间: 2024-7-9 12:42
你要先搞明白ADC的原理
它一定是有误差和浮动的,在ADC电气规格中是有说明的,一般来说,5个位的整体误差都是正常的
也就是说,当输入电压为0V时,它的数字量可能是0,也可能是5,当然,是2也就是正常的了
假设VCC就是ADC的参考电压,以5V为例,你可以试一下,ADC端口电压为2.5V时,ADC的数字量一定是跳来跳去的
这就是ADC为什么滤波的原因了
作者: xiaobendan001    时间: 2024-7-9 12:53
SHANWAZI 发表于 2024-7-9 07:45
不知道是?

他的意思是有底线噪音。
作者: SHANWAZI    时间: 2024-7-9 14:03
Y_G_G 发表于 2024-7-9 12:42
你要先搞明白ADC的原理
它一定是有误差和浮动的,在ADC电气规格中是有说明的,一般来说,5个位的整体误差都是 ...

首先非常感谢您的盛情回复!!!


以上问题我刚刚做实验使用STC8G1K08单片机读取ADC十位数据使用同种方法如下:
1:读取ADC10位数据对齐方式为右对齐
2:数据处理方法为

unsigned int adc_once()
{       
        static unsigned int ADC_VALUE;//存放采样值

        ADC_RES=0;//结果高2位
        ADC_RESL=0;//结果低8位
       
        ADC_CONTR|=0x40;// 启动 AD 转换
        _nop_();_nop_();
        while(!(ADC_CONTR&0x20));//查询 ADC 完成标志       
        _nop_();_nop_();
        ADC_VALUE=ADC_RES;//存储 ADC 的 10 位结果的高 2 位
        ADC_VALUE<<=8;
        ADC_VALUE|=ADC_RESL;//存储 ADC 的 10 位结果的低 8 位
        ADC_CONTR&=~0x20;//清完成标志
        delay_ms(1);
        //adc_value&=0x03FF;//确保adc_value不大于1024
       
        return ADC_VALUE;
}

同样通过外部电位器对5V电压进行分压供给ADC采样调节电位器可使ADC值0-1023变化!!!!


同种方法数据右对齐同种外部电路同种数据处理函数使用STC15单片机却不行AD值始终要么就是1-1023
要么就是2-1023变化!!!!!!!

不知为何
作者: SHANWAZI    时间: 2024-7-9 14:04
xiaobendan001 发表于 2024-7-9 12:53
他的意思是有底线噪音。

请看楼上
作者: 123156fsadf    时间: 2024-7-9 15:07
SHANWAZI 发表于 2024-7-9 14:04
请看楼上

2-1023是正常现象,MCU生产的时候,基准电压就有误差,不同mcu个体测出来有误差太正常了
作者: SHANWAZI    时间: 2024-7-9 16:12
123156fsadf 发表于 2024-7-9 15:07
2-1023是正常现象,MCU生产的时候,基准电压就有误差,不同mcu个体测出来有误差太正常了

但是只读取八位时又正常
作者: coody_sz    时间: 2024-7-9 17:28
SHANWAZI 发表于 2024-7-9 07:43
没有啊  就是一个ADC采样   15单片机是支持10位ADC的当我只读8位数据时AD输出可以0-255。当我读10位数据 ...

你要多了解一下ADC的一些参数。
ADC有好几个误差参数,其中一个是“0点误差”,即输入电压为0时,读数的误差,比如读到2,那0点误差就是2个字。你读8位能到0,因为因为10位时是2,去掉低2位就是0了。
作者: SHANWAZI    时间: 2024-7-9 18:44
coody_sz 发表于 2024-7-9 17:28
你要多了解一下ADC的一些参数。
ADC有好几个误差参数,其中一个是“0点误差”,即输入电压为0时,读数的 ...

哦原来如此!!!!!看来我还是功课做少了,感谢感谢
作者: Y_G_G    时间: 2024-7-9 21:48
SHANWAZI 发表于 2024-7-9 14:03
首先非常感谢您的盛情回复!!!

我把我上面的回复复制了,请你再认真看一下,我个人感觉,我已经解释得很明白了
如果还不明白,我再给你注释
作者: SHANWAZI    时间: 2024-7-10 14:05
Y_G_G 发表于 2024-7-9 12:42
你要先搞明白ADC的原理
它一定是有误差和浮动的,在ADC电气规格中是有说明的,一般来说,5个位的整体误差都是 ...

感谢朋友的耐心解答,按照您的意思我已做实验确实如此!!!!
作者: cnos    时间: 2024-7-11 12:56
模电功底稳步提升中
作者: SHANWAZI    时间: 2024-7-11 16:53
cnos 发表于 2024-7-11 12:56
模电功底稳步提升中

是的共同学习
作者: 土豆我是地瓜    时间: 2024-7-11 17:20
大家说的意思是不是就是读8位精度低了,掩盖了0时的误差,精度高了误差就被读出了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1