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!
>Niedrig takten spart keinen Strom.
Oh doch. Siehe Intel, Amd, Nvidia, Arm etc. die es alle so machen.
Gruß Jonas
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.
@ Frank Bär
> Meiner Erfahrung nach ....
Hier sind Fakten gefragt, nicht Erfahrungen und Meinungen.
Also: vorrechnen & belegen.
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.
Danke für die guten Beiträge, das ist auf jeden Fall noch ein Bereich den ich angehen muss. Zur eigentlichem DMA Frage hat wirklich keiner eine Idee?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.