ADC funktioniert mit Töpfen, aber nicht mit Piezos

Ich habe ADC auf stm32f429 mit 3 eingeschalteten Kanälen (Schreiben von Daten mit DMA). Obwohl ich vermute, dass diese Frage nicht STM32-spezifisch ist, wahrscheinlich eine allgemeine ADC-Frage.

DIE "ANTWORT"
Ich habe "Lösung" gefunden. Ich habe versucht, Kanal 6 und 7 statt 1 und 2 zu verwenden - Problem ist weg. Anscheinend sind Kanal 1 und 2 "besonders", obwohl ich im Datenblatt nicht finden konnte, warum (oder ich es verpasst habe). Vielleicht sind sie bei der Eingangsleistung wählerischer, idk. Wenn es jemanden gibt, der Informationen geben kann - fühlen Sie sich frei, ich werde es als Antwort akzeptieren (wenn es gut genug ist). Vielleicht ist es stm32-spezifisch, wer weiß ...

  • Alle 3 Kanäle erhalten den richtigen ADC-Umwandlungswert, wenn ich sie an das Potentiometer anschließe (oder direkt an Vcc (Wert 4095) oder GND (Wert 0)).
  • Wenn ich sie schwebend lasse, werden die Dinge seltsam - Kanal 0 hat einen Wert von ~400 und Kanal 1 und 2 haben einen Wert von 0. Was ist los?
  • Und das eigentliche Problem ist - ich habe 3 Sensoren, die ich an ADC anschließen möchte, aber aus irgendeinem Grund funktioniert nur ADC-Kanal 0 und Kanal 1 und 2 funktionieren nicht mit Sensor (obwohl sie mit Töpfen arbeiteten!)

Was ich gemacht/bemerkt habe:

  1. Dies scheint nichts damit zu tun zu haben, dass ich drei Sensoren verwende - ich habe versucht, jeweils einen zu testen - die Schlussfolgerung ist, dass die Sensoren mit Kanal 0 hervorragend funktionieren und auf Kanal 1 und 2 überhaupt nicht funktionieren, selbst wenn sie getestet wurden eins nach dem anderen, ohne sich gegenseitig Probleme zu machen.
  2. Das ist wirklich seltsam - wenn ich mit dem Oszilloskop den Ausgang meines Sensors abtaste, funktioniert es ohne angeschlossenen ADC oder mit angeschlossenem Kanal 0. Sobald ich jetzt Kanal 1 oder 2 daran anschließe, zeigt das Oszilloskop Null an, unabhängig davon, was ich mit dem Piezo mache.

Mein Sensor ist im Grunde ein Piezosensor mit einigen Dioden, um ihn auf 3,3 V zu begrenzen und den negativen Teil wegzulassen (ich habe auch versucht, einen 1-M-Widerstand parallel zur Kappe zu schalten, aber das hat nichts gelöst).

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Auf diesem Screenshot sehen Sie das Debug-Fenster in Keil uVision, es zeigt den Wert 403 auf dem ADC ch 0, auch wenn nichts damit verbunden ist. Ich habe gemessen, dass es ~ 200-250 mV ist. Da Kanal 0 der einzige ist, der mit dem Sensor arbeitet, gehe ich davon aus, dass andere Kanäle die gleichen ~ 250 mV haben sollten, aber sie sind es nicht.

Geben Sie hier die Bildbeschreibung ein

Hier sind meine Konfigurationen für stm32f429 mit der HAL-Bibliothek. Jeder Kanal sollte gleich verbunden sein, aber ich frage mich, ob in den Konfigurationen etwas nicht stimmt ...

void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION12b;
  hadc1.Init.ScanConvMode = ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 3;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.EOCSelection = EOC_SEQ_CONV;
  HAL_ADC_Init(&hadc1);

    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
    */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
    */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 2;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
    */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = 3;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

}

Und die Datei stm32f4xx_hal_msp.c

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hadc->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* Peripheral clock enable */
    __ADC1_CLK_ENABLE();

    /**ADC1 GPIO Configuration    
    PA0/WKUP     ------> ADC1_IN0
    PA1     ------> ADC1_IN1
    PA2     ------> ADC1_IN2 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral DMA init*/

    hdma_adc1.Instance = DMA2_Stream0;
    hdma_adc1.Init.Channel = DMA_CHANNEL_0;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;
    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    HAL_DMA_Init(&hdma_adc1);

    __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

  /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(ADC_IRQn);
  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }

}

BEARBEITEN 1
Ich habe auch versucht, nur einen Piezosensor mit 1 M Widerstand zu verwenden - dasselbe, sobald ich Kanal 1 oder 2 anschließe - das Oszilloskop zeigt Null.

BEARBEITEN 2
Noch eine seltsame Sache - ich habe die Pins ch1 und ch2 gepiepst und sie scheinen geerdet zu sein. O_o

Möglicherweise haben Sie Kanal 1 und 2 durch zu hohe Spannungen vom Piezo beschädigt - mit anderen Worten, Sie haben es versäumt, Schutz vor dem Piezo zu bieten, der wahrscheinlich mit einem guten Schlag hundert Volt erzeugen kann. Versuchen Sie, die Töpfe wieder anzuschließen und sehen Sie, ob sie auf Kanal 1 und 2 funktionieren.
Möglicherweise haben Sie die anderen Kanalpins nicht richtig als Analogeingang konfiguriert. Unabhängig davon müssen Sie auch darauf achten, dass die Eingangsimpedanz von MCU-ADCs normalerweise nicht allzu hoch ist und bei vielen wie dem STM32 niedriger wird, je schneller Sie den ADC für die Konvertierung konfigurieren. Sie benötigen möglicherweise einen Trennverstärker, wenn Ihre Quelle eine hohe Impedanz hat.
@ Andy aka, Pots funktionieren immer noch perfekt. Und ich habe den Piezo mit 3,3 Zener angeschlossen, also sollten keine hohen Spannungen durchgehen
OK, dann versuchen Sie, den ADC mit 2 x 10k-Widerständen auf die halbe Vollaussteuerung vorzuspannen, aber halten Sie es vorsichtig, um eine Überspannung zu vermeiden. Der Piezo kann einfach parallel zu einem von ihnen platziert werden. Ich weiß, dass 10k zu klein sind, aber mit großen Widerständen funktioniert Ihr ADC nicht richtig (und zentriert). Proof-of-Concept-Idee, dann benötigen Sie einen Puffer-Operationsverstärker und 1-Mohm-Widerstände, damit es mit Empfindlichkeit funktioniert.
@ChrisStratton, ich habe versucht, ADC für eine sehr langsame Konvertierung (1 Abtastung / 480 Zyklen) zu konfigurieren, aber dies wirkt sich nicht auf die "Inaktivität" von Kanal 1 und 2 aus. Ich bin mir nicht sicher, was den Pufferverstärker betrifft, da ich viele Projekte gesehen habe wo Sie verwenden Pizesos, die direkt mit 1M Auflösung verbunden sind (nicht nur stm32, sondern auch avrs und pics).
Ein 1-Meg-Vorwiderstand bildet einen Teiler mit der kleineren Eingangsimpedanz und dämpft Ihr Signal.
Neue Info - Pins für ch1 und ch2 sind geerdet ... das ist wirklich seltsam, jetzt weiß ich nicht einmal, warum Potis funktionieren.
@Andyaka, es scheint auch nichts zu tun ... weil der Stift geerdet ist, also schließe ich den Piezo im Grunde genommen gegen den Boden. Oder lass es schweben. Wenn ich es schwebend lasse, zeigt das Oszilloskop, dass es in Ordnung ist, aber der ADC registriert es nicht (da die "Masse" des Sensors nicht mit uC geerdet ist, nehme ich an)
Manchmal wird diese Art von Verrücktheit durch die Erdung des DUT durch das Entwicklungssystem (z. B. durch einen USB-Anschluss) und andere Testgeräte verursacht. Es ist in Ihrem Schaltplan nicht dargestellt, daher ist es schwierig zu erraten, was genau es sein könnte.
@SpehroPefhany, es ist an Laptop USB angeschlossen, das ist alles. Ich habe versucht, es nur mit einer 5-V-Versorgung zu verbinden - dasselbe.
Hallo Leute. Ich habe "Lösung" gefunden. Ich habe versucht, Kanal 6 und 7 statt 1 und 2 zu verwenden - Problem ist weg. Anscheinend sind Kanal 1 und 2 "besonders", obwohl ich im Datenblatt nicht finden konnte, warum (oder ich es verpasst habe). Vielleicht sind sie bei der Eingangsleistung wählerischer, idk. Wenn es jemanden gibt, der Informationen geben kann - fühlen Sie sich frei, ich werde es als Antwort akzeptieren (wenn es gut genug ist). Vielleicht ist es stm32-spezifisch, wer weiß ...
Ich hatte/habe ein ähnliches Problem bei einem STM32F4Discovery, ADC3 Ch11,12. Topf funktioniert gut IR-Abstandssensor nicht. @ScienceSamovar, wo hast du festgestellt, dass Kanal 1,2 "besonders" sind, es ist nur deine Meinung oder du hast ein Dokument gefunden?
@BenceKaulics, meiner Meinung nach kann ich nichts im Datenblatt finden, aber wenn ich einfach die Kanäle ändere, ohne irgendetwas anderes zu berühren, denke ich, dass ch1 und ch2 wahrscheinlich nicht gleich sind ... vielleicht gibt es etwas im Datenblatt, aber ich könnte nicht leicht finden. Oder vielleicht habe ich sie irgendwie beschädigt, obwohl in diesem Fall Töpfe auch nicht funktionieren würden ... Das ist sowieso immer noch ein Rätsel ... Wenn ich mehr darüber finde - ich werde den Beitrag ergänzen.
Es gibt viele Nuancen bei der Konfiguration von STM32-Pins, die je nach Teil und Familie variieren, aber Dinge wie das Einschalten und Takten des übergeordneten Peripheriebusses, das Konfigurieren des alternativen Funktionsmodus, das Aktivieren/Deaktivieren des Pin-Tauschs usw. umfassen. Vielleicht möchten Sie eine elektrische Charakterisierung vornehmen das Verhalten der Stifte durch Messen der Spannung, wenn sie von verschiedenen Kombinationen bekannter Widerstände angesteuert werden. Sie können die Pins auch vorübergehend als digitale Eingänge ausprobieren - das ist nicht dasselbe wie analoge, aber es können einige Versehen (oder weniger wahrscheinlich Schäden) auftreten.
Ich weiß nichts über STM-Controller, aber ich kenne AVR. In AVR gibt es etwas namens "ADCMUX", das ist ein ADC-Multiplexer. Angenommen, Sie haben 4 ADC-Kanäle. Dieser ADC-Mux wählt einen beliebigen Kanal aus und verarbeitet ihn zur Ausgabe. Wenn Sie einen anderen Kanal verarbeiten möchten, müssen Sie dies tun entsprechenden Wert im ADCMUX-Register, um ihn auszuwählen und ADC in diesem Kanal zu verarbeiten. Gibt es solche STM-Controller?

Antworten (1)

Das einzige Besondere an Kanal 1 und 2 ist, dass diese Kanäle mit den beiden Pins verbunden sind, die Sie mit Ihrem Piezosensor durchgebrannt haben.

Aber das weißt du ja schon. Die Pins sind mit Masse kurzgeschlossen. Dies bedeutet, dass Sie die Eingangsschutzdiode geschmolzen haben, die von diesem Pin auf Masse geht, indem Sie den Pin zu weit unter die Erde gezogen haben. "Zu weit" ist in diesem Fall, was auch immer die Vf dieser Diode ist. Laut Datenblatt können Sie absolut keinen Pin mehr als 300 mV unter Masse ziehen, daher können wir mit Sicherheit davon ausgehen, dass die Eingangsschutzdiode dann einschaltet. Es ist nicht dazu bestimmt, jemals Strom zu führen, und wird sofort schmelzen und sich schließen, wenn dies der Fall ist. Aus diesem Grund sehen Sie 0 V von Ihrem Sensor, sobald er mit ihnen verbunden ist - sie sind jetzt dauerhaft mit Masse kurzgeschlossen.

Als Referenz sehen alle IO-Pins auf einem Mikrocontroller so aus (mehr oder weniger):

![Bildbeschreibung hier eingeben

Ziehen Sie den Stift unter den Vf der unteren Diode, und er wird sich gerne opfern, um alles zu retten, was mit diesem Stift tiefer im Mikrocontroller verbunden ist. Diese Eingangsschutzdioden haben im Allgemeinen eine sehr niedrige Vf, um sicherzustellen, dass sie sich einschalten und einen Pfad mit niedriger Impedanz für den elektrischen Fehler (Spannung, die über VCC oder unter GND schwingt) schaffen, der den Rest des Mikrocontrollers umgeht.

Wie schließt du deine Schutzschaltung an? Sie haben die 2 wichtigsten Verbindungen vollständig weggelassen - wo verbinden Sie Masse und wo verbinden Sie den ADC-Eingang.

Je nachdem, wie Sie es angeschlossen haben, würde der Schutz die positive Spannung klemmen, aber dennoch in der Lage sein, den Stift negativer zu ziehen, als der Stift aushalten kann. Nun, ich denke, es spielt keine Rolle - nur so würden diese Stifte geerdet, also ist das Ihre Antwort. Ihr Schutz war nicht richtig verdrahtet oder konnte auf andere Weise nicht verhindern, dass > -300 mV an diesen Pins gesehen werden, und ihre Erdungsdioden sind ausgefallen.

Was CH0 betrifft, das 400 beim Schweben anzeigt ... also? Es schwimmt. Es spielt keine Rolle, was es liest, und es kann alles lesen. Es schwimmt. Es wird nicht 0 lesen. 0 ist Massepotential. Ein potentialfreier Eingang liegt nicht auf Massepotential. Es hat kein Potenzial. Zufälliges Rauschen wird kapazitiv und magnetisch eingekoppelt, es gibt keinen Weg für den Fluss der Vorspannungsströme, und es ist nicht überraschend, dass der Eingang des ADC gesättigt ist. Aber es spielt keine Rolle. Es gibt keinen Grund, einen nicht angeschlossenen ADC-Pin zu lesen, da jeder Messwert, den Sie erhalten, bedeutungslos ist. Um etwas zu messen, muss man zuerst etwas zu messen haben.