ThinkNotes

Simple is not easy | 化繁为简,知易行难

0%

Picgo使用ImgurL图床支持国内访问

背景

之前我的markdown文章图床是使用picgo+github图床,但是不搭梯子情况下图片无法访问,其他图床如SM.MS也不可用,阿里云之类的性价比低不可持续。使用cnblogs的话taste太差,综合考虑使用国内图床ImgURL(山寨Imgur)。记录环境搭建的一些问题。

Picgo和插件的安装

  1. 前往Github:https://github.com/Molunerfinn/PicGo/releases 根据你的平台下载最新版本安装。
  2. 前往Node.js官网:https://nodejs.org/zh-cn/ 下载最新版Node.js安装(PicGo插件需要)。
  3. 退出PicGo并重新打开,在插件设置中搜索“web-uploader”插件进行安装,用于支持自定义图床。

如果插件无法搜索到,可能是node环境问题或者GFW问题。下面使用npm命令行手动安装插件。

首先确认node npm环境正常:

1
2
node -v #显示node.js版本 
npm -v #显示npm版本

cd进入到PicGO的数据目录,默认是:C:\Users\{计算机用户名}\AppData\Roaming\picgo

npm换成淘宝的镜像源(必须)

阅读全文 »

电量计 – 77561电池建模和调参

合并电池建模数据到PRJ

77561的可配参数包括建模表都是cobra直接配置到flash,因此直接在现有prj上编辑参数:

(1)导入TableMaker输出的OCV_falcon.txt(X轴是电压的版本)和RC.txt表

image-20250331173554812

(2)导入电池规格参数

电量计采样是双节电芯才按双节电压处理;如果是电量计两个通道分别采样单节电芯要按单节电芯算,电池包的电压参数要除2。

多串电芯的示例(双节采样):

image-20250331193151566

多并电芯的示例:

阅读全文 »

电量计 – HDQ调试过程

用GPIO INT pin(支持WKUP)实现HDQ接口,实现slave,配合host驱动通信,获取电量信息。并且和I2C接口兼容不冲突。

Keil sct和项目配置

(1) Keil工程配置

Keil的IROM,IRAM配置的主要作用是在编译期发现空间不够的问题,编译器提前报错。

IRAM只是代码段,不包含堆栈,所以IRAM大小要预留STACK和HEAP空间,不然编译期不报错,运行期STACK爆了很难查

image-20250716114617057

(2) sct链接配置

真正配置IROM和IRAM空间分布的是.sct文件,如下是newton FW sct

sct的含义参考Keil文档,这里不详细描述。需要会区分IROM,IRAM,知道(+RO)表示代码段,(+RW +ZI)表示数据段,.ANY和*.o是通配。

阅读全文 »

电量计 – 电池基础知识和电量计算法简介

算法背景简介

电池建模

电量计芯片算法首先是建立在电池 / 电芯建模的基础上。 由于电芯的SOC受到电池的电压,电池充放电电流以及温度的影响。

根据客户应用场景的需求, 将电芯按照不同的温度和电流进行充电和放电,得到不同场景的充放电数据。 通过大瞬科技自己研发的数据处理软件, 作为该种电池的基础模型数据保存下来, 储存在芯片 flash 或主机端中作为算法的内部数据使用。 当电池进行充放电时, 芯片固件会参考该数据, 对芯片的充放电 SOC 状态进行误差评估, 然后结合当前的电压, 电流和温度, 进行动态的修正。 抑制各种动态环境带来的偏差。

电量计建模会生成两种数据内容:

电池的OCV(Open Circuit Voltage)表,由于库伦积分法无法得到电池的初始SOC,所以在电池上电的初始阶段会应用此表查到的SOC来作为电池初始化的SOC.

电池在不同电压,不同电流以及不同温度下的SOC表格,此表用来作为安时积分法的SOC计算参考表格。
温度一般选取-10度,0度,25度和45度4个点。
电流根据客户的充放电应用选取3-4个点。
同时记录电池在不同温度和不同电流下不同SOC对应的电压点。
在实际应用中,对于温度或电流不在建模表范围内的点,采用专用算法进行插值处理。

算法介绍

电芯按照充放电状态,可以分为充充电状态,空闲状态和放电状态,三种状态会分别执行不同的逻辑。

阅读全文 »

电量计 – 阻抗追踪算法移植和调试

V_term跳变导致R跳变

放电电流的大小本身不会影响电池内阻,电池内阻是电池固有状态。

但是调整电流时,因为压降变化,V_term会有大幅度跳变,会影响内阻计算,导致内阻跳变。

这属于算法问题,并不是真实内阻有跳变。

方案:平滑V_term,使用avgcellmv

image-20250804164236977

电量计–问题和功能记录

切换CV相关问题

充电过充中切cv

需求描述:(NPC660项目)在充电过充中Host发送SBS73命令切换截止电压,从默认的4.35v切到4.1v,同时Charger充电器也设置截止电压4.15v以保证能充满到4.1v。期望充电到4.1v时rsoc能报100.

问题分析:在充电过充中切换截止电压,之前电量计累计的数据没有清0,导致充满到4.1v时电量还是按4.35v计算,只有70%

解决方案:收到SBS73就复位电量计数据(清0),注意清0会导致rsoc跳变。

image-20250408135441409

放电过充中切cv

需求描述:(NPC660项目)按4.35v充满后,如果长时间没拔下充电器,充电器会判断为长时间过充,Host发送SBS73命令切换截止电压,从默认的4.35v切到4.1v,之后放电到4.1v。期望放电到4.1v过充中rsoc能保持100,4.1v以下按正常电量消耗显示,电量无跳变。

问题分析:

阅读全文 »

电量计–77428的MCU sample代码交付

背景

77428电量计的固件代码是固化在芯片内部ROM而不是Flash,无法下载更新。

一般客户需求是提供电量计配套的Host侧MCU sample代码,其中实现可配置参数的下载流程,不同的电池使用不同的参数建模数据,在客户MCU代码运行时下载到电量计。

可配置参数的来源:

(1)电池厂商提供的电池规格书文档和参数信息表excel,FAE和客户沟通获得。

(1)电芯特征数据:电芯拿到实验室 -> 用循环仪器测试工具对电池循环充放电 -> 得到循环仪原始采集文件csv,包括电压电流电荷 -> 使用软件TableMaker从循环仪采集文件中提取出参数文件txt(RC table.txt和OCV table.txt),这部分需要FAE,软件开发,循环仪操作人协作。

可配置参数的写入:MCU host通过I2C给77428 chip中的F/W(固化ROM)通信,写配置参数,以适配不同的电池模块。

电池建模

拿到客户电池,根据电池规格书的放电电流参数范围,决定要采集的电流范围;根据客户需求的温度范围,决定采集的温度范围。

阅读全文 »

电量计–Cobra/循环仪/电池包的测试环境说明

以Newton FW项目(77561, 77226)为例,介绍cobra工具配合客户环境电池包的使用。

客户环境指:电量计内置在电池包,通信接口只有I2C,不支持串口调试和Jtag下载FW;而开发环境的电量计是独立开发板,支持串口打印和Jtag下载。

在实验室环境:使用Chroma循环仪模拟真实的客户Charger,对电量计和电池系统充放电测试,用cobra配置电量计FW和参数并采集数据,调试客户遇到的问题。

Cobra编辑和下载project文件

  1. 启动项目匹配的Cobra shell版本,加载项目oce文件

    cobra shell是程序启动器,版本号在 About查看,目前使用1.01.19版本

    oce是cobra功能文件,决定具体项目支持的功能,不同项目的oce不同;oce分为X版本和Y版本,X为发布给用户使用版本,Y仅用于内部Debug。

    下图在Extension Manager中select SD77226SBS_X_20250315.oce,oce路径在COBRA\Extensions

img

  1. (对于Newton项目)加载prj

prj文件(project)是cobra对Newton FW bin和Flash参数文件xml(parameter_newton,OCV table, RCtable,user_setting)的打包。

加载prj后默认显示newton FW bin:

阅读全文 »

电量计–77561(77226)的Firmware Architecture

Part1 总体结构概述

Keil MDK项目结构

项目基于ARM Cortex-M0 MCU,使用Keil MDK开发环境构建。核心代码分为底层驱动、算法库和应用三层结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- newton.uvprojx           # Keil项目主文件
- newton.sct # 链接脚本
- Device/ # ARM M0 MCU设备相关文件
- RTE/ # 运行时环境配置
- lib/ # 核心算法库文件
- lib_fg.c/h # 电量计核心算法库(Fuel Gauge)
- lib_pg.c/h # 电池包电量计算法库(Pack Gauge)
- user/ # 用户应用代码
- main.c # 主程序入口
- parameter.c/h # 参数配置
- sbsd.c/h # SBS通信协议实现
- filter.c/h # 数据滤波处理
- db_print.c/h # 调试打印功能
- flash/ # Flash操作相关
- chip/ # 芯片驱动层
- table/ # 查找表数据
- o2bootloader/ # 引导加载程序

启动和运行主流程

启动流程

  1. 上电后从o2bootloader引导区启动

  2. 初始化MCU系统时钟和基本外设

  3. 初始化电量计参数和查找表

  4. 调用fg_init函数初始化电量计算法库

  5. 进入主循环

主循环流程

1
2
3
4
5
6
7
[上电] → [初始化] → [主循环{
读取电池数据(电压/电流/温度)
处理电量计算法
更新SOC和其他电池状态
处理SBS通信请求
进入低功耗状态
}]
阅读全文 »

STM32–串口:UART和USB-COM

背景描述:STM32板子有TTL UART连接下游IC,同时有USB口连接上游的上位机PC。

本文描述STM32如何直接使用UART通信,如何用USB CDC实现虚拟串口USB-COM也用UART通信。

UART项目配置

image-20240430115304007

UART的轮询与中断

USB的CDC类实现USB-COM

image-20240430141713692

双串口的实现:UART和USB-COM

image-20240430141738799

阅读全文 »