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ß ...
Was ich gemacht/bemerkt habe:
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).
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.
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
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):
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.
Andi aka
Chris Stratton
WissenschaftSamowar
Andi aka
WissenschaftSamowar
Chris Stratton
WissenschaftSamowar
WissenschaftSamowar
Spehro Pefhany
WissenschaftSamowar
WissenschaftSamowar
Bence Kaulics
WissenschaftSamowar
Chris Stratton
Aadarsch