ARM STM32, nach Wakup von Sleep jeweils ADC calibration notwendig

#2243007
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
Gast #2243126
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.
#2244523
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
#2244791
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren