Forum: Mikrocontroller und Digitale Elektronik STM32F0 Multi Channel ADC mit DMA problem


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich hab mal eine Frage was das Sampeln mehrerer ADC Kanälen mit DMA auf 
einem STM32F051 betrifft.

Mein Ziel wäre es 16 Kanäle mit dem ADC & DMA aufnehmen und das ganze so 
schnell wie möglich.
An den 16 Kanälen hängen Schiebepotentiometer die an einer 
Referenzspannungsquelle hängen. Die Spannung am Mittelabgriff habe ich 
bereits mit dem Oszi kontrolliert, die sieht sauber aus.

Nun zu dem Problem.... Die Werte schwanken, und das nicht gerade wenig.

Konfiguriert ist das ganze auf 12bit Auflösung, Continuous Mode, der ADC 
bekommt intern seinen Takt und Sample Time habe schon alle 
durchprobiert.

Der DMA ist entsprechend im Circular Mode konfiguriert mit TC Interrupt 
der dann den ADC kurz stoppt bis die Daten verarbeitet sind und nach dem 
Verarbeiten wird weitergemacht.

Vielleicht kann ja jemand mal über den Source im Anhang schauen ob ich 
da Mist gebaut hab ?

Hatte auch schon den ADC Mux im Verdacht und überlegt ob es etwas bringt 
wenn man erst einen Kanal x-mal sampelt und mittelt un dann den nächsten 
anstelle von nach jedem Sample den Kanal zu wechseln.

Hat jemand schonmal ähnliche Probleme beim ADC vom STMF0 gehabt ?

Vielen Dank schonmal und viele Grüße,

Stefan

von Stefan (Gast)


Lesenswert?

Kleines Update.

Auch erst 16 mal den selben Kanal einzulesen und danach zu wechseln 
bringt leider nichts.
Sehr wohl aber nur einen einzelnen Kanal einzulesen und den ADC nicht 
muxen zu lassen.

Vielleicht liegts ja am DMA ... das werd ich nun mal testen.

von Simon (Gast)


Lesenswert?

Hi!

Bei mir schankt da bei 8 Kanälen nichts (STM32F072).
Code kannst Du Dir hier bei mir abgucken:
https://github.com/fishpepper/OpenGround/blob/master/adc.c

Grüße,
Simon

von Nico W. (nico_w)


Lesenswert?

Ich mache das zwar auf einem STM32F411, allerdings stoppe ich den ADC 
über das continues-flag. Restart über SWSTART und CONT.
1
void DMA2_Stream4_Handler(void) {
2
  if ((DMA2->HISR & DMA_HISR_TCIF4) == DMA_HISR_TCIF4) {
3
    DMA2->HIFCR = 0;  // clear flag
4
    ADC1->CR2 &= ~(ADC_CR2_CONT);
5
  }
6
}
7
8
void start_adc() {
9
  ADC1->CR2 |= ADC_CR2_SWSTART | ADC_CR2_CONT;
10
}

https://github.com/Traumflug/Teacup_Firmware/blob/arm-stm32f411-port/analog-arm_stm32f4xx.c

von Stefan (Gast)


Lesenswert?

Sooo. Erstmal Danke für euere Antworten :)

Hab jetzt mal wieder ein wenig Zeit gefunden damit zu experimentieren.

Das was anscheinend das Problem verursacht hat war das ständige starten 
und stoppen des ADCs.
Ich hatte das mal gemacht weil ansonsten der Interrupt von der DMA ISR 
nur einmal kam und danach nicht mehr. (Das er nicht mehr kam war aber 
ein Bug in meiner damaligen FW... Jetzt tut das.)

Schwanken tut es jetzt immernoch etwas. So ca +- 20, aber das ist jetzt 
nichts was sich nicht durch ein bisschen Mitteln in den Griff bekommen 
lasst.
Die krassen Ausreisser sind jetzt endlich weg :)

Ich werd jetzt mal noch ein bisschen weiter experimentieren und sobald 
ich den Source wieder etwas aufgeräumt hab hier reinstellen. (Im Prinzip 
so wie der von Simon gepostete, nur das bei mir noch die DMA ISR genutzt 
wird)

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.