beelogger

beelogger-STM32 – Intern

Der beelogger-STM32 basiert auf einem STM32F103/F4x1 Microcontroller.
Das System bietet die bekannte beelogger-Funktionalität.
Durch die STM32F4x1 µC steht der für die Möglichkeiten der beelogger-Sketche notwendige Programmspeicher zur Verfügung.

Hier einige Informationen und Hintergründe zum Aufbau des beelogger mit STM32-Microcontroller.

Allgemeines:

Viele der STM32F Microcontroller haben im Gegensatz zu den ATmega Microcontrollern eine Echtzeituhr integriert und erlauben trotz 3,3V Betriebsspannung an vielen Pins die Verwendung von Bauteilen mit 5V Signalpegel.
Diese Optionen haben ihre Grenzen und Tücken.
Zum einen ist der Platinenaufbau des Moduls und die Bauelementeauswahl an die teilweise sehr striken Vorgaben des Herstellers gebunden.
Zum Thema Taktgenerator für die Echtzeituhr finden sich Vorgaben in der Application note AN2867 von ST: “Oszilator design guide for STM … MCUS”
Hinsichtlich der 5V-Kompatibilität diverser STM32 Microcontroller steht eine weitere Application note AN4899 “STM32 microcontroller GPIO configuration for hardware settings and low-power consumption” zur Verfügung.
Bei der Nutzung der A-D-Wandler gilt es die Application note AN2834 “How to get the best ADC accuracy in STM32 microcontrollers” zu berücksichtigen.

RTC / Echtzeituhr:

Integriert in die STM32 Microcontrollern ist eine Echtzeituhr, die über einen externen 32kHz Quartz getaktet wird.
Zusätzlich hat die RTC einige Backup-Register, die auch nach einem Reset erhalten bleiben.
Jedoch hat die RTC und das Backup-Ram ein paar Besonderheiten.
Das Register “0” im Backup-Ram kann nicht genutzt werden. Die Bibliothek gibt 32bit-Variablen für die Registerinalte vor, die Register speichern aber nur 16bit-Werte.
Die Echtzeituhr verwaltet Tag, Monat, Jahr, Stunde, Minute, Sekunde. Die Werte von Tag, Monat und Jahr werden jedoch nicht in allen Betriebszuständen automatisch weitergezählt.

Low-Power:

Die STM32Fxyz Microcontroller verfügen über mehrere Stromsparmodi.
Für einige Verwirrung sorgt hier die Verwendung der Begriffe Sleep, Stop und Standby. Bei den ATmega Microcontrollern werden diese Begriffe auch verwendet, haben aber eine andere Bedeutung im Stromsparverhalten.
Des Weiteren werden in der STM32-Low-Power Bibliothek wiederum andere Begriffe verwendet: Idle, Sleep, DeepSleep, Shutdown.

Die geringste Stromaufnahme haben die STM32 im Standby bzw. Shutdown. Allerdings ist der WakeUp aus diesem Zustand nahezu identisch zu einem Reset. Bei entsprechender Konfiguration des Microcontrollers bleiben die Uhrzeit und die Inhalte der Backup-Speicher erhalten.

Ein Sketch der diese Eigenschaften nutzt, beginnt trotz Betätigen des Reset-Tasters nicht so wie er beim Einschalten der Stromversorgung startet. Dieses Verhalten ist ungewohnt. 
Aber der Microcontroller ist in der Lage einen Reset von  einem Power-On zu unterscheiden. Dies kann via Programm abgefragt werden.
Schöner Nebeneffekt dieses Verhaltens ist, dass nahezu immer neue Sketchversionen aufgespielt werden können, ohne dass Daten aus Messungen oder der Sketchsteuerung verloren gehen.

Akkuschutz:

Der Programmcode der Multi-Sketche enthält zwei Funktionen, die speziell für den Akku- bzw. Solarbetrieb entwickelt wurden:

  1. Um den Akku zu schonen und ihm somit eine lange Lebensdauer zu ermöglichen, kann über die Variable ‘VMinimum’ die Spannung eingestellt werden, bei deren Unterschreitung keine Messung und auch kein Versand von Daten erfolgt. ‘VMinimum’ dient insbesonders beim beelogger-SMD dazu den korrekten Betrieb des SIM800L-Moduls sicherzustellen, welches eine minimale Spannung  (3,8V) benötigt.
  2. Damit der beelogger auch während einer längeren Zeitspanne ohne Aufladung (beispielsweise im Winter mit zugeschneiten Solarzellen) Sensordaten ermittelt und versendet werden, kann über die Variable ‘VAlternativ’ die Spannung eingestellt werden, bei deren Unterschreiten der Mess- und Sendezyklus verlängert wird. Die Länge dieses Zyklus wird über ‘AlternativIntervallMinuten’ eingestellt. Vorgabe ist 120 Minuten.

Diese Funktionen ersetzen keine im Akku integrierte Schutzschaltung vor Tiefenentladung

Beispiel:

  beelogger-SMD
Li-Ion-Akku
beelogger-Universal
6V Blei-Akku
2x LiIon-Akku 12V Blei-Akku
VMinimum = 3.75 V 5.7 V 7.5 V 11.5
VAlternativ = 3.8 V 5.9 V 7.6 V 11.9

WeckIntervallMinuten = 15
AlternativIntervallMinuten = 120

Bei einer Spannung die höher ist als VAlternativ, werden die Messwerte wie in den Intervallen (im Sketch oder bei aktiver Fernsteuerung über den Webserver) konfiguriert abgefragt und versendet. Ab einer Spannung von VAlternativ und geringer, werden Messungen und Versand der Daten nur noch alle 2 Stunden (120min) durchgeführt. Dieser Wert ist nicht über den Server konfigurierbar.
Bei einer Spannung die kleiner oder gleich VMinimum ist, werden weder Messungen vorgenommen, noch Daten versendet. Sobald der Akku durch die Solarzelle aufgeladen ist und die Akkuspannung die eingestellten Werte erreicht bzw. überschreitet, nimmt der beelogger seinen Betrieb wieder auf.

A-D-Wandler:

Der STM32 verwendet einen SAR-A-D-Wandler (successive approximation register). Auf Grund des Aufbaus der A-D-Wandlers im STM32 und der Notwendigkeit hochohmiger Spannungsteiler für die Batteriespannungsmessung sind in der Schaltung Kondensatoren am Spannungsteiler eingebaut worden. Damit kann der Spannungsteiler (470k/1M) mit seinem geringen Strom beibehalten und ein geringer Ruhestrom der Schaltung erreicht werden. Die Kondensatoren halten die Spannung im Messkreis während der Messung, die den Messkreis deutlich belastet, so stabil das zuverlässige Messungen erfolgen können.

32bit vs. 8bit:

Der STM32F103C8 ist ein 32bit-Microcontroller mit 64kB Programmspeicher. Die Microcontroller ATmega328 haben 32kB Programmspeicher und einen 8bit Microcontroller. Obwohl der STM32 einen doppelt so großen Programmspeicher hat, steht für die fertigen Sketche nicht wesentlich mehr Programmspeicher zur Verfügung, weil durch die 32bit Technologie der Progammcode von sich aus größer ist.
Ein typischer beelogger-Messystem-Sketch benötigt auf einem ATmega ca. 20kB, bei einem STM32 fast 60kB.
Deutlich mehr Programmspeicher steht erst mit dem STM32F103CB zur Verfügung. Er verfügt über 128kB.
Jedoch sind die STM32F103C8 oft ebenfalls mit 128kB Programmspeicher ausgestattet. Möglicherweise werden die Microcontroller wegen Stabilitätsaspekten nur mit 64kB gekennzeichnet.
Empfohlen wird daher der Aufbau des beelogger-STM32 mit einem “BlackPill” Modul mit STM32F4x1 Controller.

 

Arbeitsschalter Blinkcode LED an D13:

  • 1x lang:  Einschalten des Arbeitsschalter erkannt
    • löst Messvorgang aus
    • nur mit aktivierter Sketchoption: Signalpegel messen und senden mit Arbeitsschalter forcieren 
      Wenn der Arbeitsschalter weitere 3 Sekunden aktiv ist:
      3x kurz:  Signalpegel messen und Sendevorgang wird ausgelöst, “Messwert” Service enthält Empfangspegel LTE/GSM/WLAN

      Wenn der Arbeitsschalter weitere 3 Sekunden aktiv ist:

    • 4x kurz:  Sendevorgang wird ausgelöst, “Messwert” Service wird auf “99” gesetzt.
       
  • 2x kurz:   System geht in Schlafzustand (wird nur bei aktiver Debugeinstellung angezeigt)
        Nur in diesem Zustand wird ein Einschalten des Arbeitsschalter erkannt.
     
  • Wenn Arbeitsschalter dauerhaft eingeschaltet ist, wird im voreingestellten Zyklus “USER_INT_TM” gemessen und gesendet.
  • Wird der Arbeitsschalter, ausgeschaltet, wird nach ca. 5 Minuten der normale Mess-/Sendezyklus aktiviert.

Hinweis: Wird ein dauerhaft aktivierter Arbeitsschalter erkannt, erfolgt eine Ausgabezeile “user!“.

Beim beelogger-STM32 wird die LED auf der Platine an PIN PC13 geschaltet. Der Strom einer externen LED darf 1mA(!) nicht überschreiten.
Eine externe LED muss über eine Zusatzschaltung angesteuert werden,  damit der Ausgang des STM32-µC nicht überlastet wird.

 

beelogger-Sketch:

Der beelogger-Sketch betreibt den STM32F… im Stromsparmodus Standby (Shutdown). Das Aufwachen erfolgt zum einen über den Arbeitsschalter und zum anderen über einen Alarm/Interrupt von der RTC.

Beim Aufwachen fragt der Sketch den Startzustand auf Power-On oder Reset ab und reagiert entsprechend.
Im Power-On wird ein Daten-Senden Vorgang ausgelöst und mit der Quittung, die die aktuelle Zeit enthält, die RTC gesetzt.
Das Setzen der RTC erfolgt mit jedem erfolgreichen Daten-Senden Vorgang, so dass Abweichungen in der Ganggenauigkeit der RTC relativ unkritisch sind.

Ein wesentlicher Nachteil des Standby-Mode ist, dass die RTC die Werte von Tag, Monat und Jahr um Mitternacht nicht weiterzählt.
Um dies zum umgehen wird die Zeit des nächsten regulären Weckzyklus mit “Mitternacht” verglichen. Liegt die Weckzeit nach Mitternacht wird die Weckzeit auf kurz vor Mitternacht gelegt und der Übergang zum nächsten Tag abgewartet. In diesem Betriebszustand berechnet die RTC im STM32 die Werte von Tag, Monat, Jahr automatisch korrekt weiter.
Diese  Vorgehensweise zwingt die Systeme, ungeachtet eines eingestellten Messzyklus, jeweils um Mitternacht mit einem Messzyklus zu beginnen.

Diverse Werte der Sketchsteuerung werden im Backup-Ram der RTC abgelegt. Hierzu zählt u.a.:
– die Anzahl der durchgeführten Messungen
– die Einschaltzeitdauer
– Steuerung der Sendezeit
– Sendeintervall
– Weckintervallzeit 

Für die Sketche wird der Arduino_Core_STM32 von ST in der Arduino-IDE verwendet.
STM32-spezifische Bibliotheken sind STM32LowPower, STM32RTC, Backup und die stm32_ll.adc für die Schlaf-/Zeitsteuerung, RTC-Backup-Ram sowie die Analog-Digital-Messung von Spannungen.
Für die Ansteuerung der diversen Senoren konnte in vielen Fällen Standardbibliotheken für den Arduino verwendet werden.
Informationen zu den Bibliotheken unter Stm32duino wiki Libraries
Die Bibliotheken, die für das beelogger-Projekt für die ATmega Microcontroller extra entwicklet wurden, mussten für die Verwendung mit den STM32 überarbeitet und als zusätzliche Bibliotheken (u.a. EE-Prom, ESP8266, SIM800L, SIM7600E) bereit gestellt werden.