Im Rahmen der Erweiterung meiner "Steckbretthelferleins" wollte ich ein
weiteres Modul hinzufügen das eine Art "Voltmeter" fürs Steckbrett ist.
Mit einem STM32F030 hab ich das schon auf einem Steckbrett realisiert
und funktioniert.
Jetzt dachte ich mir: Gut, das müßte ja auch mit einem STM8S103
funktionieren (mit 10 statt 12 Bit Auflösung könnte ich gut leben). Nach
einem schnellen Aufbau dachte ich schon, ich wäre am Ziel, aber nach
einer Überprüfung der Genauigkeit war ich ernüchtert !
Also allen möglichen Ballast weggeworfen, nur die allernötigste Hardware
(ohne Eingangsspannungsteiler), Software auf Mindestmaß reduziert.
Ergebnis: Ungenügende Genauigkeit.
Minimalschaltung und Minimalprogramm im Anhang, verwendeter Compiler
SDCC v3.6.
Problem:
Unterhalb von 0,2V Eingangsspannung zuckt der ADC mit keinem einzigen
Bit (insgesamt mit 3 verschiedenen STM8S103 und einem STM8S003
getestet).
Von 0 .. 0,2V liefert der ADC den Wert 0. Danach nähert er sich dem
wirklichen Spannungswert immer mehr an. Bei einer Eingangsspanunng von
2,0V gibt es eine Abweichung von ca. 75mV. Erst die maximale
Eingangsspannung von 3,3V wird richtig angegeben.
Das Referenzvoltmeter ist ein Fluke 45 (im Januar diesen Jahres frisch
kalibriert).
Gerade im Bereich von 0,0 bis 1,0V bräuchte ich es genauer, ansonsten
macht ein Eingangsspannungsteiler keinen Sinn.
Das Auslesen des ADC geschieht mit folgendem Code:
Ralph S. schrieb:> oder ist es sinnvoller, mein> Steckbrettvoltmeter dann doch eher mit einem STM32F030 zu realisieren?
Da der Hardware-USB hat, könntest du dir da auch den CH340G sparen und
das Helferlein noch kleiner bauen.
Dr. Sommer schrieb:> Da der Hardware-USB hat, könntest du dir da auch den CH340G sparen und> das Helferlein noch kleiner bauen.
Der CH340 ist hier nur zum Überprüfen, das Helferlein wird ein OLED
128x64 Display haben und keine serielle Schnittstelle.
pegel schrieb:> Es gibt eine Appnote dazu. Kennst du die?>> http://www.st.com/resource/en/application_note/cd00186359.pdf
Das schau ich mir jetzt gerade im Moment an...
Offset and gain errors can easily be calibrated by the application firmware. First, apply zero
2
volts to the ADC input and perform a conversion, then the conversion result represents the
3
zero offset error. Then perform a gain adjustment. A subsequent offset error calibration may
4
be required. A useful method for offset and gain calibration is the least square method
5
(which calculates the smallest error in all the used range)
Wenn es nur mal so "easily" wäre ! Das kann man dann kalibrieren, wenn
anstelle von 0 Volt eine Spannung "detektiert" wird und man die dann
schlicht abziehen würde. Das funktioniert aber nicht, wenn der ADC
schlicht schon gar nicht loslegt und mittels der Referenz kann man an
diesem Controller auch nicht "spielen" weil die Referenzanschlüsse nicht
aufgelegt sind.
Oder (was ich schon eher glaube) ich bin nur zu doof die App-Note
richtig zu lesen !
Das stimmt so nicht wirklich. Also mindestens die Kommentare sind
falsch.
Ich lese das Datenblatt so, daß der Default left-aligned ist
(ADC_CR2:ALIGN = 0). Die 8 MSB stehen dann in ADC_DRH und die beiden LSB
in ADC_DRL. Dann ist das, was du programmiert hast, im Prinzip richtig,
vorausgesetzt, der Compiler macht das Linksschieben auf allen 16 Bit und
nicht nur auf den 8 Bit aus ADC_DRH. Im Zweifel würde ich das explizit
formulieren:
... schön wärs gewesen wenn ich nur n dummen Schiebefehler gemacht hab.
Der Kommentar ist leider falsch (aber das Schieben richtig). Muß heißen,
die oberen 2 Bits und die unteren 8 Bits (des 10-Bit Wertes).
Wenn der Compiler hier nicht richtig casten würde, dann würde ich nie
einen ADC - Result von 1023 haben können (aber ich habs dennoch auch mit
der alternativen Formulierung versucht, gleiches Problem).
Hab das jetzt erst einmal auf die Seite gelegt und werkel parallel dazu
am gleichen Helferlein jedoch mit STM32 ... (natürlich wird mich das
hier jedoch nicht loslassen).
Hallo,
ich kenn das Datenblatt nicht, aber vielleicht liegt es an ADC_DRL.
Was steht denn in den oberen bits von ADC_DRL ?
vielleicht die oberen bits von ADC_DRL vorher explizit nullen
adcvalue = ADC_DRH;
adcvalue <<= 2;
adcvalue += (ADC_DRL & 3);
Das Zusammenschieben des Wertes ist nicht das Problem:
Bis 0,2V liefert der ADC den Wert 0 !!!!
Das zeigt auch die (überflüssiger Weisse gemachte) getrennte Ausgabe von
ADC_DRH und ADC_DRL.
Bis 0,2V steht in den Registern 0 drin !
Hey.... das werde ich doch glatt ausprobieren, allerdings wohl nach
Weihnachten, die Partnerin ist da und wenn ich jetzt das Elektronikzeugs
wieder auspacke, dann bekommt sie einen Anfall.
lach, sie sagt immer "Was du nur an den scharzen Käferlein findest,
die eh kein Mensch mehr sehen kann".
Schmunzeln muss, ich geh mal schwer davon aus, dass ich etwas falsch
mache, auf einem STM8S105 ist es auch unauffällig. Ich werde nach
Weihnachten den Tip von Pic-Freund ausprobieren und ich werde eine
Prototypenplatine ätzen, vor allem mit sauberen Masseleitungen und nicht
auf dem Steckbrett. Wenn das dann nicht hilft, gebe ich auf und
realisiere das endgültig mit einem STM32F030 (vor allem funktioniert
hier schon die komplette Software und ist sozusagen fertig).