Forum: Mikrocontroller und Digitale Elektronik STM32F552VE kann analoge Pins nicht lesen


von Nemopuk (nemopuk)


Angehängte Dateien:

Lesenswert?

Ich möchte mit dem folgenden Testprogramm den analogen Eingang PA4 
lesen.

Problem:
Der ADC liefert mir auf allen Kanälen immer Werte von 88-91, egal welche 
Spannung ich anlege. Nur bei den beiden internen Kanäle (12 und 13) 
liefert der ADC plausible Werte.

Vref+ liegt bei meinem gekauften Board auf 3,3 Volt.

Aber irgendwas fehlt noch. Erkennt jemand den Fehler?
von Nemopuk (nemopuk)


Lesenswert?

Ich habe nochmal einen Gegentest gemacht:

Das prinzipiell gleiche Programm funktioniert auf einem STM32G431 Board 
vom selben Hersteller erfolgreich.
von Alexander W. (Firma: AW-Elektronik) (alexanderwalter)


Lesenswert?

Poste mal deinen Schaltplan und den vom Hersteller.
Eventuell hat dein Board eine kalte Lötstelle? Oder defekter DK?
von Kilo S. (kilo_s)


Lesenswert?

GPIO und Clock init, V-ref Buffer...

Default als analog reicht nicht, der Pin hängt noch auf digital und 
daher bekommst du irgendwas um ~80-90 angezeigt.

RCC_AHB2ENR_GPIOAEN und GPIOA->MODER =0b11 vor init_analog.

VREFBUF->CSR_ENVR = 1 in der init.
von Nemopuk (nemopuk)


Lesenswert?

Alexander W. schrieb:
> Poste mal deinen Schaltplan und den vom Hersteller.

Gibts leider nicht. Das PDF ist defekt.

> Eventuell hat dein Board eine kalte Lötstelle? Oder defekter DK?

Irgendwas in der Art befürchte ich auch. Spielt der Vref- Pin eine 
Rolle?
von Nemopuk (nemopuk)


Lesenswert?

Link zum kaputten Schaltplan: 
https://github.com/WeActStudio/WeActStudio.STM32C5_100Pin_CoreBoard/blob/master/Doc/stm32c552ve.pdf

Kilo S. schrieb:
> Default als analog reicht nicht, der Pin hängt noch auf digital und
> daher bekommst du irgendwas um ~80-90 angezeigt.

Ich habe PA4 auf analoge Eingabe konfiguriert - denke ich. Was siehst du 
dort, was ich nicht sehe?Habe das auch mit PA3 und PA5 versucht. Bekomme 
trotzdem auf allen 12 Kanälen den selben Wert. Nur die internen Kanäle 
12 und 13 funktionieren.

> VREFBUF->CSR_ENVR = 1 in der init.

Danke, das versuche ich heute Abend.
: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Mal mit STM32 MX Cube gearbeitet? Der Code-Generator hat mich nur selten 
enttäuscht, fast immer kommt da etwas Brauchbares bei raus. Vlt. mal 
15min investieren und vergleichen (oder gleich direkt nutzen)
von Bauform B. (bauformb)


Lesenswert?

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Das gab's früher nicht (RM0522):
1
21.4.11 Channel preselection register (ADC_PCSEL)
2
The PCSEL bit of the ADC_PCSEL register controls the analog switch
3
integrated in the I/O. For each channel selected through SQRx or JSQRx
4
bits, the corresponding PCSEL bit must be configured in advance in the
5
ADC_PCSEL register. The ADC input multiplexer selects the ADC input
6
according to SQRx and JSQRx configuration with very high speed.
7
The analog switch integrated in the I/O cannot react as fast as the
8
ADC multiplexer. To avoid the delay due to the analog switch control
9
on the I/O, it is necessary to preselect the input channels that are
10
selected through the SQRx and JSQRx. The selection is based on the VIN
11
of each ADC input. For example, if the ADC converts ADCx_IN1, PCSEL1 bit
12
must also be set in ADC_PCSEL register.
13
Note: Configuring the PCSEL bit is not necessary for the internal
14
channels (such as VREFINT).
von Kilo S. (kilo_s)


Lesenswert?

Nemopuk schrieb:
> Was siehst du dort, was ich nicht sehe?

Der Pin war noch Digital statt Analog GPIOA->MODER hat pro Pin 2 Bits:
- 00 = Input
- 01 = Output
- 10 = Alternate Function
- 11 = Analog

Nach Reset ist PA4 zwar oft 00 = Input. Das Problem: Im Digital-Input 
ist der Schmitt-Trigger + Pullup/Pulldown + ESD-Dioden aktiv.

Erst mit MODER = 0b11 wird die komplette Digital-Logik abgeschaltet. 
Dann geht der Pin direkt auf den ADC-Multiplexer.

Die GPIO-Clock war zu spät an
RCC->AHB2ENR_GPIOAEN muss an sein bevor du GPIOA->MODER schreibst.


Ich hab bisher gelernt das man immer so vorgeht:Clock an -> Pin 
konfigurieren -> Peripherie starten.
von Nemopuk (nemopuk)


Lesenswert?

Kilo S. schrieb:
> VREFBUF->CSR_ENVR = 1 in der init.

Gibt's bei diesem Modell nicht.

Kilo S. schrieb:
> Der Pin war noch Digital statt Analog
> Die GPIO-Clock war zu spät an

Wie meist du das, war das bei dir mal der Knackpunkt? Die Punkte sind 
bei mir beide in Ordnung.

Harald A. schrieb:
> Mal mit STM32 MX Cube gearbeitet?

Ja, das hilft mir aber nicht dabei, diese Grundlagen zu lernen. Und 
glaube mir, ich habe viele Stunden lang versucht, durch dessen ADC 
Implementierung durch zu blicken. Allerdings wäre ich notfalls darauf 
zurück gekommen, um wenigstens die Hardware defekt ist. Mit Arduino wäre 
es noch einfacher gewesen, aber Arduino unterstützt die C5 Serie noch 
nicht.

Bauform B. schrieb:
> Link zum Original (ist auch 2 Revisionen neuer)

Datenblatt und Reference Manual habe ich gefunden. Der Schaltplan von 
dem Board fehlt.

Bauform B. schrieb:
> Das gab's früher nicht (RM0522)
> 21.4.11 Channel preselection register (ADC_PCSEL)

Du bist ein Schatz! Das war der Knackpunkt. Ich hatte also wirklich 
etwas übersehen. Damit ging es dann sofort:
1
// Pre-Select all 14 input channels
2
STM32_MODIFY_REG(ADC1->PCSEL, ADC_PCSEL_PCSEL, 0b0011111111111111);

Vielen lieben Dank!
von Kilo S. (kilo_s)


Lesenswert?

Nemopuk schrieb:
> Wie meist du das, war das bei dir mal der Knackpunkt?

Ja, lange Geschichte kurz gehalten, ich hatte häufiger Probleme mit 
sowas.

Wenn die Reihenfolge nicht gepasst hat, gab es häufig Schluckauf.
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.