STM32F4 ADC Problem

#2865060
Lesenswert?

Habe ein kleines Problem mit dem STM32F4 Discovery. Und zwar wenn ich 
den ADC1 initialisiere und auf PB0 den Analogen Eingang lege so zieht es 
diesen auf 0.6 V hoch. Das ist mir aufgefallen, da ich vorher an einem 
Spannungsteiler probiert habe aber die umgerechneten Spannungswerte 
einfach nicht linear waren.
Woran kann das liegen?
Habe ich etwas übersehen?

Hier noch der Code für die Initialisierung des ADCs und des GPIOs

void Init_ADC1()
{
  /* Enable ADC1 Clocks ****************************************/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    GPIO_StructInit(&GPIO_InitStructure);
    /* Configure ADC1 Channel8 pin as analog input 
******************************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);


    /* ADC Common Init 
**********************************************************/
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
    ADC_CommonInitStructure.ADC_DMAAccessMode = 
ADC_DMAAccessMode_Disabled;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = 
ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);

    ADC_StructInit(&ADC_InitStructure);
    /* ADC1 Init 
****************************************************************/
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = 
ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_ExternalTrigConv = 
ADC_ExternalTrigConv_T1_CC1;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel7 configuration 
*************************************/
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, 
ADC_SampleTime_15Cycles);

    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
}
#2867941
Lesenswert?

Wilhelm Ferkes schrieb:
> Möglicherweise ein elektrisches Problem, was aber keines ist:
> Eingangsimpedanz/Anpassung nicht beachtet? Sowas sollte aber im
> Datenblatt bzw. User Manual stehen.

So was dachte ich auch gerade. Der Eingangswiderstand der ADCs ist 
ziemlich klein, für einen analogen Beschleunigungssensor musste ich auch 
einen simplen Impedanzwandler vorschalten.

Wie groß hattest du den Spannungsteiler dimensioniert?
#2867947
Lesenswert?

Hab im Datenblatt und in den Application notes was gesucht was darauf 
hindeuted das hier unbedingt ein Impedanzwandler verwendet werden muss.

Die Eingangsinpedanz ist soweit ich das grade im Kopf hab 50kOhm.

Naja werde mal nen Impedanzwandler bauen für die Anwendung wo ich 
einsetzen wollte fällt er dann eher weg, da ist nicht so viel Platz auf 
der Platine.

Naja doch wieder was von NXP verwenden, da hatte ich solche Probleme 
nicht, deswegen bin ich mal hier einfach auch davon ausgegangen. Naja 
großer Fehler.

Hatte mehrere Potis in mehreren Stellungen probiert von einigen MegaOhm 
bis zu nem 10k Poti.
Gast #2867949
Lesenswert?

Michael Frangenberg schrieb:

> Wie groß hattest du den Spannungsteiler dimensioniert?

Falls du mich meinst, nicht den TO:

Ich kenne den STM32F4 noch nicht, ist aber in Planung. Was ich kenne, 
ist z.B. den 80C515, dort sollte man 5k nicht unterschreiten, bzw. den 
Eingang mit Kondensatoren abstützen. Oder eben einen Impedanzwandler 
vorschalten, S&H-Glieder, was auch immer.

Wer viel mißt, mißt Mist. ;-)



Stefan O. schrieb:

> Naja werde mal nen Impedanzwandler bauen

Versuchs mal auf einfache Weise mit einem Stützkondensator am 
ADC-Eingang. Bei zeitlich geringer Samplingrate könnte sowas schon 
reichen.
Gast #2870998
Lesenswert?

> ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1,
> ADC_SampleTime_15Cycles);

Mach mal die SampleTime größer!

Ich hatte das Problem, dass sich bei einer kleinen SampleTime 
Nachbarkanäle ausgewirkt haben. Nachdem ich die SampleTime größer 
gemacht habe verschwand der Effekt.
Gast #2871039
Lesenswert?

Stefan O. schrieb:
> Hab im Datenblatt und in den Application notes was gesucht was darauf
> hindeuted das hier unbedingt ein Impedanzwandler verwendet werden muss.
>
> Die Eingangsinpedanz ist soweit ich das grade im Kopf hab 50kOhm.

Die im Datenblatt genannten 50kOhm sind der Maximalwert der ext. Quelle, 
wenn ich es richtig verstehe. Die ADC-Eingangsimpedanz müßte demnach im 
Bereich >100MOhm liegen.
Ohne Dein Programm näher angesehen zu haben: ist vielleicht ein Pullup 
aktiviert?
#2872170
Lesenswert?

m.n. schrieb:
> Stefan O. schrieb:
>> Hab im Datenblatt und in den Application notes was gesucht was darauf
>> hindeuted das hier unbedingt ein Impedanzwandler verwendet werden muss.
>>
>> Die Eingangsinpedanz ist soweit ich das grade im Kopf hab 50kOhm.
>
> Die im Datenblatt genannten 50kOhm sind der Maximalwert der ext. Quelle,
> wenn ich es richtig verstehe. Die ADC-Eingangsimpedanz müßte demnach im
> Bereich >100MOhm liegen.
> Ohne Dein Programm näher angesehen zu haben: ist vielleicht ein Pullup
> aktiviert?

Es sind keine Pullups drann die sind alle auf nopull, das ist immer das 
erste was ich prüfe wenn irgendwas an einem ADC nicht geht ;-) Ist ja 
ein beliebter Fehler.

Habe auch mit allen Sampletimes rumprobiert aber kein befriedigendes 
Ergebnis erhalten.

Mit den Opamps klappt es einwandfrei!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren