mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pegel (Gast)
Datum:
Angehängte Dateien:

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

Autor: hochsitzcola (Gast)
Datum:

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

Gruß
hochsitzcola

Autor: pegel (Gast)
Datum:

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

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beiden ADC_SOFTWARE_START in der main.c stechen auch irgendwie ins 
Auge.

Autor: Dreikommaeinsvier (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pegel (Gast)
Datum:

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

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: leko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cristi P. (nico_2010)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.