打印
[STC单片机]

注册用户名只为来提个问,望大哥些指点一下小弟

[复制链接]
1595|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bsdliao|  楼主 | 2014-8-27 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 bsdliao 于 2014-8-27 23:02 编辑

小弟自学单片机,打算用STC12c5a60s2来测电阻阻值,+5V与地之间串了R1,R2,R1=298,R2是被测电阻,将R2电压接入P1.3测其电压,根据R2电压就能算出R2的阻值了。现在显示阻值虽然比较稳定,但是与实际电压有偏差,1K以下基本就相差一两欧,但是R2越大偏差就愈大,求大神些解惑,复制个AD转换程序
void ADC_1_3()
{
     int j;
         
    P1M1=0xF8;
    P1M0=0x08;
        ADC_CONTR=0x80;
    delay(250);     //必要的延时
               
        AUXR1=0;    //即AUXR1的第3位:ADRJ=0,高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中           
    P1ASF=0x08;                  // 拟功选P1.3为AD模拟通道
        ADC_CONTR=0xe3;         //转换速度  90 时钟周期一次,  选P1.3为AD通道
    _nop_;
        _nop_;
        _nop_;
        _nop_;
    for(j=0;j<200;j++)
           {
             
              ADC_RES=0;     //高八位数据清零
              ADC_RESL=0;    //低两位清零
             
                  ADC_CONTR|=0x08;         //开启AD转换
                  _nop_;
          _nop_;
          _nop_;
          _nop_;
                  _nop_;
                  
                 
               while(1)     //判断AD转换是否完成
                 {
                   if(ADC_CONTR&0x10)
                   
                           {break;}
                 }
                        
              ADC_CONTR=0xe3;//ADC_CONTR&=0xe7;清ADC_FLAG位, 关闭A/D转换
                  _nop_;
                  _nop_;
                  _nop_;
                  _nop_;
              _nop_;
        q0=(ADC_RES*4)+(ADC_RESL&0x03);//取10位AD转换值
                q0=1024/q0;//求U总/UR2
      
            q=q+q0;//将200次比值装入q
       }
       
       pp=q/200;//求总电压与所测电阻电压比值的平均值.
           qq=298/(pp-1);// 根据:U总/UR2=(R1+R2)/R2 ,计算出R2阻值
          
           R=(int)qq;//将double转为int
      
      ADC_disp();显示阻值
     
  }

相关帖子

沙发
bsdliao|  楼主 | 2014-8-27 23:05 | 只看该作者
q0,q ,pp,qq我都是用的double,不知有没有影响

使用特权

评论回复
板凳
cjseng| | 2014-8-27 23:41 | 只看该作者
这个,万用表测电阻,也要换挡位的,对应你这里,测不同的电阻,R1也要改变的。

使用特权

评论回复
地板
bsdliao|  楼主 | 2014-8-28 07:29 | 只看该作者
cjseng 发表于 2014-8-27 23:41
这个,万用表测电阻,也要换挡位的,对应你这里,测不同的电阻,R1也要改变的。 ...

那我测量0-10k电阻,该怎么选择R1呢?

使用特权

评论回复
5
cjseng| | 2014-8-28 09:18 | 只看该作者
bsdliao 发表于 2014-8-28 07:29
那我测量0-10k电阻,该怎么选择R1呢?

分档位:200欧姆、2K、20K

使用特权

评论回复
6
bsdliao|  楼主 | 2014-8-28 09:57 | 只看该作者
cjseng 发表于 2014-8-28 09:18
分档位:200欧姆、2K、20K

如果真这样的话,岂不是得先知道R2的范围,才能测其具体阻值,那我这个方案就没有意义了嘛,
现在测量1k以下比较稳定,1到2k少了近10Ω,2k到4k少了接近40Ω,4k以上就少了100多Ω,甚至200

使用特权

评论回复
7
zbchengfei| | 2014-8-28 10:02 | 只看该作者
芯片采集的电压一般不超过基准,电阻r2大了,分压就会超过基准

使用特权

评论回复
8
zzyfidy| | 2014-8-28 10:11 | 只看该作者
首先确保参考电源和低的稳定,检查电路和PCB layout;
其次动态分配参考电阻,使电压值在一个中部区间,例如1/4Vref---3/4Vref;
还有如果电阻接近M欧级,要考虑IO的输入阻抗,

使用特权

评论回复
9
bsdliao|  楼主 | 2014-8-28 10:37 | 只看该作者
zbchengfei 发表于 2014-8-28 10:02
芯片采集的电压一般不超过基准,电阻r2大了,分压就会超过基准

那基准是多少呢?我只测了一路,我直接加R1到10k,这样能行吗?

使用特权

评论回复
10
bsdliao|  楼主 | 2014-8-28 10:43 | 只看该作者
zzyfidy 发表于 2014-8-28 10:11
首先确保参考电源和低的稳定,检查电路和PCB layout;
其次动态分配参考电阻,使电压值在一个中部区间,例 ...


开关电源供电,比较稳定,你所说的动态分配参考电阻,那是不是要像5楼所说的那样,选择多个R1?

使用特权

评论回复
11
cjseng| | 2014-8-28 10:43 | 只看该作者
bsdliao 发表于 2014-8-28 09:57
如果真这样的话,岂不是得先知道R2的范围,才能测其具体阻值,那我这个方案就没有意义了嘛,
现在测量1k ...

自动量程啊,先默认最大的量程测量,测到大概范围后,自动调整量程,就是切换R1电阻。

使用特权

评论回复
12
tergy2012| | 2014-8-28 11:25 | 只看该作者
路过,学习一下

使用特权

评论回复
13
emailli| | 2014-8-28 11:28 | 只看该作者
硬件电路设计方法不对!

使用特权

评论回复
14
bsdliao|  楼主 | 2014-8-28 11:33 | 只看该作者
emailli 发表于 2014-8-28 11:28
硬件电路设计方法不对!

那该怎样改进?

使用特权

评论回复
15
emailli| | 2014-8-28 14:09 | 只看该作者
被测电阻是焊接在主板上还是线连接?
如果是引线连接 这个需要考虑线阻消除!
说道大了!
一下子说不清楚,你自己去网上找找资料吧。
还有,需要分档位测量。需要考虑测量电路的输入阻抗对被测电路的影响等。
还需要考虑基准源的误差,电源误差,ADC误差,温度漂移等等等等

使用特权

评论回复
16
阮天宇00| | 2014-8-28 20:28 | 只看该作者
单片机的话,精度已经很不错了~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

0

粉丝