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