数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2451|回复: 45

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

[复制链接]
发表于 2023-4-22 15:03:16 | 显示全部楼层 |阅读模式
先说说我遇到的问题,


有一个古老的安卓三星手机,三寸多的屏幕,淘汰以后,装一个时钟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





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


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


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

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














电池电压控制在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%


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

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



本帖子中包含更多资源

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

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




本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2023-4-23 11:15:12 | 显示全部楼层
kkstun 发表于 2023-4-23 08:33
既然用adc ,你可以去在充电线路里串联个采样电阻,去测充电电流,如果电流大就充电,等到冲到90%变成涓流 ...

我理解的,如果要通过测量采样电阻的电压来测试电流,应该需要一个放大电路吧,否则采样电阻两端的电压变化太小
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 15:35:23 | 显示全部楼层
kkstun 发表于 2023-4-23 14:12
是的要求不高就是lm358吗。

我完全是个业余的,你说的这个,我还要花时间去认识一下,如果用在我的电路里,还要更多的知识储备
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 15:38:05 | 显示全部楼层
kpj001 发表于 2023-4-23 14:51
能开盖从电池位置引线出来采样,那么直接供4V电压就完事。

你的建议真的是太对了,我已经被5V充电器给洗脑了,我下一步就是改装一个4V的电源,来替换掉这个单片机的作品,这样,这个单片机就可以做别的事情了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 15:43:11 | 显示全部楼层
kpj001 发表于 2023-4-23 14:51
能开盖从电池位置引线出来采样,那么直接供4V电压就完事。

我首先想到的就是5V电源串联二极管,就可以降压,只是一个二极管,正向压降不够用,两个二极管,压降有太多了,不能凑到4V
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 15:52:08 | 显示全部楼层
kpj001 发表于 2023-4-23 14:51
能开盖从电池位置引线出来采样,那么直接供4V电压就完事。

立刻动手在拆机二极管里面找,结果还真的很幸运,找了两个二极管串联,压降1.04V,算是比较完美的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 16:51:35 | 显示全部楼层
本帖最后由 pcdoctor 于 2023-4-23 17:04 编辑

找了一个5V电源,输出电压是4.94V, 三个二极管串联,压降到了3.92V
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 16:57:01 | 显示全部楼层
手机显示电量62%, 应该是永远就是这样了,电池只要不鼓包,可以用好多年了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 16:58:12 | 显示全部楼层
我所担心的一件事情,就是如果停电一段时间后,电池电压下降了,再来点,岂不是会有很大的充电电流么?这样会不会有危险?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 17:00:56 | 显示全部楼层
我的理解,电源输出标了1.2A,如果电流变大了,最多也就是1.2A,电池电压迅速升到了3.92V电流就应该会很小了,只是手机本身的耗电量
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 17:54:14 | 显示全部楼层
我现在用的电池包,没有保护板,我还是换一个有保护板的,更加安心一点,万一电源出现异常,保护板还可以保护一下锂电池包
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 18:23:20 | 显示全部楼层
二极管测量出的压降,和在电路中的压降是不一样的啊,

两个二极管串联,测量的压降是1.04V, 结果实际串在电路中,有电流通过的压降是1.4V,电流大约100mA而已

回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 07:55 , Processed in 0.592801 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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