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;
}
STC的12位ADC的精度是12.5bit,帧的能秒杀很多厂家的12位ADC。
你的VREF接到哪里? 不至于差这么多吧。
BGV、ADC_RES和ADC_RESL分别是多少啊? 21cnsound 发表于 2024-3-13 11:51
不至于差这么多吧。
BGV、ADC_RES和ADC_RESL分别是多少啊?
原因找到了,ADC上电没有延时 但是测P1.0电压还是不准,差0.3V 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左右 学习下 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; 你的电源可能不干净,可以用一个压定稳好的LDO稳压块接上去,这样一般都会很准。
页:
[1]