找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1761|回复: 27
打印 上一主题 下一主题
收起左侧

STC单片机用锂电池供电读电压问题?

  [复制链接]
跳转到指定楼层
楼主
STC用锂电池供电并读取电压时会出现AD数据偏差大或不稳定,根本识别不了,如果用5V供电就没问题,不知道各位大佬有没遇到过?是否有方法解决?请看下面硬件线路是否合理?

df16ed809e02dfd8efd657e088b5cc4.jpg (447.33 KB, 下载次数: 15)

df16ed809e02dfd8efd657e088b5cc4.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:879348 发表于 2024-8-30 08:13 | 只看该作者
因为STC没有内部参考,当负载变化,ADC也会变化,最简单的是供电2.5V LDO
不加也可以同时间读取15通道,计算转化一下
回复

使用道具 举报

板凳
ID:1034262 发表于 2024-8-30 09:50 | 只看该作者
如果电池是接在单片机的VCC上,则读ADC的15通道得到adc15,计算得到VCC电压:
VCC = 1.19*1024/adc15,不需要外部电路,非常方便,准确度高。如果你的VCC波动大,加数字滤波即可稳定。
回复

使用道具 举报

地板
ID:277550 发表于 2024-8-30 09:57 | 只看该作者
哪個系列的單片機  
電路中其他的外設有多大影響

等等因素
回复

使用道具 举报

5#
ID:322939 发表于 2024-8-30 13:56 | 只看该作者
这个型号的芯片读内部基准电压没有15通道 ,只能读ROM,RAM和CHIPID这3种方式,真麻烦。
回复

使用道具 举报

6#
ID:332444 发表于 2024-8-30 14:03 | 只看该作者
从外面建立比较电路作为开关量送给单片机或是光耦信号给单片机可参https://blog.csdn.net/xianfajush ... 1018.2226.3001.4450
回复

使用道具 举报

7#
ID:401564 发表于 2024-8-30 14:32 | 只看该作者
LAW1100 发表于 2024-8-30 13:56
这个型号的芯片读内部基准电压没有15通道 ,只能读ROM,RAM和CHIPID这3种方式,真麻烦。

图片上的是STC8H1K08,这款是有内部稳定的参考电压的
回复

使用道具 举报

8#
ID:322939 发表于 2024-8-30 14:54 | 只看该作者

8H的是读内存里的电压

51hei图片_20240830145341.jpg (678.7 KB, 下载次数: 15)

51hei图片_20240830145341.jpg
回复

使用道具 举报

9#
ID:322939 发表于 2024-8-30 16:07 | 只看该作者
用5V供电ADC读出来没问题,用电池供电读出来却是0
回复

使用道具 举报

10#
ID:624769 发表于 2024-8-30 21:45 | 只看该作者
电池供电的话,直接读15通道,就能算出电池电压了.
回复

使用道具 举报

11#
ID:322939 发表于 2024-8-31 08:40 | 只看该作者
188610329 发表于 2024-8-30 21:45
电池供电的话,直接读15通道,就能算出电池电压了.

没用过这功能,
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电压??
回复

使用道具 举报

12#
ID:322939 发表于 2024-8-31 08:41 | 只看该作者
ADC15通道能测量VCC电压,那测量其它通道(如电流取样电压)是否可以测量?
回复

使用道具 举报

13#
ID:624769 发表于 2024-8-31 09:26 | 只看该作者
LAW1100 发表于 2024-8-31 08:40
没用过这功能,
unigned int Temp=0;
unigned int  sum=0;

STC8H 系列是 12位ADC  ADC读值应该是在 0~4095 之间,你17440是怎么来的?
正常情况下,读取15通道,根据你电池供电电压的不同,应该得到 1100~1300左右的值,读取 BGV 记录得到 15通道电压为:1193mv 左右的出厂测定的电压值, 按 ADCValue 1300 为 1193mv 就可以逆算出 满量程 4095 对应的电源电压为:3758mv
回复

使用道具 举报

14#
ID:322939 发表于 2024-8-31 15:17 | 只看该作者
188610329 发表于 2024-8-31 09:26
STC8H 系列是 12位ADC  ADC读值应该是在 0~4095 之间,你17440是怎么来的?
正常情况下,读取15通道,根 ...

我是用串口打印出来的(17440),8H系列AD有两种,10位和12位,网上有的算法是分开算的(如AD10位就读1024,12位的读4096),不知能不能测量其它通道的电压?如果不行就转芯片了。多谢!
回复

使用道具 举报

15#
ID:322939 发表于 2024-8-31 15:18 | 只看该作者
感谢各位大佬的意见!
回复

使用道具 举报

16#
ID:322939 发表于 2024-8-31 15:36 | 只看该作者
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电压那就相差太远了,不知是不是算法问题还是其它问题?
回复

使用道具 举报

17#
ID:624769 发表于 2024-9-1 19:31 | 只看该作者
LAW1100 发表于 2024-8-31 15:36
unigned int Temp=0;
unigned int  sum=0;
float voltage=0.0;

除非你的供电电池 真的是2.4V 电池,不然,你的代码100%有问题,正常锂电池供电 读取15通道,渎值应当是 1200左右的, 你能读出 2040 那么代码肯定不对,就好像你之前说 读出来17440 一样,你还是仔细检查你的代码吧,不用折腾那些有的没有的所谓滤波,你先确保你 ADC_Value 读出来的东西 是对的。
回复

使用道具 举报

18#
ID:401564 发表于 2024-9-2 00:13 | 只看该作者
LAW1100 发表于 2024-8-31 15:36
unigned int Temp=0;
unigned int  sum=0;
float voltage=0.0;

unigned int Temp=0;这个声明看一下
你就知道怎么回事了
12位数据累加32次,会不会溢出呢?
回复

使用道具 举报

19#
ID:71955 发表于 2024-9-2 22:02 来自手机 | 只看该作者
亮出你封装的Get_Adc(15)函数就一目了然了,15通道ADc好像是二进过制1111,你搞个15上去是什么意思呢
回复

使用道具 举报

20#
ID:71955 发表于 2024-9-2 22:34 | 只看该作者
不好意思小弟不才,忘记自己是初学者乱回复.15就是1111
回复

使用道具 举报

21#
ID:322939 发表于 2024-9-3 14:42 | 只看该作者
15通道除了测量VCC外,不知能不能测其它通道的电压?
回复

使用道具 举报

22#
ID:1128898 发表于 2024-9-3 19:21 | 只看该作者
可能是封装问题
回复

使用道具 举报

23#
ID:541750 发表于 2024-9-4 11:12 | 只看该作者
你好,我看到你STC 1.19V基准电压问题,后面解决了吗?我也碰到这个问题了,能否向你请教 一下, 我的VX  13757468658
回复

使用道具 举报

24#
ID:541750 发表于 2024-9-4 11:13 | 只看该作者
你好,我看到你STC 1.19V基准电压问题,后面解决了吗?我也碰到这个问题了,能否向你请教 一下,我输入5V,测试出来输出 为什么只有3.0V
回复

使用道具 举报

25#
ID:541750 发表于 2024-9-4 12:22 | 只看该作者
#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á·ü
}
回复

使用道具 举报

26#
ID:541750 发表于 2024-9-4 12:22 | 只看该作者
这个代码测试出来的电压是3069,错在哪里?
回复

使用道具 举报

27#
ID:71955 发表于 2024-9-4 23:26 来自手机 | 只看该作者
VDDA = (unsigned int)(1023L*(*BGV/res));改成VDDA = (unsigned int)(1023L*(1190/res));可以了。8H不支持内存读内部参考电压参
回复

使用道具 举报

28#
ID:322939 发表于 2024-9-6 09:46 | 只看该作者
如果只能测量15通道VDD电压而不能测量其它通道电压,那就不合适这个项目,只能转其它芯片了,多谢各位了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表