G2024_廃品リチウム電池充電回路
2025年10月24日
14:44
G2024_lpc812_junk_lithium_battery_charging
プロジェクトのサンプルリンク
Version:0.9 StartHTML:00000000 EndHTML:00000000 StartFragment:00000000 EndFragment:00000000 解凍してLPC812フォルダの中に保存する
近年頻繁にリチウム電池の発火事故が報道されており、リチウム電池の再利用の記事は危険なので記載するつもりはありませんでした。家、車、飛行機が丸焦げになっているニュースは記憶に新しいところです。
正しく扱うとこのような事故は起こらず、電動工具の再生に大変役立つことから、記載することにしました。
またネタが少ないことから、記載をします。
お願い
取り扱いの注意事項
分解の考察




















配線の取り付けと保護チューブ




















充電回路
以下に記載される「定電流回路」はあくまで基本回路でありまして、既存の充電回路(10年の利用実績があります)を、今回の記事起こしに先立って、測定したところ、充電の進行に伴って変化しており、「定電流」とは言えません
充電電流が大きくなることを防止する回路のようなものになっております
充電電流 リチウム電池の電圧
1100 mA 2.70 V
1100 mA 3.14 V
750 mA 3.54 V
360 mA 4.00 V



チップトランジスター 低雑音 2SC2712-Y 50V150mA: 半導体 秋月電子通商-電子部品・ネット通販

ユニバーサル基板 ブレッドボード配線パターンタイプ 56.5×32mm: 基板・ブレッドボード・ラグ板 秋月電子通商-電子部品・ネット通販





















廃品利用しています


超小型 金属皮膜抵抗 1W0.1Ω: 受動部品 秋月電子通商-電子部品・ネット通販










充電完了を検出する

マイコン回路の検討
3.3V定電圧を2回路
低ドロップアウト電圧レギュレーター 3.3V300mA SOT-23 AP7333: 半導体 秋月電子通商-電子部品・ネット通販



12bit 4ch ADコンバーター MCP3204-BI/P: 半導体 秋月電子通商-電子部品・ネット通販























マイコンの書き込みテスト








マイコンPIO配置確認
★ 過去の LPC812_LIT_BAT プロジェクトではなく、実験記事の G2022 の配線を使います




★ MOSIのプルアップがはんだ不良で、プログラムテストで時間ロスがありました
導通チェックは確実にしなければいいけません




マイコンプロジェクト LPC_LIT_BAT を編集


実験環境のコードが成功しました

///////////////////////////////////////////////////////
//
// LPC812 LIT_BAT
// 2025.10.31 金曜 goma0099 記事作成と、実験の再開
///////////////////////////////////////////////////////
#include "LPC8xx.h" //ヘッダファイルの読み込み
#include "\LPC\LPC812\KYO\type.h"
#include "stdlib.h" // atoi()
#include "string.h" // memcpy()
//#include "gpio.h"
// 改造された共用関数を一箇所にまとめて最新がインクルードされるように
#include "\LPC\LPC812\KYO\lpc8xx_uart.h"
#include "\LPC\LPC812\KYO\lpc8xx_uart.c"
#include "\LPC\LPC812\KYO\lpc8xx_i2c.h"
#include "\LPC\LPC812\KYO\lpc8xx_i2c.c"
#include "\LPC\LPC812\KYO\lpc812_kyo.h"
#include "\LPC\lpc_kyo.h"
void SwitchMatrix_Init()
{
/* Enable SWM clock */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);
/* Pin Assign 8 bit Configuration */
/* U0_TXD */
/* U0_RXD */
LPC_SWM->PINASSIGN0 = 0xffff0004UL;
/* I2C0_SDA */
LPC_SWM->PINASSIGN7 = 0x11ffffffUL;
/* I2C0_SCL */
LPC_SWM->PINASSIGN8 = 0xffffff0dUL;
/* Pin Assign 1 bit Configuration */
/* RESET */
LPC_SWM->PINENABLE0 = 0xffffffbfUL;
}
// インターバル割り込み関数を msec 待ち時間関数に活用しています
void SysTick_Handler(void)
{
if(--Goma_msec_wait_cnt == 0)
{ NVIC_DisableIRQ(SysTick_IRQn); // 割り込み無効
}
}
int main(void)
{
int8_t led[2]; // LED ピン番号
int8_t bat[2]; // 充電制御ピン番号
int8_t mod[2]; // 状態ピン番号
uint32_t cnt,i;
uint16_t ad_dat[2];
uint32_t gokei[2];
uint32_t ad_cmp;
uint32_t av_max;
int8_t cs_pin; // PIOの定義忘れがあり時間ロスしました
// 忘れ防止の為、明示的にします
bat[0] = 10; // 充電開始信号
bat[1] = 11; // 充電開始信号
led[0] = 12; // 状態LED
led[1] = 13; // 状態LED
// スイッチ・マトリックス設定
SwitchMatrix_Init();
SPI_CLK_pin = 6;
SPI_SOMI_pin = 7;
SPI_MOSI_pin = 8;
cs_pin = 9;
//ポートの方向決定
pin_set_output(SPI_CLK_pin); // MCP3208 CLK
pin_set_input(SPI_SOMI_pin); // MCP3208 OUTPUT
pin_set_output(SPI_MOSI_pin); // MCP3208 INPUT
pin_set_output(cs_pin); // MCP3208 CS 定義忘れがあり時間ロスしました
pin_set_output(bat[0]);
pin_set_output(bat[1]);
pin_set_output(led[0]);
pin_set_output(led[1]);
//////////////////////////////////////
// 周期割り込みの初期化
//////////////////////////////////////
SystemCoreClockUpdate();
SysTick_Config( SYSTICK_DELAY );
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
UARTInit(LPC_USART0,115200); // UART初期化関数( bpsに設定)
// i2c通信は未使用なので、初期化は省いています
UART_puts("speed 115200 \r\n");
// 前回バージョンでは、 LEDの ON/OFF が反転していました
// おそらくLED点灯を マイコンPIOの流れ込みにしたと思われます
// コードがわかりにくくミスを招くので、PIOの流れ出しを使って点灯させます
// 旧バージョンの充電回路の配線変更が必要となります
// LEDモニタ
for(cnt=0;cnt<10;cnt++)
{
pin_out(led[0],1,'m',100);
pin_out(led[0],0,'m',100);
}
for(cnt=0 ; cnt<2 ; cnt++)
{
mod[cnt] = 0;
pin_out(led[cnt],0,'m',0); // LED OFF
pin_out(bat[cnt],0,'m',0); // 充電 OFF
}
while(1)
{
wait_sec('m',5000);
for(cnt=0 ; cnt<2 ; cnt++)
{
// デバッグモニタ
UART_puts("No.");
UART_putdec(cnt);
UART_puts("-mod-");
UART_putdec(mod[cnt]);
UART_puts("-");
wait_sec('m',500);
gokei[cnt] = 0;
av_max = 10;
for(i=0 ; i<av_max ; i++)
{
gokei[cnt] += mcp3208_read(9,(uint8_t)cnt);
wait_sec('m',200);
}
ad_dat[cnt] = gokei[cnt] / av_max;
// デバッグモニタ
UART_putdec(ad_dat[cnt]);
UART_puts("\r\n");
// 充電完了の閾値について
// AD変換数値の平均値を取得しています (AD整数 * (3.3/4096))V
// 前回バージョンでは (1154) (0.93V)
// 電池の個性により 3.8 - 4.17 くらいのばらつきがあります
// 充電完了の閾値を少し下げて 電池電圧の調査をします
//ad_cmp = 1154; // 完了の閾値 0.93
ad_cmp = 1254; // 完了の閾値 (1.01V)
switch(mod[cnt])
{
case 0:
if(ad_cmp+100 <= ad_dat[cnt])
{
mod[cnt] = 1; // 充電開始
pin_out(led[cnt],1,'m',0); // LED ON
pin_out(bat[cnt],1,'m',0); // 充電 ON
}
break;
case 1 :
if(ad_dat[cnt] < ad_cmp)
{
mod[cnt] = 2; // 充電完了
pin_out(led[cnt],0,'m',0); // LED OFF
pin_out(bat[cnt],0,'m',0); // 充電 OFF
}
break;
case 2 :
pin_out(bat[cnt],0,'m',0); // 充電 OFF
pin_out(led[cnt],0,'m',150); // LED OFF
pin_out(led[cnt],1,'m',150); // LED ON
pin_out(led[cnt],0,'m',150); // LED OFF
pin_out(led[cnt],1,'m',150); // LED ON
pin_out(led[cnt],0,'m',150); // LED OFF
pin_out(led[cnt],1,'m',150); // LED ON
pin_out(led[cnt],0,'m',150); // LED OFF
if(ad_dat[cnt] < ad_cmp-300)
{
// 充電完了から、電池が外された 初期に戻す
mod[cnt] = 0;
}
break;
}
}
}
}
充電の考察

12時間放置後の電圧低下
4.05 -> 4.01
4.27 -> 4.24
閾値の試算
(3.3/4096)*1154=0.9297
(3.3/4096)*1254=1.0103
(3.3/4096)*1350=1.0876
(3.3/4096)*1400=1.1279
間欠充電の考察
3.93Vの電池を充電した様子


活用事例


