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?
Ich habe nochmal einen Gegentest gemacht: Das prinzipiell gleiche Programm funktioniert auf einem STM32G431 Board vom selben Hersteller erfolgreich.
Poste mal deinen Schaltplan und den vom Hersteller. Eventuell hat dein Board eine kalte Lötstelle? Oder defekter DK?
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.
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?
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
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)
Nemopuk schrieb: > Link zum kaputten Schaltplan: Link zum Original (ist auch 2 Revisionen neuer): https://www.st.com/resource/en/datasheet/stm32c551cc.pdf https://www.st.com/resource/en/reference_manual/rm0522-stm32c5-series-armbased-32bit-mcus-stmicroelectronics.pdf
:
Bearbeitet durch User
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). |
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.