Forum: Mikrocontroller und Digitale Elektronik STM32F4 ADC Problem


von Stefan O. (avrstefan)


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);
}

von Stefan O. (avrstefan)


Lesenswert?

Das Problem tritt auch auf wenn ich einen Anderen ADC des STM32F4 oder 
andere Pins als ADC Eingang verwende, ist allso immer vorhanden.

von Stefan O. (avrstefan)


Lesenswert?

Habe noch ein STM32VL Discovery und da habe ich das gleiche Problem! Was 
ist den hier faul? hat niemand eine Idee?
Oder könnte mir mal jemand seinen Initialisierungs Code für den ADC 
schicken?

von Wilhelm F. (Gast)


Lesenswert?

Stefan O. schrieb:

> Woran kann das liegen?

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

von Michael F. (startrekmichi)


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?

von Stefan O. (avrstefan)


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.

von Wilhelm F. (Gast)


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.

von Stefan O. (avrstefan)


Lesenswert?

Habe das ganze jetzt mit dem Opamp als impedanzwandler gemacht. Den 
wollte ich ja eigentlich von vornherein umgehen. Naja hat nix geholfen 
jetzt muss ich noch auf meiner Platine ein passt opamps unterbringen.

von STM-ADC-EXPERTE (Gast)


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.

von m.n. (Gast)


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?

von Stefan O. (avrstefan)


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!

von m.n. (Gast)


Lesenswert?

Stefan O. schrieb:
> Habe das ganze jetzt mit dem Opamp als impedanzwandler gemacht. Den
> wollte ich ja eigentlich von vornherein umgehen. Naja hat nix geholfen

Da verstehe einer, wie das gemeint sein soll.

von Michael F. (startrekmichi)


Lesenswert?

Stefan O. schrieb:
> Mit den Opamps klappt es einwandfrei!

Auf Seite 126 im datasheet des STM32F407 ist die Formel für die 
Eingangsimpedanz angegeben. Mit deinen Einstellungen aus dem Code von 
oben komme ich auf 11,8kOhm, sofern dein APB2 mit 84MHz läuft.

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.