找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2276|回复: 8
收起左侧

请教一个关于STC单片机AD问题

[复制链接]
ID:104797 发表于 2021-12-7 22:11 | 显示全部楼层 |阅读模式
我用STC15F2K60S2单片机做10位AD试验,当用TL431做电压基准时,显示采集到的电压时,后两位一直在跳动变化,当不用TL431做基准时,显示出的数据就不跳动,有可能是什么原因造成的?下面是AD采集的函数。请各位帮忙分析下原因,谢谢!!
//-------读ADC结果:

uint        Get_ADC10bitResult (uchar CHA)        //channel = 0~7
{
                ADC_RES = 0;
                ADC_RESL = 0;
                ADC_CONTR = 0x60;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
                _nop_();
                ADC_CONTR |= CHA;       //选择A/D当前通道
                _nop_();
                ADC_CONTR |= 0x80;      //启动A/D电源
                delayms(1);            //使输入电压达到稳定(1ms即可)

                ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | CHA;//ADC_CONTR |= 0x08;//         //start the ADC      //启动A/D转换(0000 1000 令ADCS = 1)
                _nop_();
                _nop_();
                _nop_();
                _nop_();

                while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
                ADC_CONTR &= ~0x10;                //清除ADC结束标志
                return        (((uint)ADC_RES << 2) | (ADC_RESL & 3));
}

//-----------------电压转换函数-----------------
/****************************************************
M=模拟量采样值,N=基准电压源采样值(本例为2.48V),R=模拟量输入值(待显示值)
N=1024*2.48/Vcc;变形后得Vcc=1024*2.48/N; 代入M=1024*R/Vcc;得到M=R*N/2.48;变形后得R=M*2.48/N
4为输入端分压比。
******************************************************************/
void transfer(void)
        {
        Get_ADC10bitResult(0);                //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.
        N=Get_ADC10bitResult(0);        //P1.0口模拟量转换,电压基准
        Get_ADC10bitResult(1);                //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.
        M=Get_ADC10bitResult(1);        //P1.1口基准电压(2.48V)源采样(转换),采用基准电压时使用  
               
//        t1=Get_ADC10bitResult(1)/2.28;        //不采用采用基准电压时
               
        t1=(M*248)/N;                        //输入模拟量换算并放大100倍,精度0.01;        //采用基准电压时               
}


回复

使用道具 举报

ID:624769 发表于 2021-12-7 22:44 | 显示全部楼层
对于没有Vref 引脚的单片机,不建议用 TL431做基准电压, 因为:反而不准。
回复

使用道具 举报

ID:879348 发表于 2021-12-8 08:17 | 显示全部楼层
你可以直接输出原始数据,看是谁在跳动,因为这单片机并没有参考,你的2.5V也是参考供电
回复

使用道具 举报

ID:752974 发表于 2021-12-8 08:25 | 显示全部楼层
沙发建议正确,这种情况下用电源做VREF,可以消除系统误差。
回复

使用道具 举报

ID:987926 发表于 2021-12-8 08:44 | 显示全部楼层
TL431可能是假的,我在淘宝上给坑过,用示波器看看431的输出端,当431前段电阻是1K左右跳的很厉害
回复

使用道具 举报

ID:401564 发表于 2021-12-8 14:35 | 显示全部楼层
ADC本身就是会跳动的
再加上你两次ADC,跳动就更多了
直接用电源作为参考电压了,很多时候是不需要的参考电压的
非得要用的话,那就用个KIA7805A供电,这玩意比LM7805要好很多
还想要精密的,直接上STC8A系列的了
TL431去配一个10位ADC,没有那必要
回复

使用道具 举报

ID:491875 发表于 2021-12-8 17:52 | 显示全部楼层
431不可靠,稳定性比较差。特别是电容处理不好容易产生振荡
回复

使用道具 举报

ID:981034 发表于 2021-12-15 08:45 | 显示全部楼层
估计是431没负载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表