Forum: Mikrocontroller und Digitale Elektronik STM32F4 Mehrere ADCs unabhängig benutzen


von Aljo E. (alrue)


Lesenswert?

Guten Tag.
Ich möchte ADC1 und ADC2 im dual mode betreiben und dazu (nicht 
gleichzeitig) auch noch ADC3 benutzen. Allerdings funktioniert bei mir 
kein ADC mehr, wenn ich alle drei initialisiere.
Also ich schaffe es ADC1 und ADC2 im dual mode zu betreiben, wenn ADC3 
nicht initialisiert ist und andersrum kann ich ADC3 wie geplant 
betreiben, wenn ADC1 und ADC2 nicht initialisiert sind. Dazu sei gesagt, 
dass ich für alle ADC noch den DMA verwende.

Mir stellt sich nun die Frage, ob ich überhaupt einen dual mode und 
einen independent ADC haben kann oder auf den triple mode ausweichen 
muss wenn ich drei ADCs betreiben will.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Guck mal ins ref-Manual. Sort steht etwas dazu. Ich meine mich zu 
erinnern dass das geht.

von Aljo E. (alrue)


Lesenswert?

Leider konnte ich dazu noch nirgendwo etwas finden. Es wurde nirgendwo 
explizit beschrieben, mehrere ADCs unabhängig voneinander zu betreiben.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?


von Aljo E. (alrue)


Lesenswert?

Ok, danke.

Also ich habe mal zwei wichtige Sätze gefunden:

"In some devices, there are up to 3 ADCs: ADC1, ADC2 and ADC3. In this 
case ADC3 always works independently, and is not synchronized with the 
other ADCs"

Da ich den STM32F446 benutze bei dem genau das der Fall ist, nehme ich 
einfach mal an, dass es prinzipiell möglich ist ADC1 und ADC2 im dual 
mode und zusätzlich ADC3 im independent mode zu betreiben.

"This application note does not describe the ADC modes that result from 
the combination of other modes."

Leider steht dort nicht beschrieben wie, oder was das Problem sein 
könnte, dass es bei mir nicht funktioniert.

Über Ideen oder Anregungen würde ich mich sehr freuen!

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Schau mal nach dem Errata Sheet, vllt steht da ja noch was drin zu dem 
Thema.

Deine Beschreibung ist ja auch sehr vage mit "funktioniert nicht mehr" 
:)

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Versuchs mal mit ner langsam Abtastung ohne DMA per Interrupt. Schau dir 
die Register an, was die so sagen.

von Aljo E. (alrue)


Lesenswert?

Also anscheinend ist mein Vorhaben doch zum scheitern verurteilt. Das 
Problem ist nämlich die ADC Common Init Structure, die nur einmal 
gemacht werden kann. Mein ADC_CommonInitStructure.ADC_Mode = 
ADC_Mode_Independent;
und mein ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult; 
beißen sich.

Ein Satz dazu aus dem stm32f4xx_adc.c file:

"ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure 
that contains the configuration information for  All ADCs peripherals."

Muss also doch auf den triple mode ausweichen.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Aljo E. schrieb:
> Also anscheinend ist mein Vorhaben doch zum scheitern verurteilt. Das
> Problem ist nämlich die ADC Common Init Structure, die nur einmal
> gemacht werden kann. Mein ADC_CommonInitStructure.ADC_Mode =
> ADC_Mode_Independent;
> und mein ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
> beißen sich.
>
> Ein Satz dazu aus dem stm32f4xx_adc.c file:
>
> "ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure
> that contains the configuration information for  All ADCs peripherals."
>
> Muss also doch auf den triple mode ausweichen.
Versuche mal einen anderen Ansatz:
Die SPLibrary deckt ja schon jede Menge Möglichkeiten zur Abarbeitung 
deines Codes. Aber eben nicht alle! Ich benutze bspws. bei der 
Initialisierung möglichst die SPL, es geht allerdings nicht immer, weil 
die eben nicht immer das macht was ich möchte. Dann setze ich die 
Register eben manuell. In meinen Interrupts benutze ich ausschließlich, 
aus Performance-Gründen, die manuelle Setzung der Register.

Lese dich in den ADC-Abschnitt ein (beachte dabei auch die AppNote) und 
in die ADC-Register. Dann initialisierst und steuerst du das ganze 
einfach per manuelle Änderungen am Register, ohne die SPL.

von Aljo E. (alrue)


Lesenswert?

Das ist ein guter Hinweis, vielen Dank. Ich scheine jetzt die Lösung im 
Reference manual gefunden zu haben:

MULTI[4:0]: Multi ADC mode selection

– 00001 to 01001: Dual mode, ADC1 and ADC2 working together, ADC3 is 
independent


Wenn ich also ADC_Mode = ADC_DualMode_RegSimult; implementiere, ist das 
genau mein gewünschtes setup. Eine zweite 
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; würde mir das 
also wieder verwerfen. Ich werd das mal auspprobieren und berichten. 
Muss nochmal schauen wie ich das mit dem DMA dann regle.

von Vincent H. (vinci)


Lesenswert?

Ich nutze bei einem STM32F407 Projekt ADC1 und 2 im Dual Mode und ADC3 
getrennt davon. Auch alles via DMA, das funktioniert garantiert.

von Aljo E. (alrue)


Lesenswert?

Jap, bei mir klappts jetzt auch :)

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.