Forum: Mikrocontroller und Digitale Elektronik STM32F1xx: Injected simultanous ADC läuft nicht


von hochsitzcola (Gast)


Lesenswert?

Ich möchte zwei Phasenströme eines BLDC Motors simultan über ADC1 und 
ADC2 getriggert über Timer1 Capture Compare Channel 4 einlesen. Siehe 
auch Kapitel 5.1 der STM Dokumentation UM1052
https://www.st.com/content/ccc/resource/technical/document/user_manual/5e/5e/d2/cb/07/35/45/a6/CD00298474.pdf/files/CD00298474.pdf/jcr:content/translations/en.CD00298474.pdf

Das Grundsetup habe ich mit CubeMX erstellt. Das Compiliert auch 
fehlerfrei (OpenSTM32 in Eclipse)
Leider bekomme ich den AD-Wandler nicht wie gewünscht zum Laufen. Es 
wird anscheinend kein Interrupt vom Channel4 erzeugt. (weder 
TIM1_TRG_COM_IRQn noch TIM1_CC_IRQn)
Zum Check toggle ich die LED auf dem Board in der Interrupt Routine. Der 
Einzige Interrupt der kommt, ist der vom Timer1 Überlauf.
Das ganze Projekt ist auf Github zu finden:
https://github.com/stancecoke/LishuiFOC

Hat jemand eine Idee? Bitte kein HAL oder CubeMx Bashing und ja, ich 
habe das Reference Manual für Timer 1 und ADC1+2 bereits durchgeackert 
;-)
https://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf

Gruß
hochsitzcola

von pegel (Gast)


Lesenswert?

Ich kann mich dunkel erinnern, dass ich da auch mal geknoblet habe.
Das Problem war, dass bei  HAL_TIM_PWM_Start.... theoretisch alle Kanäle 
verodert werden können, aber praktisch musste jeder einzeln gestartet 
werden, da es sonst nicht funktioniert hat.

von hochsitzcola (Gast)


Lesenswert?

OK, wenn ich alle Kanäle einzeln starte, kommt der TIM1_CC_IRQn 
Interrupt. Der ADC läuft immer noch nicht. Ich denke, daß der auf den 
Trigger-Interrupt wartet und der kommt nicht :-(

Gruß
hochsitzcola

von pegel (Gast)


Angehängte Dateien:

Lesenswert?

Was ist mit dem letzten Punkt im Bild?
Habe jetzt keine Lust ein Beispiel zu studieren, aber stimmt das so?

von hochsitzcola (Gast)


Lesenswert?

Das kann man nur auf "Auto" stellen, dann wird aber die Triggerquelle 
ungültig...

Gruß
hochsitzcola

von pegel (Gast)


Lesenswert?

Dann muss ich jetzt passen. Ich habe nur "normalen" ADC benutzt.
Mit injected habe ich mich nicht befasst.
Was ist der Unterschied?

von pegel (Gast)


Lesenswert?

Die beiden ADC_SOFTWARE_START in der main.c stechen auch irgendwie ins 
Auge.

von Dreikommaeinsvier (Gast)


Lesenswert?

hochsitzcola schrieb:
> Bitte kein HAL oder CubeMx Bashing

Na ja, dann können dir so ziemlich alle Profis hier schon mal nicht 
helfen, denn die benutzen sowas halt nicht. Das hat auch seinen Grund, 
wie du es gerade erkennen dürftest...

Gehe doch mal in den Debug wie jeder normaler Entwickler, schau dir die 
Register zur Laufzeit an und die Lösung deines Problems kommt in 
greifbare Nähe.

Mehr kann man dir leider nicht anbieten.

von hochsitzcola (Gast)


Lesenswert?

pegel schrieb:
> Mit injected habe ich mich nicht befasst.
> Was ist der Unterschied?

Injected scheint es extra für die Anwendung in der BLDC Ansteuerung zu 
geben. Die AD-Werte werden direkt in eigene Register geschrieben und 
ggf. gleich ein Offset abgezogen. Das Ganze mit hoher Priorität.

Dreikommaeinsvier schrieb:
> Na ja, dann können dir so ziemlich alle Profis hier schon mal nicht
> helfen, denn die benutzen sowas halt nicht. Das hat auch seinen Grund,
> wie du es gerade erkennen dürftest...

Ich habe ja nicht gesagt, daß ihr mir keine Tipps auf Registerebene 
dürft. :-) Die Benutzung des HAL ist gewöhnungsbedürftig und es gibt 
nicht viel Beispiele im Netz. Dieser Injected-Mode durch Timer1 
getriggert scheint besonders exotisch zu sein.

Ich werde auf jeden Fall deinen Rat befolgen und mir die Registerinhalte 
mal genauer anschauen...

Gruß
hochsitzcola

von pegel (Gast)


Lesenswert?

pegel schrieb:
> ADC_SOFTWARE_START

Moin,
du hast für die ADC die Kombination von Normal und Injected angegeben.
Deshalb ist jetzt die Frage, ob das Injected nur funktioniert, wenn das 
Normal schon läuft.
Ich würde Normal starten bzw. aus der Konfiguration nehmen um das zu 
testen.

von pegel (Gast)


Lesenswert?

Das Beispiel funktioniert jedenfalls so:

https://blog.naver.com/PostView.nhn?blogId=eziya76&logNo=220953913003

nur das kein Timer IT, sondern ein EXTI den Injected ADC startet.

von hochsitzcola (Gast)


Lesenswert?

Schade, bei deinem Link ist die Initialisierung vom ADC nicht als Code 
dargestellt...

Der Capture Compare Interrupt vom Timer 1 kommt ja, also könnte ich 
damit auch die injected conversion wie im Beispiel aufrufen.
Ich bin bisher aber davon ausgegangen, das das automatisch geht, da ich 
ja in der Injected Konfiguration als Trigger den Channel 4 Capture 
Compare direkt anwählen kann....

Gruß
hochsitzcola

von hochsitzcola (Gast)


Lesenswert?

Update: den injected ADC per Softwarestart über den TIM1_CC_IRQn 
Callback triggern funktioniert.
Direkt über JEXTSEL[2:0]:001: Timer 1 CC4 event funktioniert nicht :-( 
Ich werde jetzt mal im OpenSTM32 Forum anfragen.

Gruß
hochsitzcola

von pegel (Gast)


Lesenswert?

Wie gesagt, vielleicht muss der Normale ADC laufen damit das 
funktioniert.
Du hast ja die Kombi Normal/Injected ausgewählt.

von hochsitzcola (Gast)


Lesenswert?

Hm, softwaregestartet geht es ja auch, ohne daß regular ADC läuft.
Das Thema bei OpenSTM32 ist erstellt.
http://www.openstm32.org/forumthread7467?topics_offset=0

Gruß
hochsitzcola

von hochsitzcola (Gast)


Lesenswert?

Hm, ich bin in dem User Manual über den Hinweis gestolpert (Table3, 
Seite 36)
> DMA is used to enable ADC injected conversion external trigger. Disabling is 
performed by software

Das sagt mir gar nichts. Die erwähnten DMA Kanäle sind für ADC1 (Kanal1) 
und UART (Kanal5) ?! Ich hab jetzt in 4 verschiedenen Foren angefragt, 
keine Lösung in Sicht. Ich behelfe mir jetzt mit dem Timer CC Ch4 
Callback und rufe den Injected ADC darüber auf...

Gruß
hochsitzcola

von leko (Gast)


Lesenswert?

Hallo zusammen,

ich habe die gleiche Anwendung und bekomme es hin den injected channel 
genau einmal auszulesen. Danach wird das JEOS/C Flag nie wieder gesetzt 
obwohl ich die Conversion erneut starte. Da der Beitrag nciht ganz so 
alt ist wollte ich mal fragen ob du in der zwischenzweit eine Lösung 
gefunden hast.

Viele Grüße

leko

von Cristi P. (nico_2010)


Angehängte Dateien:

Lesenswert?

hochsitzcola schrieb:
> Hm, ich bin in dem User Manual über den Hinweis gestolpert (Table3,
> Seite 36)
>> DMA is used to enable ADC injected conversion external trigger. Disabling is
> performed by software
>
> Das sagt mir gar nichts. Die erwähnten DMA Kanäle sind für ADC1 (Kanal1)
> und UART (Kanal5) ?! Ich hab jetzt in 4 verschiedenen Foren angefragt,
> keine Lösung in Sicht. Ich behelfe mir jetzt mit dem Timer CC Ch4
> Callback und rufe den Injected ADC darüber auf...
>
> Gruß
> hochsitzcola

Hello,
Some time ago I made an short application to read simultaneously 2 
channels of ADC1, using DMA.
In attachment is the "main.c" file
I hope this will help you.

: Bearbeitet durch User
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.