Forum: Mikrocontroller und Digitale Elektronik STM32 Sleepmode 24h, LSI und HSI zu ungenau


von Markus M. (adrock)


Lesenswert?

Hi,

für ein kleines Weihnachts LED-Gimmick wollte ich eigentlich einen 
"Timer-Modus" einbauen, wie ihn alle üblichen LED-Lichterketten haben. 
Also wenn der "Timer-Modus" per Pushbutton aktiviert wird, soll das 
LED-Dingens noch für 10h laufen und dann bis zur gleichen Uhrzeit am 
nächsten Tag in den Sleepmode gehen.

Plattform ist ein STM32G030. Leider konnte ich sowohl mit dem LSI als 
auch mit dem HSI16 bzw. den abgeleiteten Takten keine brauchbare 
Genauigkeit erhalten, um die Funktion halbwegs zufriedenstellend zu 
implementieren.

Der LSI ist dafür absolut unbrauchbar, ich habe dort schon bei 10 
Minuten einige Sekunden Abweichung. Das sind in 24h dann >15 Minuten.

Auch der HSI ist leider nicht viel besser. Im Datenblatt ist auch nur 1% 
Genauigkeit angegeben, was auch ~15 Minuten / 24h entspricht.

Auch eine Messung der LSI-Frequenz mit Hilfe des HSI ergab kein besseres 
Ergebnis, in diesem Fall addieren sich ja dann sogar noch die 
Toleranzen.

Wie machen das denn diese ganzen Lichterketten? Verwenden die 
tatsächlich Quarze?

Ohne eine externe Referenz kann man ja sonst keine bessere Genauigkeit 
bekomen.

Gruß
Markus

: Bearbeitet durch User
von Bastelmensch (Gast)


Lesenswert?

Markus M. schrieb:
> Verwenden die tatsächlich Quarze?

Warum nicht? In China kosten Uhrenquarze in größeren Stückzahlen nur ca. 
2 Cent.

von Paul (Gast)


Lesenswert?

Nimm einen 32K Quarz an LSE und werde glücklich.
Alternativ ne Batteriegepufferte RTC.

VG Paul

von Nop (Gast)


Lesenswert?

Für eine uhrenähnliche Präzision braucht man einen Uhrenquarz. Deswegen 
findet man Uhrenquarze in Uhren. No shit, Sherlock!

von pegel (Gast)


Lesenswert?

Markus M. schrieb:
> kleines Weihnachts LED-Gimmick

Wenn die Temperatur recht konstant sein sollte, wie wäre HSI mit 
Kalibrierung?

von Markus M. (adrock)


Lesenswert?

Ein kleiner Quarz fällt leider flach, da der STM32G030J6 im 8-Pin 
Gehäuse kein OSC-Out hat, also ginge nur ein Quarzoszillator (LSE).

Ist wohl kein wirklich gängiges Bauteil.

Bliebe noch ein kleiner Oszillator am HSE-Eingang.

Eine externe Referenz zum Kalibrieren des HSI habe ich leider nicht, ich 
habe mir den HSI Takt mal auf einen Pin ausgeben lassen, es waren lt. 
Messung mit dem DSO 16.00 .. 16.01 MHz, also eigentlich nichtmal 1% 
Abweichung - ist natürlich die Frage wie genau das DSO (Siglent 
SDS1104E) misst.

Ich hatte das alles schon auch mit RTC und Deepsleep / Standby Mode am 
laufen, aber wie gesagt, der LSI ist absolut unbrauchbar dafür von der 
Genauigkeit.

Habe es nun sehr simpel implementiert:

Der Timer läuft mit dem Systemtakt (24MHz PLL aus dem HSI generiert), 
das läuft durch einen Prescaler von 24000 (=23999), also 1000 Pulse pro 
Sekunde, dann setze ich den Timer-Reload auf 999, somit habe ich einen 
Timer-Interrupt pro Sekunde.

In einer ISR checke ich dann einen Sekunden-Zähler und wenn dieser 86400 
erreicht hat (einen Tag) wird ein Alarm-Flag gesetzt, welches 
letztendlich im Hauptprogramm abgefragt und zurückgesetzt wird.

Naja, für dieses Projekt ist der Drops wohl gelutscht, aber wird mir 
eine Lehre sein in Zukunft zumindest den Platz für einen Oszillator auf 
dem Board vorzusehen.

von Johannes S. (Gast)


Lesenswert?

Markus M. schrieb:
> für ein kleines Weihnachts LED-Gimmick wollte ich eigentlich einen
> "Timer-Modus" einbauen,

ist eine zentrale Steuerung über ein RFM Funkmodul eine Option? Das 
bräuchte eine SPI Schnittstelle zur Ansteuerung. Dann kann man zentral 
Schalten und auch Sonnenstandabhängig.

von pegel (Gast)


Lesenswert?

Oder vielleicht einen Käfer mit 6 Beinen mehr nehmen?
L011 oder L021 sind nicht viel größer, passt aber ein Quarz dran.

von Stefan F. (Gast)


Lesenswert?

Markus M. schrieb:
> Wie machen das denn diese ganzen Lichterketten? Verwenden die
> tatsächlich Quarze?

Ich kenne LED-Kerzen von QVC, deren Timer nutzt auch nur einen R/C 
Oszillator mit der entsprechenden Ungenauigkeit.

von PICklig (Gast)


Lesenswert?

Ja der allgemeine 32 bit Wahn.
Ein 8 pinniger PIC haette problemlos noch einen Uhrenquarz verkraftet.

von A. B. (Gast)


Lesenswert?

Auch, wenn's etwas unbequem ist: Ein 74LVC1GU04 mit ein paar 
Widerständen und zwei Kondensatoren zum Uhrenquarz tun's auch. 
Jedenfalls sind das billige Standard-Bauteile, während ein fertiger 
Quarz-Oszillator ...

von Markus M. (adrock)


Lesenswert?

PICklig schrieb:
> Ja der allgemeine 32 bit Wahn.
> Ein 8 pinniger PIC haette problemlos noch einen Uhrenquarz verkraftet.

Wobei das eine nun wirklich so garnicht vom anderen abhängt. Ist halt 
offenbar eine Design-Entscheidung gewesen, bei der 8-Pin Variante auf 
den OSC-Out zu verzichten und dafür lieber ein paar andere Funktionen 
auf den Pin zu legen.

Die größeren Modelle der STM32G030 Serie haben einen OSC-Out.

Die 8-Pin Version ist schon etwas hakelig. 5 Pins fallen eigentlich 
schon weg, zumindest wenn man auch noch Debuggen will/muss:

Vcc, GND, SWDCLK, SWDIO und NRST

Wenn ich jetzt noch einen Quarz anschließen würde hätte ich nur noch 1 
Pin frei, brauche aber mindestens 2.

Würde ich es nochmal designen, würde ich so einen winzigen 
Quarzoszillator mit drauf packen, z.B. sowas hier:

https://www.tme.eu/de/details/osc32.768k-3.3i_s2/quarzgeneratoren-smd/yic/osc32-768k-3-3i-s22/

ca. 2.5mm x 2mm Platz würden sich noch finden...

von Bauform B. (bauformb)


Lesenswert?

Markus M. schrieb:
> Der Timer läuft mit dem Systemtakt (24MHz PLL aus dem HSI generiert),
> das läuft durch einen Prescaler von 24000 (=23999), also 1000 Pulse pro
> Sekunde, dann setze ich den Timer-Reload auf 999, somit habe ich einen
> Timer-Interrupt pro Sekunde.

Mach es noch simpler: Lass die PLL weg, die kostet nur Strom. Nimm als 
Timer den SYSTICK, der hat 24 Bit, damit kommst du von 16MHz direkt auf 
1 Sekunde und kannst auf 1/16000000 trimmen. Dann bleibt nur noch der 
Fehler durch Temperaturschwankungen.

von pegel (Gast)


Lesenswert?


von Bauform B. (bauformb)


Lesenswert?

pegel schrieb:
> Die Kalibrierung von LSI/HSI ist schon eine umfangreiche Aufgabe:

Deshalb schreibe ich den passenden Wert ins SYSTICK->RELOAD Register und 
trimme nicht den HSI. Der ist ab Werk schon vernünftig eingestellt.

von pegel (Gast)


Lesenswert?

Mit Kalibrierung meinte ich auch eher die Korrektur des Temperatur- und 
Spannungsabhängigen Fehlers.

von Markus M. (adrock)


Lesenswert?

Bauform B. schrieb:
> Markus M. schrieb:
>> Der Timer läuft mit dem Systemtakt (24MHz PLL aus dem HSI generiert),
>
> Mach es noch simpler: Lass die PLL weg, die kostet nur Strom. Nimm als

Ich benötige 24MHz da ich einen 3MHz SPI-Takt benötige um per SPI ein 
gutes Signal für die WS2812 LEDs zu generieren (nein, ich werde das 
jetzt nicht auf Timer-Output-Compare oder Bitbanging umbauen).

Zudem benutze ich den den Systick bereits um IRQs im ms Bereich 
auszulösen.

Aber der Fehler ist ja der gleiche, ob ich nun den Systick direkt nutze 
oder auf einen anderen Timer (TIM16 in diesem Fall) geben. Trimmen kann 
ich mit dem TIM16 auch, indem ich den Reload-Wert nicht auf 999 sondern 
z.B. auf 998 oder 1000 setze.

> Timer den SYSTICK, der hat 24 Bit, damit kommst du von 16MHz direkt auf
> 1 Sekunde und kannst auf 1/16000000 trimmen. Dann bleibt nur noch der
> Fehler durch Temperaturschwankungen.

Die Frage ist, gegen welche Referenz trimme ich das? Ich würde ja einen 
externen (stabilen) 16MHz (Quarz)Takt benötigen, oder?

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Markus M. schrieb:
> Aber der Fehler ist ja der gleiche, ob ich nun den Systick direkt nutze
> oder auf einen anderen Timer (TIM16 in diesem Fall) geben. Trimmen kann
> ich mit dem TIM16 auch, indem ich den Reload-Wert nicht auf 999 sondern
> z.B. auf 998 oder 1000 setze.

Der Fehler des HSI ist noch der gleiche. Der Unterschied ist, wie fein 
du den Fehler ausgleichen kannst. Mit dem TIM16 ist die kleinste Stufe 
1/1000, ±86.4 Sekunden/Tag. Mit den 24 Bit vom SYSTICK ist ±1 eben 
1/16000000 oder 0.005 Sekunden/Tag. Wenn du wenigstens die vollen 16 Bit 
des TIM16 nutzen würdest, wärst du auch schon 65 mal besser dran.

Das geht mit 24MHz und PLL natürlich ganz genauso wie mit HSI alleine. 
Ich fand nur "ganz simpel" und PLL etwas widersprüchlich.

> Die Frage ist, gegen welche Referenz trimme ich das? Ich würde ja einen
> externen (stabilen) 16MHz (Quarz)Takt benötigen, oder?

Früher hätte man das Zeitzeichen vor den Nachrichten im Radio benutzt. 
Will sagen, ich lasse das Teil einen Tag lang laufen und messe zu Fuß 
die Abweichung zu einer Funkuhr. 24 Stunden deshalb, weil damit der 
Temperaturunterschied zwischen Tag und Nacht raus gemittelt wird.

Das geht auch benutzerfreundlich: man startet das Teil zu einer 
bestimmten Uhrzeit und am nächsten Tag zur gleichen Sekunde drückt man 
den "Kalibrier-Taster". Das Programm rechnet den Korrekturfaktor aus und 
schreibt ihn ins Flash.

von pegel (Gast)


Lesenswert?

https://de.rs-online.com/web/p/quarz-oszillatoren/9047601/

Der Kleine passt noch Huckpack auf einen SO8. ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus M. schrieb:
> Verwenden die tatsächlich Quarze?
Kosten ja nur 1,x Cent in den relevanten Mengen. Dafür läuft das Zeug 
wie es soll.

pegel schrieb:
> Die Kalibrierung von LSI/HSI ist schon eine umfangreiche Aufgabe:
pegel schrieb:
> https://de.rs-online.com/web/p/quarz-oszillatoren/9047601/
Ich tu mir für private Projekte das Herumgehampel mit internen 
RC-Oszillatoren gar nicht mehr an, seit es Quarzoszillatoren für nen 
halben € gibt. Und im Geschäft rechne ich ganz genau aus, was die 
Kalibriererei an Aufwand bedeutet und setze dann auch einen 
Quarzoszillator ein. Denn wenn das Gelecke mit dem Abgleich mehr als 20 
Sekunden kostet, dann ist der Oszillator bezahlt. Und wenn es dann noch 
eine Reklamation wegen des davonlaufenden RC-Oszillators gibt, dann kan 
ich viele Oszillatoren defür einbauen.

Bauform B. schrieb:
> am nächsten Tag zur gleichen Sekunde drückt man den "Kalibrier-Taster".
Und dann stellt man am Thermostat noch eine konstante Temperatur ein. 
Und von wegen Nachtabsenkung!

von Bauform B. (bauformb)


Lesenswert?

Lothar M. schrieb:
> Und im Geschäft rechne ich ganz genau aus, was die Kalibriererei
> an Aufwand bedeutet und setze dann auch einen Quarzoszillator ein.
> Bauform B. schrieb:
>> am nächsten Tag zur gleichen Sekunde drückt man den "Kalibrier-Taster".
> Und dann stellt man am Thermostat noch eine konstante Temperatur ein.
> Und von wegen Nachtabsenkung!

Musst du das kleingedruckte im Pflichtenheft lesen: dieser G030 muss ja 
nur im Mittel über 24 Stunden genau ticken :)

von Kevin M. (arduinolover)


Lesenswert?

Markus M. schrieb:
> nein, ich werde das
> jetzt nicht auf Timer-Output-Compare oder Bitbanging umbauen

Solltest du aber Timer + DMA ist ja wohl die ultimative Lösung :D

Mal ganz ehrlich ist es so schwer was auch immer du als Zeitbasis nutzt 
1 Stunden oder besser einen Tag laufen zu lassen zu schauen wie die 
Abweichung ist und deinen Timer einfach entsprechend länger oder kürzer 
zählen zu lassen?

von Markus M. (adrock)


Lesenswert?

Kevin M. schrieb:
> Markus M. schrieb:
>> nein, ich werde das
>> jetzt nicht auf Timer-Output-Compare oder Bitbanging umbauen
>
> Solltest du aber Timer + DMA ist ja wohl die ultimative Lösung :D

Nein, ich mache DMA + SPI, da man nicht soviel Zwischenspeicher 
benötigt. Ich benötige genau das 3-fache der Datenmenge. Bei der 
Timervariante wäre es dass 8-fache (für jedes Bit muss man ein Byte 
vorbereiten für den OC).

Nachteil ist natürlich das der SPI-Takt stimmen muss, so dass man ein 
günstiges Teilerverhältnis für die WS2812-Bits erhält.

Die optimale Lösung ist DMA mit double-buffering und den Buffer für die 
nächsten X LEDs im ISR vorbereiten. Lohnt sich bei 47 LEDs allerdings 
nicht wirklich :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.