Hallo,
ich bin gerade auf ein kurioses Problem mit meinem STM32L151 gestoßen.
Ich habe einen ADC von welchem ich 2 Kanäle mittels DMA auslesen und in
ein Array schreiben lasse. Das ganze ist timergesteuert und wird alle
80µs ausgeführt. Zur Takterzeugung ist ein externer 8 MHz Quarz
verbunden. Nach der ADC Wandlung (für Fall 1) bzw. dem DMA
Schreibvorgang (Fall 2) wird ein Interrupt ausgelöst, in welchem aber
nur die neuen ADC Werte in eine andere Variable aufaddiert wird. Soweit
sogut, alles funktioniert einwandfrei wenn
1) kein DMA und nur ein ADC Kanal verwendet wird, so gut wie alle Takte
(AHB, APB, SYSCLK etc) laufen mit 8 MHz
2) DMA zum auslesen beider ADC Kanäle verwendet wird, SYSCLK muss
allerdings mindestens 12 MHz betragen.
Ich hätte nun aber gerne 2. allerdings nur mit 8 MHz um den
Stromverbrauch zu drücken. Stell ich das aber (mittels der Excel Tabelle
von ST) um, wird der DMA Interrupt einfach nicht mehr ausgeführt!
Ich frage mich nur, warum das so ist? Im RM konnte ich nichts dazu
finden und auch so ist es mir etwas unerklärlich...
Im Angang ein Minimalbeispiel das ich zum testen verwende. Wenn
gewünscht kann ich die system_stm32l1xx.c, in welcher die Taktraten
eingestellt werden, auch nachreichen
Chris schrieb:> Ich hätte nun aber gerne 2. allerdings nur mit 8 MHz um den> Stromverbrauch zu drücken. Stell ich das aber (mittels der Excel Tabelle> von ST) um, wird der DMA Interrupt einfach nicht mehr ausgeführt!
Schon wieder so ein Unfug.
Schick den Controller in den Sleep-Modus, wenn du ihn nicht brauchst und
lass ihn vom DMA-Interrupt aufwecken. Wenn der durch ist, geht es wieder
in den Sleep. Dann kannst du ihn auch mit 72MHz betreiben und
verbrauchst immernoch weniger Strom.
Niedrig takten spart keinen Strom. Intelligentes Programmdesign spart
Strom!
Jonas Biensack schrieb:>>Niedrig takten spart keinen Strom.>> Oh doch. Siehe Intel, Amd, Nvidia, Arm etc. die es alle so machen.
Schon mal einen µC gesehen, der bei niedrigem Takt seine
Versorgungsspannung reduziert?
Jonas Biensack schrieb:>>Niedrig takten spart keinen Strom.>> Oh doch. Siehe Intel, Amd, Nvidia, Arm etc. die es alle so machen.>> Gruß Jonas
Äpfel... Birnen... Und der Preis für den dümmsten Vergleich geht an...
>Schon mal einen µC gesehen, der bei niedrigem Takt seine>Versorgungsspannung reduziert?
:)
Ich dachte die Umschaltverluste reduzieren sich bei niedrigerem Takt und
damit wird weniger Strom verbraucht? Lieg ich falsch?
Gruß Jonas
Frank Bär schrieb:> Schick den Controller in den Sleep-Modus, wenn du ihn nicht brauchst und> lass ihn vom DMA-Interrupt aufwecken.
Mal unabhängig davon dass es mir bei der Fragestellung leider nicht
weiterhilft: Das ist für später geplant, aber da werde ich erst mal
prüfen müssen ob es geht bzw wie aufwändig es ist. Nebenbei läuft
nämlich noch ein DAC-Output (neue Ausgabe alle 40 µs), USART und diverse
Berechnungen in der Main.
Das der Stromverbrauch (auch wenn er nicht verbraucht wird ;-P ) runter
geht konnte ich übrigens schon nachmessen, damit ist das Thema vom Tisch
Im Übrigen: Richtig sparsam würde es hier, wenn ein externer Timer die
80µs-Intervalle erzeugen würde. Dann könnte man nämlich den Stop-Mode
des Controllers nutzen.
Meiner Erfahrung nach ist Runtertakten nur dann überhaupt eine Option,
wenn man sich durch schlechtes Design von vornherein die wirklich
effektiven Stromsparoptionen verbaut hat.
Chris schrieb:> Das der Stromverbrauch (auch wenn er nicht verbraucht wird ;-P ) runter> geht konnte ich übrigens schon nachmessen, damit ist das Thema vom Tisch
Das hat auch niemand bezweifelt. Aber wenn du dir die Tabellen im
Datenblatt ansiehst, dann stellst du fest, dass Stromverbrauch und
Taktfrequenz nicht linear zueinander sind. Eine Absenkung des Taktes von
16MHz auf 8MHz reduziert den Verbrauch um 40%, erhöht aber die benötigte
Rechenzeit um 50%.
Effektiv erhöht sich also der mittlere Stromverbrauch um ca. 20%, wenn
du runtertaktest, weil du weniger Zeit im Sleep-Modus verbringst.
Und noch dazu: Wenn du mit 40µs Zykluszeit arbeiten willst, hast du bei
8MHz 32 Takte zur Ausgabe auf dem DAC. Da bleibt kaum Rechenzeit für
UART und Berechnungen über.
@Jonas du solltest mal nachlesen, was ein Mikrocontroller ist. Mit solch
akademischen Diskussionen spart man keinen Strom sondern verschwendet in
dem Fall nur Zeit. Schau dir die Datenblätter der ICs an und hör auf, so
einen Unsinn zu verbreiten.
Jonas Biensack schrieb:> Ich dachte die Umschaltverluste reduzieren sich bei niedrigerem Takt und> damit wird weniger Strom verbraucht? Lieg ich falsch?
Der Strom (auf die Zeit bezogen) reduziert sich natürlich bei
niedrigerem Takt, aber linear zur Taktrate natürlich auch die
verrichtete Rechenarbeit.
Wenn du jetzt niedriger taktest, brauchst du länger bis du mit irgendwas
fertig bist und hast mit (niedrigerer Strom)*(längere Zeit) genauso viel
Energie verbraucht. (*) bzw. sogar mehr, weil I nicht lienar sinkt - wie
Frank oben sagte.
Mit niedrigerem Takt kannst du sparen, wenn du im Leerlauf sinnlose
Endlosschleifen drehst.
Klaus Wachtler schrieb:> Der Strom (auf die Zeit bezogen) reduziert sich natürlich bei> niedrigerem Takt, aber linear zur Taktrate natürlich auch die> verrichtete Rechenarbeit.
Auch wahr, das hatte ich nicht bedacht. Nun gut, dann lass ich den µC
erst mal auf 12 oder 16 MHz laufen und werde den Sleepmode früher in
Angriff nehmen als geplant ;)
Trotzdem würde mich interessieren warum der DMA bei 8 MHz nicht mehr
mitspielt...
Davis schrieb:> @ Frank Bär>>> Meiner Erfahrung nach ....>> Hier sind Fakten gefragt, nicht Erfahrungen und Meinungen.>> Also: vorrechnen & belegen.
100 beispielhafte Befehle brauchen 200 beispielhafte Takte. bei 8MHz
dauert das 25µs. lt. Datenblatt: 25µs*12.5mA = 312.5nAs
bei 72MHz dauert das ganze dann 2.8µs, macht 189nAs. Dazu kann ich noch
22,2µs in Stop-Modus verbringen. Im WorstCase (TA = 105°C) nochmal
37,3nAs. Macht in Summe unter 230nAs für die selbe Berechnung. Das ist
nicht 100% exakt, aber als Abschätzung erst einmal genug.
Jonas Biensack schrieb:> Ich dachte die Umschaltverluste reduzieren sich bei niedrigerem Takt und> damit wird weniger Strom verbraucht? Lieg ich falsch?
Beim gleichen Prozessor und gleicher Versorgung ist der Energieverbrauch
pro Arbeitsschritt des Mikrocontrollers in grober Näherung konstant,
weil sich an der Anzahl Schaltvorgänge nichts ändert. Wenn die Anzahl
Arbeitsschritte für eine gegebene Aufgabe feststeht - also keine
zeitgebundenen Warteschleifen dabei sind - dann ist also der
Energieverbrauch der Aufgabe näherungsweise konstant (Energie = Leistung
x Zeit).
Diese Rechnung gilt allerdings nicht für verschiedene Prozessoren, bei
verschiedenen design rules in der Herstellung, bei taktabhängiger
Energieversorgung, oder wenn die Leckströme einen erheblichen Anteil am
Stromverbrauch haben. Analoge Komponenten wie ADCs oder evtl. auch
bestimmte Arten der Taktversorgung spielen ebenfalls eine gesonderte
Rolle.
Wenn man die Versorgungsspannung reduziert, dann reduziert sich der
Energieverbrauch pro Arbeitsschritt (ebenso der Leckstrom), aber auch
die maximal erreichbare Schrittfrequenz. Die Aufgabe benötigt dann
länger, aber der Gesamtenergieverbrauch sinkt.
Komplizierter wird es bei komplexen Prozessoren mit selektiver
Totalabschaltung diverser Komponenten, da dadurch zwar der Leckstrom
ausgeschaltet wird, aber dafür die Anlaufzeit frisch eingeschalteter
Komponenten neu ins Spiel kommt.
Zumindest auf die Schnelle habe ich im Datenblatt nichts dazu gefunden.
Ich meine aber, dass der ADC beim STM32 nur in einem bestimmten
Frequenzfenster funktioniert. Kann es sein, dass dein AHB-Prescaler zu
groß ist?
Frank Bär schrieb:> Ich meine aber, dass der ADC beim STM32 nur in einem bestimmten> Frequenzfenster funktioniert. Kann es sein, dass dein AHB-Prescaler zu> groß ist?
ADC, DMA oder beides in Kombination? ADC einzeln funktioniert ohne
Probleme mit nur 8 MHz. Der AHB Prescaller steht eh nur auf 1, egal ob
in der jetzigen Konfiguration mit 12 MHz SYSCLK oder zuvor mit 8 MHz