打印
[技术问答]

请新唐来个技术解个惑,关于内部带隙基准的问题(已解决)

[复制链接]
3203|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianxj01|  楼主 | 2018-6-28 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tianxj01 于 2018-6-30 17:59 编辑

先请看代码:

#define     ADC_CHIN        ADCCON0&=0xF0;ADCCON0|=0x08;     //内部带隙基准
#define     ADC_EN          ADCCON1|=SET_BIT0;
#define     RESET           EA =0;TA=0xAA;TA=0X55;CHPCON|=0x80
#define     UN_TA           TA=0xAA;TA=0X55

#define     UID_AP           0x04


u16 ADC_RUN_12(void)
    {                                                                              
        u16 ADC_TMP=0;
        clr_ADCF;
        set_ADCS;                                                                                                                                        // Each time ADC start trig signal
        while(ADCF == 0);
        ADC_TMP=ADCRL;
        ADC_TMP+=ADCRH<<4;
        return (ADC_TMP);
    }
u16 READ_BANDGAP()
{
    u8 iii,BIT_TMP,READ_TMP[2];
    u16 Bandgap,Vin_tmp;
    u32 xdata tmp_32;
    BIT_TMP=EA;
    EA =0;
    UN_TA;
    CHPCON |= 0x01;    //IAPEN = 1, enable IAP mode CHPCON TA保护
    IAPCN =UID_AP;
    IAPAH=0;
    for(iii=0;iii<2;iii++)
    {
        IAPAL=iii+0x0C;
        UN_TA;
        IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
        READ_TMP[iii]=IAPFD;
    }
    UN_TA;
    CHPCON &= ~0x01;       //IAPEN = 0, disable IAP mode
    Vin_tmp=READ_TMP[1]&0x0F;
    Vin_tmp+=READ_TMP[0]<<4;
    //丢掉4次测试
    ADC_CHIN;
    for(iii=0;iii<4;iii++)
        {
            ADC_RUN_12();
        }
    Bandgap=0;
        for(iii=0;iii<16;iii++)
        {
            Bandgap+=ADC_RUN_12();
        }
        Bandgap/=16;
        tmp_32=3072;
        tmp_32*=Vin_tmp;
        tmp_32/=Bandgap;
    Bandgap=tmp_32;
    EA  =   BIT_TMP;
    return (Bandgap);
}



程序就是这些,调试都可以,问题是这样:目标板子,读内部UID后的2字节0C 0D 2字节 数据是:0X68,0X93.按照官方用法,拼起来=0x0683=十进制1667,根据官方公式,内部基准实际数据应该=1667*3072/4096=1250mV。
现在问题就来了,确定了带隙基准准确值,反推单片机电压Bandgap  都是错的。实际被调试机器,VCC=4.98V  而用该电压做基准,丢弃前面4次结果,后连续测量16次平均获得的内部带隙基准值大概在0x03F3到0x03F0之间,
理论上,该值应该在(1250/4980)X4096=0X0404,误差非常大。
这个情况,不知道什么原因,希望来个新唐技术支持,能够给分析支持一下。


沙发
huangcunxiake| | 2018-6-28 11:03 | 只看该作者
换电池供电测试一下看看,是不是电源问题。

使用特权

评论回复
板凳
huangcunxiake| | 2018-6-28 11:03 | 只看该作者
换电池供电测试一下看看,是不是电源问题。

使用特权

评论回复
地板
xiaoqizi| | 2018-6-28 11:28 | 只看该作者
有没有可能没有做温度补偿 不过按理说也不能这么大的误差啊

使用特权

评论回复
5
tianxj01|  楼主 | 2018-6-28 12:02 | 只看该作者
本帖最后由 tianxj01 于 2018-6-28 12:05 编辑
huangcunxiake 发表于 2018-6-28 11:03
换电池供电测试一下看看,是不是电源问题。

换了个实验室电源,<1mV纹波 5.00V  反复调试多次,结果非常稳定,都是979  一个LSB波动没有。电源调整成4.5V  测试结果1093  也是连续多次稳定读数。根据公式,(Vgap1/5)*4096=979  (Vgap2/4.5)*4096=1093, Vgap1=1.195,  Vgap2=1.200,貌似在4.5-5V范围,用该方法测试电源电压,好像线性度也比较差啊
而且和内部读出的数据1.250V还是完全不对。

使用特权

评论回复
6
HKingS| | 2018-6-28 15:34 | 只看该作者
奇怪,怎么误差会这么大呢?

使用特权

评论回复
7
tianxj01|  楼主 | 2018-6-29 17:22 | 只看该作者
沉了,自己顶一下,希望来个技术给真正交互一下,好解决这个问题,如果解决不了,那么这种校准方法,基本上应该是没法采用的。

使用特权

评论回复
8
tianxj01|  楼主 | 2018-6-30 15:57 | 只看该作者
tianxj01 发表于 2018-6-29 17:22
沉了,自己顶一下,希望来个技术给真正交互一下,好解决这个问题,如果解决不了,那么这种校准方法,基本上 ...

今天看见帖子:
N76e003 Bandgap 电压获取
里面有所谓20mS延时。我试着在16次循环里面加上了20mS延时,嘿嘿,解放区的天啊晴朗的天.....解放区的人民好喜欢....!!!。。。
一切都安好了。
实测数据:输入电压5.105,读数5107.误差0.9996
输入5.002V,读数5006.误差0.9992
输入4.905,读数4914..误差0.9982
全部精度在2‰以内。

使用特权

评论回复
9
dongnanxibei| | 2018-7-6 16:15 | 只看该作者
tianxj01 发表于 2018-6-30 15:57
今天看见帖子:
N76e003 Bandgap 电压获取
里面有所谓20mS延时。我试着在16次循环里面加上了20mS延时,嘿 ...

看来延时这个是为了充分给片内外设充电,充足了电,才好准,。

使用特权

评论回复
10
zhangtao3b608| | 2020-8-18 10:47 | 只看该作者
佩服!!

使用特权

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

本版积分规则

17

主题

3211

帖子

91

粉丝