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
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); |
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 ;)
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
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...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.