Forum: Mikrocontroller und Digitale Elektronik ARM STM32, nach Wakup von Sleep jeweils ADC calibration notwendig


von Lukas S. (lsimma)


Lesenswert?

Hallo,

um die Stromaufnahme im sleep mode zu reduzieren soll der ADC und der 
DMA gestoppt werden bevor der stm32 in den sleep mode versetzt wird.

Nach Wakeup aus dem sleep mode, wie sieht die korrekte startsequenz für 
den ADC aus ?

Ist nach dem Wakeup die ADC calibration neu durchzuführen ?

Code um den ADC und DMA zu stoppen vor dem sleepmode
1
      // Prepare for Sleep: Stop ADC and DMA Peripherie (and there Clocks)
2
      ADC_Cmd(ADC1, DISABLE);
3
      DMA_Cmd(DMA1_Channel1, DISABLE);
4
      ADC_SoftwareStartConvCmd(ADC1, DISABLE);
5
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
6
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);  
7
     ....
8
     ....
9
     // Request Sleep Mode
10
        __WFI();

Code um den ADC und DMA zu starten nach dem Wakeup
1
    // Enable ADC, DMA and Start a Conversion Sequence
2
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
3
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
4
    DMA_SetCurrDataCounter(DMA1_Channel1,    ADC_CONVERTED_VALUE_TAB_LENGTH);
5
    DMA_Cmd(DMA1_Channel1, ENABLE);
6
    ADC_Cmd(ADC1, ENABLE);
7
    // ??? ist hier noch die Kalibrierung notwendig ???
8
    ADC_SoftwareStartConvCmd(ADC1, ENABLE)

Danke,
Lukas

von Lutz (Gast)


Lesenswert?

Das hängt wohl grundsätzlich davon ab, welcher Sleepmode überhaupt 
genutzt werden soll. Je tiefer, desto mehr wird abgeschaltet und muß 
dann natürlich auch wieder wie nach reset bzw. Programmstart 
initialisiert werden. Da gibt es schöne Abschnitte im Manual, was 
abgeschaltet wird und auch vor allem, was das teil überhaupt wieder 
aufwecken kann.

von Manfred (Gast)


Lesenswert?

Das ganze mit dem DISABLE kannst Du Dir auch sparen, da der Controller 
das (abhängig vom gewählten Sleepmode) schon selber alles abschaltet.

von Lukas S. (lsimma)


Lesenswert?

Hallo Lutz, Hallo Manfred,

ich muss dazu sagen dass mein Code derzeit schon funktioniert. Nur bin 
ich mir nicht sicher ob die Kalibrierung des ADC beim Stoppen des ADC 
oder im  Sleepmode "flötengeht" und daher neu durchgeführt werden muss. 
Das Kalibrieren kostet Zeit und würde einen Delay zwischen Aufwecken und 
erster ADC-Messung ergeben was unerwünscht wäre.

-----

Beim STM32 gibt es die drei Modi Sleep, Standby und Stop Mode.

Wie im Code sichtbar wird "__WFI()" verwendet, damit gelangt der stm32 
NUR in den Sleep Mode (kein Standby und kein Stop Mode). Im Sleep Mode 
wird die Peripherie nicht abgeschaltet und kein Wert im RAM geht 
verloren (was hier wichtig ist). Ebenso ist beim Aufwecken aus dem Sleep 
die Peripherie und der Controller mit geringem Delay wieder am Arbeiten 
(was mir auch wichtig ist).

Ein laufender ADC oder DMA Interrupt würde den stm32 sofort wieder 
aufwecken damit muss ich den ADC zuerst mal stoppen. Ohne Stoppen des 
ADC läuft der ADC im Sleep Mode weiter denn im Sleep bleibt ja nur der 
ARM CORE stehen - um den Strom in dieser Zeit zu reduzieren wird der ADC 
ganz abgeschaltet.


Grüße,
Lukas

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

ich hab jetzt selbst den sleep noch nicht verwendet. Aber warum machst 
du die Interrupts nicht aus fr DMA und ADC, und lässt die laufen?
Wenn du dem ADC den Clock klaust dann würde ich behaupten musst du ihn 
neu kalibrieren, was steht dazum im Datenblatt also zu Clock an aus am 
ADC?

MfG

Tec

von Jean P. (fubu1000)


Lesenswert?

Hi,

Lukas Simma schrieb:
> ich muss dazu sagen dass mein Code derzeit schon funktioniert. Nur bin
> ich mir nicht sicher ob die Kalibrierung des ADC beim Stoppen des ADC
> oder im  Sleepmode "flötengeht" und daher neu durchgeführt werden muss.
Beim Sleep oder im StopModus muss der ADC nicht neu kalibriert werden!
Festhalten, das steht sogar im Datenblatt.

> Das Kalibrieren kostet Zeit und würde einen Delay zwischen Aufwecken und
> erster ADC-Messung ergeben was unerwünscht wäre.
Naja, das geht ziemlich fix, bei fADC = 14Mhz gerade mal 5,9µs !!!

> Beim STM32 gibt es die drei Modi Sleep, Standby und Stop Mode.
Wie schon oben erwähnt, sind im Stop und Sleep Mode keine Rekalibrierung 
notwendig(getestet).
Nach StandBy schon(ungetestet) meine ich muss ein neukalibrierung 
erfolgen, da das wie ein RESET ist.

GRUß

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.