ADD: Added Temperature strategies for Gauge

This commit is contained in:
Eduard Iten 2025-10-04 10:29:20 +02:00
parent f3c4184c27
commit 95f525dfd2
1 changed files with 194 additions and 0 deletions

View File

@ -0,0 +1,194 @@
# Energieversorgung
<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
<!-- code_chunk_output -->
- [Energieversorgung](#energieversorgung)
- [Übersicht](#übersicht)
- [Detailbeschreibung](#detailbeschreibung)
- [Externe Quellen](#externe-quellen)
- [USB-C Port](#usb-c-port)
- [Debug Port](#debug-port)
- [Batterien](#batterien)
- [Li-Ion-Akku](#li-ion-akku)
- [Akkuschutz](#akkuschutz)
- [Fuel Gauge](#fuel-gauge)
- [CR1220](#cr1220)
- [Energiewandlung](#energiewandlung)
- [Lader](#lader)
- [3.3V Buck-Boost-Wandler (DC/DC-Wandler)](#33v-buck-boost-wandler-dcdc-wandler)
- [SD Schalter](#sd-schalter)
- [3.3V LDO](#33v-ldo)
- [Power-Mux](#power-mux)
- [Dimensionierungen](#dimensionierungen)
- [N-FETs](#n-fets)
<!-- /code_chunk_output -->
## Übersicht
Die Energieversorgung des Geräts besteht aus drei Hauptkomponenten:
- Externe Energieversorgung (USB, Debug-Stecker)
- Interner 1S LiPo/LiIon-Akku
- Interne Knopfzelle (CR1220)
Aus diesen Quellen werden mehrere interne Spannungsversorgungen erzeugt:
- `VDD` ist die Hauptversorgung für den Mikrocontroller, den Sensor und den externen Flash-Speicher. Sie wird durch einen Buck-Boost-Wandler aus der externen Versorgung oder dem Li-Ion-Akku erzeugt. Der Wandler ist zur Energieeinsparung schaltbar.
- `VDDSD` versorgt den MicroSD-Kartenslot. Diese Versorgung ist schaltbar, da eine SD-Karte auch im Ruhezustand einen signifikanten Stromverbrauch hat.
- `VRTC` versorgt die Echtzeituhr (RTC) und den `VBAT`-Pin des Mikrocontrollers. Diese Spannung ist immer vorhanden, solange der Batterieschutz nicht ausgelöst hat. Die Versorgung erfolgt über einen Power-MUX, der priorisiert von `VDD` gespeist wird. Fällt `VDD` aus, erfolgt die Versorgung über einen LDO direkt vom Li-Ion-Akku (nach der Schutzschaltung).
- `VBACKUP` ist die Spannung der CR1220-Zelle. Sie dient als Backup-Versorgung für die RTC, falls der Akku entfernt wird oder der Tiefentladeschutz auslöst.
Das vereinfachte Blockschaltbild sieht wie folgt aus:
```mermaid
graph TD;
subgraph "Batterien"
LIPO[(Li-Ion Akku)];
PROTECTION[Akkuschutz];
GAUGE[Fuel Gauge];
CR1220[(CR1220)];
end
LIPO <--> PROTECTION;
PROTECTION <--> GAUGE;
CR1220 --> VBACKUP;
subgraph "Externe Quellen"
USBC[USB-C Port];
DEBUG[Programmier-Port];
end
subgraph "Energiewandlung"
LDO[3.3V LDO];
DCDC[3.3V Buck-Boost];
CHARGER[Lader];
SDSWITCH[SD Schalter];
MUX[Power-Mux]
end
USBC --> CHARGER;
DEBUG --> CHARGER;
GAUGE <--> CHARGER;
CHARGER --> DCDC --> VDD;
CHARGER --> LDO;
LDO --> MUX;
DCDC --> MUX --> VRTC;
DCDC --> SDSWITCH --> VDDSD;
subgraph "Verfügbare Versorgungen"
VBACKUP(VBACKUP);
VRTC(VRTC);
VDDSD(VDDSD);
VDD(VDD);
end
```
## Detailbeschreibung
### Externe Quellen
#### USB-C Port
Das Gerät verfügt über einen USB-C-Port, der sowohl der Datenübertragung als auch der Energieversorgung dient. Das Gerät kann sowohl an einem PC/Laptop als auch an gängigen Netzteilen (Handy-Ladegerät, USB-C Laptop-Netzteil etc.) geladen werden. Dabei muss der jeweils verfügbare Strom beachtet werden. Mehr dazu unter [Lader](#lader).
#### Debug Port
Damit das Gerät auch bei ausschließlich gesteckter Debug-Verbindung funktioniert, können 5V auf den Debug-Port eingespeist werden. Bei den meisten Debug-Adaptern ist der verfügbare Strom begrenzt, weshalb von diesem Eingang maximal 300mA bezogen werden dürfen.
### Batterien
#### Li-Ion-Akku
Als Akku sind zwei parallelgeschaltete 18650-Zellen vorgesehen. Diese werden mittels Nickelstreifen verschweißt, mit einem NTC-Temperatursensor versehen und eingeschrumpft. Die Verbindung zur Schaltung ist vierpolig ausgeführt, da die [Akkuschutzschaltung](#akkuschutz) auf der Hauptplatine (PCB) und nicht im Akku selbst integriert ist. Würde die Schutzschaltung die Minus-Verbindung trennen, wäre der NTC ohne definiertes Potenzial (floatend). Wenn in diesem Zustand eine externe Versorgung angeschlossen wird, würde der [Lader](#lader) den NTC nicht erkennen und den Ladevorgang verweigern. Die Verbindung ist daher als `BAT+`, `BAT-`, `NTC` und `GND` ausgeführt.
#### Akkuschutz
Als Akkuschutz wird ein **FM2113** verbaut. Dieser steuert zwei N-Kanal-MOSFETs (für Laden und Entladen), die in einer Common-Drain-Schaltung zwischen `BAT-` und `GND` platziert sind. Der Baustein schützt vor *Überladung*, *Tiefentladung* und *Überstrom*.
#### Fuel Gauge
Als Fuel Gauge wird der **BQ27441-G1** von Texas Instruments eingesetzt. Der ursprünglich vorgesehene **BQ27427** ist nur für einen Dauerstrom von 2A ausgelegt, womit die vollen Möglichkeiten des [Laders](#lader) und des [Li-Ion-Akkus](#li-ion-akku) nicht ausgenutzt werden könnten.
Zur Strommessung ist ein `0.01Ω` Shunt-Widerstand vorgesehen. Hierbei ist vor allem die Temperaturstabilität maßgeblich, da der genaue Widerstandswert im BQ27221 konfiguriert/kalibriert werden kann.
Die Verlustleistung am Widerstand ist relativ gering:
$$
\begin{align}
P &= R \cdot I^2 \\
&= 0.01\text{Ω} \cdot (3\text{A})^2 \\
&= 0.09\text{W}
\end{align}
$$
Obwohl diese Verlustleistung von 90mW bereits ein 0603-SMD-Widerstand verkraften würde, wird hier ein Widerstand der Bauform 1206 vorgesehen, um eine saubere 4-Leiter-Messung (Kelvin-Verbindung) zu ermöglichen.
Die Konfiguration der Fuel Gauge kann über die TI-Software und einen entsprechenden Adapter erfolgen. Dazu kann der Adapter an einen externen I²C-Anschluss (z.B. OLED- oder Tasten-Controller-Anschluss) angeschlossen werden. Dabei ist sicherzustellen, dass auf dem Mikrocontroller keine Software aktiv ist, die einen I²C-Master implementiert.
Dieser IC bietet nicht die Möglichkeit, die Temperatur über einen NTC zu messen, er kann nur die interne Temperatur messen oder die Temperatur über I²C erhalten. Deshalb wird die Temperatur während des Betriebs und einer gewissen Nachlaufzeit vom Mikrocontroller beim Ladechip abgefragt und dann an die Gauge weitergeleitet. Wenn das System ausgeschaltet ist und der Akku thermisch stabil, dann wird auf die interne Messung umgeschaltet. Die Temperatur der Gauge und des Akkus sollten dann nicht allzu sehr voneinander abweichen.
```mermaid
stateDiagram-v2
[*] --> Betrieb
Betrieb --> Nachlauf: Gerät schaltet aus
Nachlauf --> Tiefschlaf: Akkutemperatur stabil oder 1h abgelaufen
Tiefschlaf --> Betrieb: Gerät schaltet ein
note right of Nachlauf
DC/DC wird von der RTC regelmässig gestartet um die Temperatur zu übermitteln.
end note
note right of Tiefschlaf
DC/DC ausgeschaltet
end note
```
#### CR1220
Eine CR1220-Knopfzelle dient als Backup-Versorgung für die RTC. Die Batterie wird im Normalfall für sehr lange Zeit (>10 Jahre) ausreichen, da die RTC primär vom [Li-Ion-Akku](#li-ion-akku) versorgt wird, solange die Schutzschaltung nicht ausgelöst hat.
### Energiewandlung
#### Lader
Als Ladechip ist der **BQ25672** vorgesehen. Dieser bietet einige Funktionen, die für das Projekt besonders interessant sind:
- Erkennung von zwei externen Spannungsquellen und Auslösung von Interrupts bei deren Anschluss oder Trennung.
- Einstellbarer Ladestrom von bis zu 3A (in 10mA-Schritten über I²C).
- Einstellbare Eingangsstrombegrenzung (über I²C).
- Erkennung von Sonderladegeräten (USB BC1.2 und HVDCP).
- Hohe Effizienz dank Buck-Boost-Architektur.
- Unterstützung der NVDC-Funktion (Narrow Voltage DC).
- "Shipping Mode", um den Stromverbrauch auf ein absolutes Minimum zu reduzieren. Dieser Modus kann nur durch Anschließen einer externen Versorgung beendet werden.
- Integrierte FETs.
Eine direkte Erkennung der über USB-C verfügbaren Stromstärken ist damit jedoch nicht möglich. Das ist aber kein Problem, da die CC-Leitungen des USB-C-Steckers einfach über den ADC des Mikrocontrollers ausgewertet werden können. Der geplante Ablauf in der Firmware ist wie folgt:
```mermaid
flowchart TD
A[START] -->|Anstecken erkannt| B{CC-Leitungen messen}
B -->|größer 1.31V| C[USB-C 3A]
B -->|zwischen 0.71V und 1.16V| D[USB-C 1.5A]
B -->|kleiner 0.61V| E(BQ25672 auslesen)
E --> F{BQ25672 hat USB-Port bestimmt}
F -->|SDP erkannt| G(USB Enumerieren) -->H[Strombegrenzung gem. Enumerierung]
F -->|ansonsten| I(BQ25672 A-Port-Erkennung auslesen) -->J[Strombegrenzung entsprechend setzen]
```
Dazu ist diese Beschaltung nötig:
```mermaid
graph TD;
USBC[USB-C Port];
MCU[Microcontroller];
CHARGER[Lader];
USBC -- D+, D-, VBUS --> CHARGER;
USBC -- D+, D-, CC1, CC2 --> MCU;
MCU <-- I²C --> CHARGER;
```
Der "Shipping Mode" kann dazu genutzt werden, ein Wiedereinschalten des Geräts bei niedrigem Akkustand (z.B. `< 3V`) zuverlässig zu verhindern. Zudem ist ein "Lagermodus" vorgesehen, bei dem das Gerät möglichst wenig Energie aus dem Akku entnehmen soll.
#### 3.3V Buck-Boost-Wandler (DC/DC-Wandler)
Der DC/DC-Wandler ist die Hauptenergieversorgung der Schaltung. Da die Spannung des Li-Ion-Akkus von 3V bis 4.2V variieren kann, ist ein Buck-Boost-Design notwendig. Die Wahl fällt dabei auf den **TPS63020**. Die Argumente dafür sind:
- Sehr hohe Effizienz
- Integrierte FETs
- Hohe Schaltfrequenz, was kleine Induktivitäten ermöglicht
- Enable-Eingang und sehr geringer Energieverbrauch im ausgeschalteten Zustand
Der DC/DC-Wandler wird, wann immer möglich, ausgeschaltet. Weckquellen sind:
- Einschalt-Taster
- RTC
- Lader (wenn eine externe Versorgung angeschlossen wird)
Zusätzlich wird ein GPIO des Mikrocontrollers mit dem ENABLE-Eingang verbunden, damit dieser den DC/DC-Wandler eingeschaltet lassen kann. Dabei müssen die Signale invertiert werden, da sie active-low sind. Die Signale werden über Dioden zusammengefasst und anschließend mit einem N-Kanal-MOSFET invertiert, um Bauteile zu sparen. Somit reichen zwei Doppel-Dioden und ein N-FET, was 3 SOT-323-Gehäusen entspricht.
#### SD Schalter
Die SD-Karte hat auch im Ruhezustand einen relativ hohen Stromverbrauch. Um die Energieeffizienz zu erhöhen, wird die Versorgung des Micro-SD-Slots bei Bedarf über einen P-Kanal-MOSFET durch den Mikrocontroller eingeschaltet.
#### 3.3V LDO
Der 3.3V LDO dient dazu, die RTC und den `VBAT`-Eingang des Mikrocontrollers mit Spannung zu versorgen, wenn der [DC/DC-Wandler](#3-3v-buck-boost-wandler-dc-dc-wandler) ausgeschaltet ist. Die Wahl fällt auf den **XC6206P332MR-G** von Torex, der einen Eigenverbrauch von lediglich 1µA aufweist. Bei einer Akkuspannung unter 3.3V leitet er die Eingangsspannung direkt durch (mit sehr geringem Spannungsabfall). Dies könnte jedoch dazu führen, dass die I²C-Kommunikation mit der RTC problematisch wird. Aus diesem Grund wird ein [Power-MUX](#power-mux) eingesetzt, der die Versorgung vom DC/DC-Wandler priorisiert, wenn diese aktiv ist. Damit ist sichergestellt, dass alle Geräte den gleichen Spannungspegel verwenden, wenn I²C aktiv ist.
#### Power-Mux
Ein **TPS2116** wird als Power-Multiplexer eingesetzt. An den Eingängen werden der DC/DC-Wandler (priorisiert) und der LDO angeschlossen. Am Ausgang stellt er die `VRTC`-Spannung zur Verfügung.
## Dimensionierungen
Im folgenden werden die wesentlichen Dimensionierungen behandelt.
### N-FETs
An mehreren Stellen werden im Hauptstrompfad N-FETs benötigt (Charge- und Discharge-FETs beim Batterieschutz, SHIP-FET beim Lader, Input Selector beim Lader). Ich habe zuerst zum **AO3400A** tendiert, ein Basic-Part bei jlcpcb und mein erster Gedanke, wenn ich Logic-Level-N-FET höre.
Sehen wir uns die Rahmenbedingugen an. Worst Case sind die Batterieschutz-Transistoren, denn sie kriegen die kleinste ```VGS``` ab, wenn der Li-Ion-Akku entladen ist. Die FETs, welche vom Lader angesteuert werden, erhalten ihre Gatespannung von einer Charge Pump, sie ist sicher so immer um die 5V höher als die Source-Spannung. Gehen wir also von einem tiefentladenen Akku aus. Die Spannung wird dann so um die 2.5V liegen (natürlich wird bei dieser Spannung der Lader nicht mit vollem Strom laden, für eine Worst-Case-Betrachtung ist das aber ideal, da Rds für 2.5V im Datenblatt des AO3400A angegeben ist). Rds bei VGS von 2.5V ist laut Datenblatt <48m