Forum: Mikrocontroller und Digitale Elektronik ADC Channels


von D. I. (Firma: Fa) (buell)


Lesenswert?

Hallo

Ich habe eine etwas speziellere Frage beim STM32L476RG Nucleo.
Ich habe 2 differentielle Kanäle (insg. 4) wo ich einmal 20 Werte in 
einem Kanal konvertiere und und einmal 30 Werte im anderen Kanal.

In welchem Register gebe ich denn an in welchem Kanal der ADC (es gibt 
bei mir nur einen ADC) jetzt konvertieren soll mit DMA?

Das sehe ich nirgends.

Kann jemand helfen?

: Bearbeitet durch User
von D. I. (Firma: Fa) (buell)


Lesenswert?

Ich versteh das einfach nicht,
zB. steht hier beim stm32L431RC:

im manual

Select the ADC1_IN17 input channels (with the appropriate sampling time)

Wie wähle ich das aus, sprich mit welchem Register?
Wie kann ich denn wenn ich die Kanäle IN1, IN2 und IN11 und IN12 
verwende sagen, dass nun der ADC im Kanal 1 Werte wandeln soll?

Also geschieht das über das ADCx_SMPR1 bzw. ADCx_SMPR2 Register, wenn 
ich für den Kanal die sample time gewählt habe?
Heisst das dann, dass ich die sample time nicht für alle Kanäle zugleich 
wählen darf?

: Bearbeitet durch User
von Jakobus (Gast)


Lesenswert?

Das wissen nur die wenigen, die sich mit dem STM32L476RG Nucleo
beschäftigt haben - also das Datenblatt zielgerichtet gelesen
haben.

Steck die Nase rein, dann gehörst du auch zu diesen Experten!

Ja, da muss man manchmal vor- und zurückblättern, bis man es
kapiert hat.

Da gibt es keinen Abschnitt für GENAU DEIN PROBLEM.
Gibt es so gut wie nie!

von D.I (Gast)


Lesenswert?

danke fuer deine Antwort. Und wo sind die Experten wo das wissen? Ich 
nehme an da bin ichnin diesem Forum sicher nicht falsch. ?
Demfall bitte ich um Expertenrat. Ich habe mittlerweile 110 Seiten (ADC 
Kapitel) gelesen und bin immer noch micht schlauer wie man das jetzt 
macht..

von Christopher J. (christopher_j23)


Lesenswert?

D. I. schrieb:
> Wie kann ich denn wenn ich die Kanäle IN1, IN2 und IN11 und IN12
> verwende sagen, dass nun der ADC im Kanal 1 Werte wandeln soll?

Wenn du nur einen einzelnen Kanal, z.B. Kanal 1 wandeln willst, dann 
schreibst du in ADC_SQR1 in SQ1[4:0] ("1st conversion in regular 
sequence") deine Kanalnummer rein und setzt bzw. belässt L[3:0] 
("Regular channel sequence length") auf 0 ("0000: 1 conversion"). Dann 
triggerst du den ADC, entweder durch Hardware (Timer TRGO oder CC, EXTI, 
usw) oder einfach durch Software indem du das ADSTART Bit im ADC_CR 
setzt. Dann kannst du im ADC_DR (nach erfolgter Konvertierung) deinen 
Wert auslesen. Vorher solltest du noch den ADC einschalten (ADEN in 
ADC_CR) und kalibrieren (ADCAL in ADC_CR) und natürlich den Prescaler 
für den ADC richtig konfigurieren (in RCC) und den Takt einschalten (in 
RCC).

Wenn du nun vier Kanäle hintereinander wandeln willst, dann schreibst du 
die entsprechend im ADC_SQRx in SQ1, SQ2, SQ3 und SQ4 und setzt L 
entsprechend auf drei (für vier Wandlungen). Da du bei "regular 
sequence" pro ADC nur ein Datenregister für alle Kanäle hast, musst du 
die Daten jeweils nach erfolgter Konvertierung per DMA wegschaufeln.

Bei den "injected channels" hast du scheinbar vier Datenregister und 
brauchst nicht zwingend DMA benutzen. Dort hat das "sequence register" 
auch nur vier Plätze, also für jeden Platz ein eigenes Register. Das 
habe ich aber selber auch noch nie ausprobiert, sieht aber komfortabler 
aus.

Jakobus schrieb:
> Ja, da muss man manchmal vor- und zurückblättern, bis man es
> kapiert hat.

Da wirst du wohl nicht drum herum kommen ;)

D. I. schrieb:
> Also geschieht das über das ADCx_SMPR1 bzw. ADCx_SMPR2 Register, wenn
> ich für den Kanal die sample time gewählt habe?
> Heisst das dann, dass ich die sample time nicht für alle Kanäle zugleich
> wählen darf?

Die sample time kannst du für jeden Kanal separat einstellen, hat aber 
nichts damit zu tun ob der Kanal nun gewandelt wird oder nicht (siehe 
oben).

: Bearbeitet durch User
von ziegler (Gast)


Lesenswert?

Vielen Dank Christopher.
Das ist top erklaert?. Eine letzte Frage noch:
Wenn alle Einstellungen gemacht wurden wie du erklaert hast und ich habe 
pro Kanal 20 Werte zum Konvertieren. ADC ist so eingestellt, dass dieser 
auf fallende Flanken reagiert zb. Das heisst beim Triggern kommen also 
20 solcher flanken.  Wann weiss der ADC dann, dass er nicht auf den 
naechsten Kanal darf, bevor alle 20 komvertiert wurden?

vielen Dank

von Christopher J. (christopher_j23)


Lesenswert?

ziegler schrieb:
> Wann weiss der ADC dann, dass er nicht auf den
> naechsten Kanal darf, bevor alle 20 komvertiert wurden?

Der ADC konvertiert sequentiell die Kanäle die du in die 
"regular/injected sequence register" reinschreibst. Bei "regular 
channels" sind das maximal 16 Stück und bei "injected channels" sind es 
vier. Du kannst also nicht 20 Konvertierungen in einer Sequenz 
durchlaufen lassen, d.h. du musst die Sequenz wiederholen. Willst du 
unbedingt erst 20 mal bei einem Kanal und dann 20 mal bei einem anderen 
Kanal konvertieren musst du (soweit ich es verstehe) zwischendurch den 
AD-Wandler anhalten, dein Sequenzregister umkonfigurieren und 
anschließend wieder neu starten.

von D.I (Gast)


Lesenswert?

Vielen Dank

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.