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); }
Das Problem tritt auch auf wenn ich einen Anderen ADC des STM32F4 oder andere Pins als ADC Eingang verwende, ist allso immer vorhanden.
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?
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.
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?
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.
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.
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.
> 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.
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?
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.