Hallo,
ich bin jetzt schon seit Tagen dabei, den ADC meines STM32f103c8t6 zum
Laufen zu bekommen. Allerdings zeigt sich dabei ein sehr eigenartiges
Verhalten: Wenn ich 0V anlege, werden Werte zwischen 1949 und 1951
angezeigt. Zum Testen habe ich einfach nen 10k Poti an PA3
angeschlossen, über den ich die Spannung langsam bis 3v3 hoch drehe. Bis
ca zur Hälfte bleibt der Wert bei ~1950, geht dann runter auf 1599 und
dann schließlich doch noch rauf bis 4095. Abwärts das gleiche Spiel.
Hier mein Code:
Mike R. schrieb:> Auf den ersten Blick sehe ich hier keinen Fehler.>> Wie sieht denn die Beschaltung deines Controllers aus?
Da hängt jetzt noch einiges anders Zeug dran, was aber eher unwichtig
ist. Es sollen Akkus angeschlossen werden und Ströme und Spannungen
gemessen werden. PA1 soll zur Strommessung dienen, deshalb ist n ACS712
angeschlossen plus n OPV um das Signal in nen vernünftigen Messbereich
des ADC zu bringen. PA2 soll die Spannung über nen Spannungsteiler
messen. PA3 ist original nicht beschaltet, aber da der Pin auf der Ecke
ist, konnte ich recht einfach ne Strippe anlöten, die zum Poti führt,
der eigentlich zur Kontrasteinstellung des Displays gedacht ist. Das
Display ist aktuell nicht drauf, nur die Stiftleiste.
An allen drei Pins das gleiche Verhalten. Ob ich die entsprechenden
Spannungen also direkt über das Poti anlege oder an die anderen Pins
durch die sonstige Beschaltung macht keinen Unterschied.
- In dem Schaltplan ist nur ein 100nF für die 3 VDD Leitungen zusehen,
das sollen doch bestimmt mal 3 werden?
- Bei I2C fehlen die Pullups.
- Poti kaputt?
An Pin9 fehlen 1µF und 100nF.
Pete K. schrieb:> - In dem Schaltplan ist nur ein 100nF für die 3 VDD Leitungen> zusehen,> das sollen doch bestimmt mal 3 werden?> - Bei I2C fehlen die Pullups.> - Poti kaputt?>> An Pin9 fehlen 1µF und 100nF.
Poti ist nicht kaputt. Der Fehler tritt ja auch auf wenn die Spannungen
anders eingebracht werden.
I2C hat 4k7 Pullups, wird davon abgesehen aber auch nicht für den ADC
benötigt.
was die fehlenden Kondensatoren angeht, können die tatsächlich dafür
verantwortlich sein? Es ist ja kein kleiner Messfehler der durch ne
instabile Referenzspannung zustande kommt.
Hast Du ein anderes Board, z.B. ein Evalboard, zur Verfügung?
Wie verhält sich Dein Code dort.
Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?
thnallgzt schrieb:> was die fehlenden Kondensatoren angeht, können die tatsächlich dafür> verantwortlich sein? Es ist ja kein kleiner Messfehler der durch ne> instabile Referenzspannung zustande kommt.
Nein, die sind bestimmt überflüssig. Das hat der Hersteller nur in das
Datenblatt geschrieben, um die Seiten voll zu bekommen. :-)
Wenn du jemals mehr als einen Kanal messen willst, ist es evtl.
sinnvoll, das gleich mit DMA Controller zu machen.
Hier mal ein Codeschnipsel, wie ich 4 Kanäle im Hintergrund abtaste:
1
/* Init the ADC converter to free-run with 4 channels
/* Check the end of ADC1 reset calibration register */
61
while(ADC_GetResetCalibrationStatus(ADC1));
62
/* Start ADC1 calibration */
63
ADC_StartCalibration(ADC1);
64
/* Check the end of ADC1 calibration */
65
while(ADC_GetCalibrationStatus(ADC1));
66
67
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
68
Delay(200);
69
}
Die Pins werden natürlich woanders auf AIN konfiguriert. M.E. mit dem
STM32F103 auf dem VL Discovery zeigte auch, das ADC Kanal 0 praktisch
immer sehr gestörte Werte hatte, weshalb ich ihn auf 'spare' gesetzt
habe.
Marcus H. schrieb:> Hast Du ein anderes Board, z.B. ein Evalboard, zur Verfügung?> Wie verhält sich Dein Code dort.>> Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?
Hab leider kein anderes Board.
Schaden tun sie sicher nicht :D
Pete K. schrieb:> thnallgzt schrieb:>> was die fehlenden Kondensatoren angeht, können die tatsächlich dafür>> verantwortlich sein? Es ist ja kein kleiner Messfehler der durch ne>> instabile Referenzspannung zustande kommt.>> Nein, die sind bestimmt überflüssig. Das hat der Hersteller nur in das> Datenblatt geschrieben, um die Seiten voll zu bekommen. :-)
Die sind i.d.R dazu da, kurzfristige Spannungsschwankungen zu
eliminieren. Das Fehlerbild hier sieht für mich aber nicht danach aus.
Sonst müssten die Messungen über den gesamten Messbereich Schwankungen
aufweisen.
Auf die letztendliche Genauigkeit der Werte bin ich noch gar nicht
eingegangen, habe bisher lediglich "ungefähr" überprüft ob die ADC-Werte
zu den angelegten Spannungen passen. Da kann natürlich immer noch ein
Fehler aufgrund der fehlenden Caps drin sein, das will ich gar nicht
bestreiten. Aber Das Verhalten zwischen 0 und 1,3V (der angezeigte Wert
1599) ist doch ein bisschen heftiger falsch.
Die anderen Komponenten, I2C, SPI, PWM, RTC usw funktionieren ja
einwandfrei...
Hast Du mal die anliegende Spannung für den ADC direkt am PIN des STM32
gemessen? Passt das zu der Eingangsgröße?
Oder werden 1,3V gemessen obwohl am PIN 1,6V anliegen? Das ist mir noch
nicht ganz klar. Vielleicht liegt der Fehler ja auch in der
Vorbeschaltung des ADC.
Marcus H. schrieb:> thnallgzt schrieb:>>> Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?>> Schaden tun sie sicher nicht :D> AN2867 / AN3371
Wie auch immer, die RTC funktioniert doch.
Pete K. schrieb:> Hast Du mal die anliegende Spannung für den ADC direkt am PIN des> STM32> gemessen? Passt das zu der Eingangsgröße?>> Oder werden 1,3V gemessen obwohl am PIN 1,6V anliegen? Das ist mir noch> nicht ganz klar. Vielleicht liegt der Fehler ja auch in der> Vorbeschaltung des ADC.
Ich hab die Spannung direkt am Pin gemessen.
OV am Pin -> 1951 im Register ≙ 1,57V
Spannung steigt, Wert im Register fällt bis
1,28V am Pin -> 1599 im Register ≙ 1,28V, ab da bis 3,3V alles wie es
sein soll.
- Welche IDE? Ggf. Testprojekt posten.
- GPIO_InitStructure komplett vorbelegen - GPIO_StructInit
- setze den ADC mal auf freilaufend und schau Dir das Wandlungsergebnis
direkt in der main-loop an
Ist ein paar Jahre her, dass ich das VL-Disco in Betrieb hatte.
Dein Code läuft ohne wesentliche Änderung in der u.s. Form.
Ein 1k Poti hängt am PA1. Die Werte laufen zwischen 0..3V3 sauber von
0..4095.
IDE ist CooCox
Ich habe es jetzt nochmal direkt in der main probiert, selbes Ergebnis.
Dann habe ich mal den GPIOB Port probiert, Genau genommen PB1
(ADC_Channel9), auch nicht anders. Selbst, wenn man die Initialisierung
der GPIO Pins gänzlich weg lässt bleibt das Verhalten dasselbe.
Pete K. schrieb:> Doch Hardwareproblem?
Also der µC selbst defekt?
Und da es quasi unmöglich ist den zu tauschen muss gleich das ganze
Board neu. Dann können auch gleich die restlichen Caps eingebaut werden.
Claudio H. schrieb:> AIN0 hat einen internen Defekt.> Dies steht im Errata.
Ich benutze aber auch andere Pins.
Hallo,
ich habe gestern genau eine solche Routine für einen STM32F103C8t&
codiert für AIN0 (Baujahr 2015, Week 47)und sie läuft einwandfrei. Ohne
das jetzt alles durchzulesen hier mein Code, der einwandfrei läuft. Wie
ich sehe wurde einiges von dem STM32 Genius "clive1" kopiert aus
"stackoverflow".... schreiben wohl alle vom gleichen ab :-)
Pete K. schrieb:> @Christian: Wie sieht bei Dir die Hardwarebeschaltung an Pin9 aus> (Kondis)?
Pin 9 ist PC1 bei 64Pinner. Was soll da sein? Der ist nicht rausgeführt.
Ich habe ein fertiges Minimum DevBoard für 7 Euro.
Habe jetzt ein Evaluation Board (eins auch China von LC glaub ich). Beim
Vorbenutzer funktionierte es. Da sollte die Beschaltund dex STM ja in
Ordnung sein bzgl. Caps etc.
Ich habe jetzt also ein neues Projekt in Coocox angelegt, ohne
Schnickschnack und sonstwelche includes. Habe meinen Code, den von
Christian J. und den von Marcus H. probiert. Alles dasselbe. Exakt das
Fehlerbild wie schon immer. Ich denke mal, dass ein Hardwaredefekt wegen
des Eval Boards trotzdem ausgeschlossen werden kann.
Gut, dann glauben wir Dir mal, dass die Hardware hinreichend verifiziert
wurde. Selbst das Poti hast Du getestet.
Es gibt auch Hinweise, dass das Codeschnitzel passt.
Dann geht es mit dem restlichen Projekt weiter, sprich der
Systeminitialisierung. Taktsystem etc...
Hast Du eine RS232 angeschlossen, oder sonstige Nachweise, dass Dein
Systemtakt richtig parametriert ist?
Ich meine, wir könnten Dir auch ein CooCox "Hello World" hochladen, aber
das willst Du sicher nicht.
Magst Du vielleicht Dein Projekt irgendwo reinstellen? Nach einem
"clean" sind das ja nur noch wenige 100kB.
Ich meine mich daran zu erinnern, dass ich den I2C Takt mal aufm Logic
Analyzer richtig abgelesen habe.
Aber ich kann nachher auch nochmal ne PWM testen um sicher zu gehen.
Hier der Projektordner: http://thnallgzt.no-ip.org/misc/testprojekt.zip
Hi :)
Bitte Schaltplan vom Evalboard.
Bisher kenn ich nichtmal Deinen Quarztakt.
Im Projekt steht HSE_VALUE auf 8MHz, auf Deinem eingänglichen
Schaltplanfragment ist nur der zu langsam laufende Uhrenquarz zu sehen,
der Systemquarztakt ist durchgesägt...
Sooo,
ich habe Deinen Makrovirus mal bei mir ins CooCox gehängt.
Testplattform STM32VLDISCOVERY, d.h STM32F100RB.
Kleine Änderungen:
- printf-reingehängt
- ST-Link auf 300kbps runtergedreht
Wesentliches Ergebnis - es läuft wie erwartet.
Sowohl mein Code, siehe oben, als auch Dein Code.
Wenn Du Dich beim Forum anmeldest, schicke ich Dir das Projekt gerne als
PM.
Grüße,
Marcus
mit nem passenden Teiler versehen um auf wieder 72MHz zu kommen.
Ich den ST-Link hab ich jetzt auch auf 300kbps geändert, natürlich ohne
Erfolg.
Ich versuche mal, den Schaltplan vom Board gleich anzuhängen.
Guten Morgen,
siehe PM.
Mein Testprojekt verwendet zufällig dieselben USART-Pins wie das
Eval-Board - spätestens dann sehen wir ob die Takte passen.
Auf dem 8MHz Evalboard sollte mein Projekt einfach laufen.
Grüße,
Marcus
Kommando zurück! Ich hab keine Ahnung mehr, was ich gestern veranstaltet
habe. Aber jetzt funktioniert mein Testprojekt auf dem Eval Board wie es
soll. Kann sein, dass der Poti nicht richtig drauf saß. Jedenfalls hab
ich auf dem Evalboard wieder PA4 für den Poti genommen, alles sauber.
Den Takt ungestellt (laut gemessener Frequenz der PWM passt es auch) und
direkt an meiner Platine probiert. Der Fehler ist noch da.
Ich habs jetzt mehrfach geprüft, ob überall Masse ist wo welche sein
soll etc.
Es kann also davon ausgegangen werden, dass ich gestern Mist gebaut
habe, als ich gesagt habe, es liege nicht an der Hardware.
Markus P. schrieb:> Es kann also davon ausgegangen werden, dass ich gestern Mist gebaut> habe, als ich gesagt habe, es liege nicht an der Hardware.
Danke Dir für die offene Rückmeldung.
Das hatte der Hardwerker im Gefühl, als er schrieb:
"Gut, dann glauben wir Dir mal, dass die Hardware hinreichend
verifiziert
wurde. Selbst das Poti hast Du getestet." ;)
War zwar etwas Arbeit, aber das ist mal wieder ein Paradebeispiel dafür,
dass embedded Debugging nach Checkliste auf der Leiterplatte losgeht.
Das Problemchen auf Deiner Hardware findest Du auch noch. :D
Markus P. schrieb:> Also wieder die Angstdiagnose: Controller defekt?
LQFP48 gehäuse? da sollte sich ein einzelner AIN pin mit einem feinen
lötkolben + schraubenzieher abheben lassen, dann kann man den pin direkt
auf masse legen, und so schaun ob der µc was hat.
Robert S. schrieb:> Markus P. schrieb:>> Also wieder die Angstdiagnose: Controller defekt?>> LQFP48 gehäuse? da sollte sich ein einzelner AIN pin mit einem feinen> lötkolben + schraubenzieher abheben lassen, dann kann man den pin direkt> auf masse legen, und so schaun ob der µc was hat.
Das gleiche, als wenn er über den Poti auf Masse liegt.
Ich wechsle dann morgen mal den Controller und hoffe, dass wenigstens
das einigermaßen unfallfrei klappt.