Forum: Mikrocontroller und Digitale Elektronik STM32F4 ADC/DMA Phänomene


von Chris M. (ch_meier)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

Ich bin gerade dabei den ADC des STM32F407 im Interleaved Mode mit den 
3x 2,4MSps zu betreiben. Da das mit Interrupts natürlich viel zu langsam 
wäre, verwende ich den DMA des ST.
Das funktioniert eigentlich ganz gut, allerdings habe ich ein paar 
Phänomene die ich nicht verstehe:
1. Wenn ich mit den 3 ADCs im Interleaved Mode sample, bekomme ich beim 
2. Wert immer 0 in den Buffer geschrieben.
2. Zusätzlich dazu, sind die Werte nicht unbedingt plausibel. Wenn ich 
einen Sinus mit 24kHz anlege (dann sind nämlich 300 Samples eine ganze 
Periode), bekomme ich zwar den Sinus zurück, nur ist rund jeder dritte 
Wert zu hoch bzw. zu niedrig (je nachdem ob die Kurve im steigen oder im 
Fallen ist), was zu "Zacken" im Aufgenommenen Sinus führt. Ich kann das 
nicht wirklich auf einen der drei ADCs zurückführen, da, wenn ich nur 
einen ADC zum Samplen verwende, bei allen drei ADCs ungefähr das gleiche 
Ergebnis herauskommt.

Ich habe mal die c-Datei meiner Funktionen angehängt, da dort im Prinzip 
alles abläuft. Im angehängten Excel, hab ich kurz ne Visualiserung für 
das aufgenommene Signal zusammengebastelt.
Gestartet wird das Samplen mittels RS232. Ich bin mir durchaus bewusst, 
dass das RS232-Kommando ermitteln nicht das gelbe vom Ei ist, aber es 
ist für den Moment zweckmäßig ;)

Ein weiteres Phänomen, dass eventuell die Ursache für das 2. sein 
könnte, ist dass ich manchmal wenn ich nur mit dem ADC1 sample, 
wesentlich höhere Werte bekomme als mit den anderen beiden.

Ich bin für jede Hilfe dankbar,

LG Chris

von Detlef K. (adenin)


Lesenswert?

Seh ich das richtig, dass Du bei der Initalisierung jedes einzelnem 
Kanals
den ADC komplett und DMA2_Stream0 deinitalisierst?
Das ist funny ;)
1
void Init_ADCx_DMA( ADC_TypeDef* ADCx, uint32_t ADC_Resolution, uint8_t ADC_SamplingTime ){
2
3
  ADC_DeInit();
4
  DMA_DeInit(DMA2_Stream0);

von Chris M. (ch_meier)


Lesenswert?

Hi,

Ja mach ich aus folgendem Grund: Ich wollte den ADC/DMA per RS232 
stoppen und dann erneut starten und hab viele verschiedene 
vorgehensweisen probiert, wobei das das einzige war was funktioniert 
hat.
Eher ein wenig suboptimal, geb ich zu ;)

von Detlef K. (adenin)


Lesenswert?

Ok, ich hab den Sinn verstanden, das ist schon ok so.

Aber solltest Du nicht ADC_TripleMode_Interl einsetzen anstatt 
ADC_DualMode_Interl
1
  /*---------------------------- ADC Configuration ----------------------*/
2
3
  ADC_CommonInitTypeDef ADC_CommonInitStruct;
4
  ADC_CommonInitStruct.ADC_Mode = ADC_DualMode_Interl;

: Bearbeitet durch User
von Chris M. (ch_meier)


Lesenswert?

Hi,

Danke fürs bemerken. Fehler meinerseits. Ich wollte mal probieren, ob 
das Diagramm anders aussieht, wenn ich nur 2 statt 3 ADCs verwende. Dem 
war nicht so, sieht fast gleich aus...

von Detlef K. (adenin)


Lesenswert?

1
  /*---------------------------- ADC Configuration ----------------------*/
2
3
  ADC_CommonInitTypeDef ADC_CommonInitStruct;
4
  ADC_CommonInitStruct.ADC_Mode = ADC_DualMode_Interl;
5
  ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_1;

Wie sehen die Daten aus, wenn Du ADC_TripleMode_Interl und 
ADC_DMAAccessMode_2 verwendest?

: Bearbeitet durch User
von Chris M. (ch_meier)


Lesenswert?

Habe ich noch nicht probiert, da der DMA Mode zwei ja immer nur 
Halbwörter in (meiner Meinung nach) komischer Reihenfolge 
wegspeichert...
Ich probiers mal aus und meld mich mit den Daten.

LG

von Detlef K. (adenin)


Lesenswert?

Deine jetzigen Daten sind in komischer Reihenfolge. ;)

von Chris M. (ch_meier)


Lesenswert?

Nunja, ist eben die Frage ob sie in komischer Reihenfolge sind, oder ob 
mir einer der ADCs einen Streich spielt. Laut Reference Manual vom F4, 
sollte der DMA Mode 1 folgendes machen:
In Triple ADC mode, ADC1 data are transferred on the first request, ADC2 
data
are transferred on the second request and ADC3 data are transferred on 
the third
request; the sequence is repeated. So the DMA first transfers ADC1 data 
followed
by ADC2 data followed by ADC3 data and so on.
DMA mode 1 is used in regular simultaneous triple mode.

Und damit habe ich eventuell schon meinen Fehler entdeckt:
DMA Mode 2:
In Triple ADC mode, three DMA requests are generated. On the first 
request, both
ADC2 and ADC1 data are transferred (ADC2 data take the upper half-word 
and
ADC1 data take the lower half-word). On the second request, both ADC1 
and
ADC3 data are transferred (ADC1 data take the upper half-word and ADC3 
data
take the lower half-word).On the third request, both ADC3 and ADC2 data 
are
transferred (ADC3 data take the upper half-word and ADC2 data take the 
lower
half-word) and so on.
DAM mode 2 is used in interleaved mode and in regular simultaneous mode 
(for
Dual ADC mode only).


Vielleicht muss man im Interleaved mode den DMA Mode 2 oder 3 verwenden 
und 1 geht gar nicht... ich werde der Sache auf den Grund gehen.

Vielen Dank für deine Hilfe!

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.