fanyx 发表于 2024-3-13 11:09:19

ADC不准 | 已解决,ADC的电源打开后要加延时等电源稳定

STC8H8K64U,利用BGV1.19V反推VREF+电压,实际3.3V,测量值为4.6V,严重不准。
#define CPUIDBASE 0xfde0
#define VREE_ADDR (*(unsigned int volatile xdata *)(CPUIDBASE+0x07))

unsigned int VCCTest(void){
int BGV;
    int res;
    int vcc;

    P0M0 = 0x00;
    P0M1 = 0x00;
    P_SW2 |= 0x80;
    BGV = (int)VREE_ADDR;
    ADCTIM = 0x3f;                           
    P_SW2 &= 0x7f;
    ADCCFG = 0x2f;                              
    ADC_CONTR = 0x8f;                           
    ADC_CONTR |= 0x40;                        
    _nop_();
    _nop_();
    while (!(ADC_CONTR & 0x20));               
    ADC_CONTR &= ~0x20;                        
    res = (ADC_RES*256)+ADC_RESL;            
    printf("H=%dL=%d   res=%d BGV=%d\r\n",(unsigned int)ADC_RES,(unsigned int)ADC_RESL,res,BGV);
    vcc = (int)(4096L * BGV / res);            
    printf("VCC=%d\r\n",vcc);
return vcc;

}

梁工 发表于 2024-3-13 11:39:49


STC的12位ADC的精度是12.5bit,帧的能秒杀很多厂家的12位ADC。

你的VREF接到哪里?

21cnsound 发表于 2024-3-13 11:51:15

不至于差这么多吧。
BGV、ADC_RES和ADC_RESL分别是多少啊?

fanyx 发表于 2024-3-13 11:55:12

21cnsound 发表于 2024-3-13 11:51
不至于差这么多吧。
BGV、ADC_RES和ADC_RESL分别是多少啊?
原因找到了,ADC上电没有延时

fanyx 发表于 2024-3-13 11:56:42

但是测P1.0电压还是不准,差0.3V

fanyx 发表于 2024-3-13 12:00:51

int vin;
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)
P1M0 = 0x00;                              //ÉèÖÃP1.0ΪADC¿Ú
P1M1 = 0x01;
P_SW2 |= 0x80;
ADCTIM = 0x3f;                              //ÉèÖÃADCÄÚ²¿Ê±Ðò
P_SW2 &= 0x7f;
ADCCFG = 0x2f;                              //ÉèÖÃADCʱÖÓΪϵͳʱÖÓ/2/16
ADC_CONTR = 0x80;
delay(10);                     //ADCÉϵ粢ÑÓʱ,ʹÄÜADCÄ£¿é
                        
ADC_CONTR |= 0x40;                      //Æô¶¯ADת»»
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20));            //²éѯADCÍê³É±êÖ¾
ADC_CONTR &= ~0x20;                     //ÇåÍê³É±êÖ¾
//ADCCFG = 0x20; //ÉèÖýá¹ûÓÒ¶ÔÆë
vin=(int)((ADC_RES*256+ADC_RESL)/4096.00*330*2);        //Result=256*Vin/Vcc;               //·µ»ØADC½á¹û
battle_val=(int)vin;
printf("H=%dL=%d\r\n",(unsigned int)ADC_RES,(unsigned int)ADC_RESL);
printf("µç³Øµçѹ=%dV\n",(int)vin);
ADC_CONTR=0;                     //ÇåÍê³É±êÖ¾
if(vin<450) return 0;
if(vin<500) return 1;
//VCCTest();
return 2;
测P1.0电压,始终小个0.15V左右

soma 发表于 2024-3-13 12:02:59

学习下

fanyx 发表于 2024-3-13 12:04:02

int vin;
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)
P1M0 = 0x00;   
P1M1 = 0x01;
P_SW2 |= 0x80;
ADCTIM = 0x3f;         
P_SW2 &= 0x7f;
ADCCFG = 0x2f;                  
ADC_CONTR = 0x80;
delay(10);                  
                     
ADC_CONTR |= 0x40;                  
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20));         
ADC_CONTR &= ~0x20;                  
//ADCCFG = 0x20;
vin=(int)((ADC_RES*256+ADC_RESL)/4096.00*330*2);       
battle_val=(int)vin;
printf("H=%dL=%d\r\n",(unsigned int)ADC_RES,(unsigned int)ADC_RESL);
printf("µç³Øµçѹ=%dV\n",(int)vin);
ADC_CONTR=0;      
if(vin<450) return 0;
if(vin<500) return 1;
return 2;

stb988 发表于 2024-4-14 10:00:24

你的电源可能不干净,可以用一个压定稳好的LDO稳压块接上去,这样一般都会很准。
页: [1]
查看完整版本: ADC不准 | 已解决,ADC的电源打开后要加延时等电源稳定