![]() |
如果只能测量15通道VDD电压而不能测量其它通道电压,那就不合适这个项目,只能转其它芯片了,多谢各位了! |
VDDA = (unsigned int)(1023L*(*BGV/res));改成VDDA = (unsigned int)(1023L*(1190/res));可以了。8H不支持内存读内部参考电压参 |
这个代码测试出来的电压是3069,错在哪里? |
#define ADC_Power 0x8f //ê1ÄüADCÄ£¿é ′ò¿aADC ½«ADCòy½ÅéèÖÃμ½P55 #define ADC_Start 0x40 //¿aê¼ADC×a»» #define ADC_Flag 0x20 //×a»»íê3é±ê־λ #define ADC_SYS 0x2f //½«ADCÏμí3ê±Öóé趨ÎaSYSclk/2/16 óò¶ÔÆë unsigned int VDDA; // VDDAμÄμçÑ1Öμ μ¥λoá·ü unsigned int *BGV; // Äú2¿2ο¼μçÑ1Öμ μ¥λoá·ü void AD_Init() { // ADC_RES = 0; // ADC_RESL = 0; P_SW2|= 0x80; ADCTIM=0x3f; P_SW2 &= 0x7f; ADCCFG=ADC_SYS; ADC_CONTR=ADC_Power; BGV = (unsigned int idata *)0xef; delay_ms(1); } unsigned int ADC_Get() { unsigned int res; ADC_CONTR |= ADC_Start; // ADCCFG=ADC_SYS; _nop_(); _nop_(); _nop_(); while((ADC_CONTR & ADC_Flag) == 0); //μè′yíê3é ADC_CONTR &= ~ADC_Flag; //Çå3yíê3é±ê־λ res =((unsigned int)ADC_RES << 8) | ADC_RESL; return res; } void Fetch_VDDA(void) { unsigned int res=0; unsigned char i; ADC_CONTR = ADC_Power; // ê1ÄüADCÄ£¿é 2¢Ñ¡Ôñμú15í¨μà ADC_Get(); ADC_Get(); for(i=0;i<8;i++) { res+=ADC_Get(); } res>>=3; // ¶áè¡8′Î è¡Æ½¾ùÖμ VDDA = (unsigned int)(1023L*(*BGV/res)); // μÃ3öμĽá1ûμ¥λêÇoá·ü } |
你好,我看到你STC 1.19V基准电压问题,后面解决了吗?我也碰到这个问题了,能否向你请教 一下,我输入5V,测试出来输出 为什么只有3.0V |
你好,我看到你STC 1.19V基准电压问题,后面解决了吗?我也碰到这个问题了,能否向你请教 一下, 我的VX 13757468658 |
可能是封装问题 |
15通道除了测量VCC外,不知能不能测其它通道的电压? |
不好意思小弟不才,忘记自己是初学者乱回复.15就是1111![]() |
亮出你封装的Get_Adc(15)函数就一目了然了,15通道ADc好像是二进过制1111,你搞个15上去是什么意思呢 |
LAW1100 发表于 2024-8-31 15:36 unigned int Temp=0;这个声明看一下 你就知道怎么回事了 12位数据累加32次,会不会溢出呢? |
LAW1100 发表于 2024-8-31 15:36 除非你的供电电池 真的是2.4V 电池,不然,你的代码100%有问题,正常锂电池供电 读取15通道,渎值应当是 1200左右的, 你能读出 2040 那么代码肯定不对,就好像你之前说 读出来17440 一样,你还是仔细检查你的代码吧,不用折腾那些有的没有的所谓滤波,你先确保你 ADC_Value 读出来的东西 是对的。 |
unigned int Temp=0; unigned int sum=0; float voltage=0.0; unigned chai i; for(i=0;i<32;i++) { Temp+=Get_Adc(15);// } Temp= Temp>>5;//此数值滤波后2040(这是在5V供电下调试打印出来的数值) voltage=(float)(1.19*4095)/Temp; voltage结果等于2.38875V;如果这是VCC电压那就相差太远了,不知是不是算法问题还是其它问题? |
感谢各位大佬的意见! |
188610329 发表于 2024-8-31 09:26 我是用串口打印出来的(17440),8H系列AD有两种,10位和12位,网上有的算法是分开算的(如AD10位就读1024,12位的读4096),不知能不能测量其它通道的电压?如果不行就转芯片了。多谢! |
LAW1100 发表于 2024-8-31 08:40 STC8H 系列是 12位ADC ADC读值应该是在 0~4095 之间,你17440是怎么来的? 正常情况下,读取15通道,根据你电池供电电压的不同,应该得到 1100~1300左右的值,读取 BGV 记录得到 15通道电压为:1193mv 左右的出厂测定的电压值, 按 ADCValue 1300 为 1193mv 就可以逆算出 满量程 4095 对应的电源电压为:3758mv |
ADC15通道能测量VCC电压,那测量其它通道(如电流取样电压)是否可以测量? |
188610329 发表于 2024-8-30 21:45 没用过这功能, unigned int Temp=0; unigned int sum=0; float voltage=0.0; Temp=Get_Adc(15);//此数值17440(这是在5V供电下调试打印出来的数值) voltage=(float)(1.19*1024)/Temp*100;放大100倍 voltage结果等于0.846V;这是VCC电压?? |
电池供电的话,直接读15通道,就能算出电池电压了. |
用5V供电ADC读出来没问题,用电池供电读出来却是0 |
LAW1100 发表于 2024-8-30 13:56 图片上的是STC8H1K08,这款是有内部稳定的参考电压的 |
从外面建立比较电路作为开关量送给单片机或是光耦信号给单片机可参https://blog.csdn.net/xianfajush ... 1018.2226.3001.4450 |
这个型号的芯片读内部基准电压没有15通道 ,只能读ROM,RAM和CHIPID这3种方式,真麻烦。 |
哪個系列的單片機 電路中其他的外設有多大影響 等等因素 |
如果电池是接在单片机的VCC上,则读ADC的15通道得到adc15,计算得到VCC电压: VCC = 1.19*1024/adc15,不需要外部电路,非常方便,准确度高。如果你的VCC波动大,加数字滤波即可稳定。 |
因为STC没有内部参考,当负载变化,ADC也会变化,最简单的是供电2.5V LDO 不加也可以同时间读取15通道,计算转化一下 |