数码之家

 找回密码
 立即注册
搜索
查看: 1519|回复: 45

[Arduino] 最简单的单片机应用,限制锂电池充电电压范围,MSP430G2452,ADC

[复制链接]
发表于 2023-4-22 15:03:16 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先说说我遇到的问题,


有一个古老的安卓三星手机,三寸多的屏幕,淘汰以后,装一个时钟App, 挂在墙上当挂钟,黑底绿色的数字,还挺显眼的

一开始是直接插着充电器的,没过几个月电池就鼓包了,手机还是可以拆后盖子的,电池把后盖顶开了,没有电池了,手机插着充电线还不让开机,又不想买替换的电池,就把原来的电池的保护板拆下来继续用,接了一个扁平的小锂电池继续用,盖子还能盖回去


第一次想到的保护电池的办法就是定时给手机通电,用了一个闲置的机械式24小时定时器,一圈拨杆,设定好通断时间,
其中一些小问题是,通断时间设置不好,电池就会耗光,增加一些时间后,电池又会比较多比例的充满

果然,又过了几个月锂电池又鼓包了

第三次换锂电池,找不到小个头的了,就用了一个拆机聚合物锂电池,个头比较大,只好在后盖上钻孔引出电线,电池就挂在手机背后了


这次还是用了定时器一段时间,可心里总是担心电池再次鼓包,就想更好的解决这个充电问题


我手头的MSP430单片机体验包还是十多年前TI做推广,申请的免费样品

一个入门开发板,两个20脚单片机,一个MSP430G2452,一个MSP430G2553

MSP430G2452的参数差一些

我曾经用MSP430G2452做了一个电子时钟,控制LED,就简单的多了

这次要学ADC,也是第一次

先说一下,MSP430G2452最小系统,只需要一个电阻,一个电容即可,太方便了,47K电阻和1uF电容,都是接在reset脚上的


我增加的,就是3.3V供电,两个5K电阻分压取样,一个NPN三极管,加1K限流电阻,用输出控制继电器,买的现成的5V继电器模块,试用才发现模块用了PNP三极管,而且控制电压要5V,所以我只能自己增加一个NPN三极管了

自己画的电路图,不是专业的,第一次学画,用了免费的KiCAD, 软件官网www.kicad.org

d1.png



3.3V供电,我是从废旧电路板上找到了,正好看到一个周围元件比较少的,电源芯片加上两个贴片电容,这回简单了,直接连电路板挖下来,我都不用自己焊接贴片元件了


继电器模块是买的,做了小改动,上面说了


取样电路要分压,因为我用的这款单片机,我用了内部参考电压2.5V, 取样的电压范围只能是0V~2.5V
锂电池电压最高4.2V, 我用两个5K电阻分压,输入电压减半

小制作用了洞洞板,把继电器模块固定上去,装了其他元件,有因地制宜,用双面胶把两个5V1A的充电器粘在上面,外面胶带固定,只能这么简陋了


s1.jpg



s2.jpg



s3.jpg



电池电压控制在3.8V 到 4.05V 之间

控制继电器,就跟LED开关一样简单,代码照抄

代码异常的简单

  1. #include <msp430.h>


  2. void longDelay(void)
  3. {
  4.     _delay_cycles(1000000);
  5. }



  6. unsigned int Hi_V, Lo_V;

  7. void main(void)
  8. {
  9.     WDTCTL = WDTPW | WDTHOLD;       // stop watchdog timer
  10.     P1DIR |= 0x01;                  // configure P1.0 as output

  11.     BCSCTL1= CALBC1_1MHZ;
  12.     DCOCTL = CALDCO_1MHZ;

  13.     // Set Ref as internal 2.5V, ADC10ON, enable interrupt
  14.     ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + REF2_5V + ADC10ON + ADC10IE;
  15.     _delay_cycles(30);                // Delay to allow Ref to settle

  16.     ADC10CTL1 = INCH_5|SHS_0|ADC10DIV_0|ADC10SSEL_0|CONSEQ_0;
  17.     ADC10AE0 |= BIT5;             // Set P1.5 as A5 input , INCH_5

  18.     P1DIR |= BIT5;                // Set P1.5 to output direction




  19.     Hi_V=828; //1023*4.05/2/2.5 = 828

  20.     Lo_V=777; //1023*3.8/2/2.5 = 777

  21.     while(1)
  22.     {
  23.         ADC10CTL0 |= ENC+ ADC10SC;                // Sampling and conversion start
  24.          __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exi

  25.         if (ADC10MEM < Lo_V) P1OUT = 0x01;//LED ON
  26.         if(  ADC10MEM > Hi_V ) P1OUT = 0x00;   //LED off

  27.         longDelay();
  28.     }

  29. }

  30. // ADC10 interrupt ** routine
  31. #pragma vector=ADC10_VECTOR
  32. __interrupt void ADC10_ISR (void)
  33. {
  34.   __bic_SR_register_on_exit(CPUOFF);                // Clear CPUOFF bit from 0(SR)
  35. }
复制代码




做完用上,发现手机显示电池范围大约在50%~70%,
经过测量,才知道是锂电池已经老了,内阻大,充电的时候,电池电压会上升0.1V, 所以充电电压限制应该再提高一些,关闭充电后,电池电压才会接近4.05V

懒得再拆芯片重新改程序了,就在分压电阻上做调整了,找了一个329欧姆的电阻,加在分压电路的上端,提高了电压上限,当然同时电压的下限也跟着提高了


最后,手机显示电池的电压范围大约是60%到80%


希望这个小制作能够避免电池再鼓包吧

感谢各位看官耐心看完,欢迎指导



发表于 2023-4-22 15:18:00 | 显示全部楼层
为啥要控制220V端啊,这样不是很危险,而且还要两个充电器。
你用一个充电器,5V出来给单片机,再用MOS管或者继电器控制通断给充电就好啦呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-22 15:38:53 | 显示全部楼层
记录了一下最后效果,用了电池内阻测试器的电脑记录软件



20230421.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-22 15:40:54 | 显示全部楼层
2545889167 发表于 2023-4-22 15:18
为啥要控制220V端啊,这样不是很危险,而且还要两个充电器。
你用一个充电器,5V出来给单片机,再用MOS管或 ...

这不是懒得拆充电器了么,反正手头闲置的5V充电器很多

想着做的这东西,体积也不算大,胶带缠两圈,也足够绝缘了吧
回复 支持 反对

使用道具 举报

发表于 2023-4-22 16:09:47 | 显示全部楼层
充90电  用50有时间就补电了。深度100-20=80%大差度放电损耗快。
回复 支持 反对

使用道具 举报

发表于 2023-4-22 17:29:50 | 显示全部楼层
有其他的办法么
回复 支持 反对

使用道具 举报

发表于 2023-4-22 18:07:13 来自手机浏览器 | 显示全部楼层
直接用充电管理芯片控制不就行了?
回复 支持 反对

使用道具 举报

发表于 2023-4-22 18:21:58 | 显示全部楼层
为什么不直接用一个大的电容代替电池 体积不怕就可以 话说 大电容比这俩充电器体积小吧
回复 支持 反对

使用道具 举报

发表于 2023-4-22 20:09:51 | 显示全部楼层
也想改,买了一个法拉电容替换电池端,只是旧手机有时候不会充电,目前暂时还没找到办法
回复 支持 反对

使用道具 举报

发表于 2023-4-22 20:10:18 来自手机浏览器 | 显示全部楼层
你这个虽说是废物利用,但也太不环保了。
还是再学点别的吧,若是有root权限,或者可以刷修改版的boot.img还能开机,完全可以注册个服务,监控电池电压,让他在3.7伏开始充电,4.1伏停止充电,或者直接安装相应功能的APP,这样节能还环保。
至于咋加这个服务或者用啥APP,我早就忘了,可以问问chatGPT,了解一下

回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2023-4-22 20:16:55 | 显示全部楼层
2545889167 发表于 2023-4-22 15:18
为啥要控制220V端啊,这样不是很危险,而且还要两个充电器。
你用一个充电器,5V出来给单片机,再用MOS管或 ...

好久不见你发单片机的帖子了,
你现在用的什么单片机?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 01:29:23 | 显示全部楼层
wpll 发表于 2023-4-22 18:21
为什么不直接用一个大的电容代替电池 体积不怕就可以 话说 大电容比这俩充电器体积小吧 ...

还是手头没有你说的这东西,我也不了解,想出来的办法都很有限
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 01:30:12 | 显示全部楼层
jxf269 发表于 2023-4-22 20:10
你这个虽说是废物利用,但也太不环保了。
还是再学点别的吧,若是有root权限,或者可以刷修改版的boot.img ...

没有安卓开发的经验,从头学比单片机复杂多了把
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 01:31:39 | 显示全部楼层
mmxx2015 发表于 2023-4-22 18:07
直接用充电管理芯片控制不就行了?

关键是不会啊,不知道怎么直接控制手机的充电管理芯片
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 01:39:14 | 显示全部楼层
我用的安卓手机系统是12,还可以用automate app加上ifttt加上TP-link智能插座来控制,充电到了80%自动停止充电

可惜这一套设置在旧的安卓手机上实现不了,就是因为系统版本太低了,装不上automate app
回复 支持 反对

使用道具 举报

发表于 2023-4-23 03:50:29 | 显示全部楼层
pcdoctor 发表于 2023-4-23 01:31
关键是不会啊,不知道怎么直接控制手机的充电管理芯片

我的意思是把电池与手机的连接断开,接入充电控制电路,从充电电路输出引线到手机电池触点上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 04:11:17 | 显示全部楼层
mmxx2015 发表于 2023-4-23 03:50
我的意思是把电池与手机的连接断开,接入充电控制电路,从充电电路输出引线到手机电池触点上。 ...

你说的这个主意也不错,只是我没有任何充电控制电路的基础,这么做对我来说难度更大了
回复 支持 反对

使用道具 举报

发表于 2023-4-23 08:33:35 | 显示全部楼层
既然用adc ,你可以去在充电线路里串联个采样电阻,去测充电电流,如果电流大就充电,等到冲到90%变成涓流小电流就断开充电,隔一段时间再充电检测,这样应该更简单合理?
回复 支持 反对

使用道具 举报

发表于 2023-4-23 08:57:23 | 显示全部楼层
本帖最后由 dianziguan 于 2023-4-23 08:59 编辑

楼主的做法很有技术含量,但感觉是高射炮打蚊子。
我研究过这个问题,两个解决办法:一是和拆掉电芯后,usb口电源脚和保护板电源脚之间串一个二极管;二是把电芯换成超级电容。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 11:13:17 | 显示全部楼层
dianziguan 发表于 2023-4-23 08:57
楼主的做法很有技术含量,但感觉是高射炮打蚊子。
我研究过这个问题,两个解决办法:一是和拆掉电芯后,usb ...

你串联一个二极管,可是锂电池需要充电和放电,双向电流,二极管是怎么实现的呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 05:09 , Processed in 0.421201 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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