Bascom BASCOM-Programm portieren

Pirx

Mitglied
15. Aug. 2009
305
14
18
Möckern
Sprachen
  1. Assembler
Hallo zusammen,

zwecks Nachbau dieses kleinen Projekts (mit Programmierung in ASM mit Änderungen) :
http://www.elektronik-labor.de/AVR/Millivolt.html

brauche ich mal eure Hilfe.

Die Einstellung - $crystal = 1200000 - bedeutet interner RC-Osz. 9,6 MHz / 8 , richtig ?

Wie lange dauert ein Schleifendurchlauf der Do ... Loop Schleife ?
Wenn ich das richtig sehe, bleibt das Programm permanent in dieser Schleife, d.h. diese wird immer wieder durchlaufen. Und ich vermute, dass das Timing für die Funktion des Ganzen nicht unwichtig ist.

Gruß
Pirx
 
Hallo Prix!

Ja, das siehst du alles richtig.

Der Systemtakt beträgt 1,2MHz (also 9,6MHz mit Teiler 8).
Die DO-LOOP Schleife ist quasi das Hauptprogramm bzw. die Hauptarbeitsschleife, die auch nicht durch Subroutinen verlassen wird.


Das Schwierige ist die Frage nach der Dauer der DO-LOOP Schleife. :hmmmm:
Dazu müsste ich das ganze Programm erst speichern und durch den Simulator jagen, denn welche Anweisungen wieviele Takte benötigt kann ich wirklich nicht sagen.
Allerdings werden die beiden GETADC() (zum Abfragen der ADC-Werte) und das PRINT (mit 9600 baud) wohl die meiste Zeit in der Schleife benötigen. :wink:


Grüße,
Cassio
 
Hallo zusammen,

GETADC wird ja in der Schleife sehr oft abgearbeitet (gute 2.800mal), die ADC Wandlung wird also die Durchlaufzeit der do-loop Schleife und damit die Periodendauer der Ausgabe des Ergebnisses über den UART am ehesten bestimmen.

Man könnte es eigentlich ziemlich genau ermitteln, allerdings weiß ich nicht, was Bascom bei "Prescaler = Auto" tatsächlich für einen Prescaler für den ADC-Takt verwendet. Ich meine, es sind beim ADC Modul des AVR 13 Clocks für eine Wandlung, wenn der der ADC bereits aktiviert ist.

Dirk :ciao:
 
Hi Pirx,
...
Wie lange dauert ein Schleifendurchlauf der Do ... Loop Schleife ?
...
Ich sehe 3 Wege:
  • Hardware-Messung: Bascom Programm in einen Controller brennen, mit'nem LA die serielle Ausgabe messen
  • Software I: mit Bascom das Programm simulieren lassen (da weiß ich aber nicht, ob erstens das ADC-Timing korrekt simuliert wird (btw getadc nutzt Einzelmessungen siehe Config ADC), und 2tens bei der Ausgabe geschummelt wird (da nicht echt übertragen))
  • Software II: Das Bascom Programm reassemblieren, und das AVRStudio simulieren lassen (alternativ kannste da ja dann auch rechnen)
...
Und ich vermute, dass das Timing für die Funktion des Ganzen nicht unwichtig ist.
...
Ja, da die Mittelspannung bei jedem Schleifendurchlauf (und vor jeder Messung) neu bestimmt wird. Aus der Schleifenzeit (und der der 64 Messungen) folgt also das Frequenzfenster, in dem das ganze korrekte Werte liefert.
Aber da kann Dino mehr zu sagen, denk ich
 
Hallo zusammen,

erstmal danke für eure Antworten.

Der Autor spricht ja von 50 Hz, bis zu denen das recht genaue Werte liefern soll. Von daher gehe ich davon aus, dass ein Meßzyklus mindestens so lange dauern muss, wie eine 50Hz Periode.

Die Dauer einer ADC-Messung ist ja hardwarebestimmt und daher in ASM nicht kürzer als in BASCOM. Wenn die wesentlich für die Länge des Meßzyklus verantwortlich ist, dürfte die Dauer Hauptschleife in ASM programmiert kaum anders ausfallen als in BASCOM.

Dann werde ich das jetzt einfach mal programmieren. Mal sehen, was dabei herauskommt.

Gruß
Pirx
 
Meinem Verständnis nach (habe von Wechselstrom usw nicht wirklich Ahnung) müßten es sogar deutlich mehr als die eine Periode sein, da die 64 Messungen per Mittelwertbildung die Nulllinie bilden.

Zu den ADConversions: klar, das hat nichts mit der Sprache zu tun - was Du nicht weißt ist, welchen Prescaler "Auto" festlegt (ich vermute, daß möglichst auf die empfohlene 200kHz ADC-Clock eingestellt wird.)
Bei "Config Adc [...]" wird außerdem auf SingleConversions festgelegt, wenn ich mich recht erinner, braucht eine Wandlung dann 25 ADC-Clock-Takte. Im "Dauerlauf" würde jede weitere(!) Wandlung dann 13 Takte benötigen.

Getadc startet also eine SingleConversion (25 ADC-Takte), und wartet (Warteschleife) auf ADIF. Danach wird das Ergebnis (2Byte) in die Variable ins SRAM geschrieben, und ADIF gelöscht, klar. Danach die Rechnerei (sind aber alles 2Byte-Schiebereien und so, also nix komplexeres...).

In ASM könntest Du (auch ohne IRQs) wie gesagt die Schleifenzeiten optimieren (bzw verkürzen), indem Du während einer Wandlung irgendwelchen Code ausführen läßt (bevor ADIF gepollt wird (Warteschleife)). Das geht in Bascom natürlich auch, aber nicht mit Getadc - man kann ja auch direkt über die I/O-Register den ADC steuern...

Dino!...
kannst Du uns mal was zum Thema Mittelwert, Nulllinie vs. Frequenzfenster sagen? Davon hab ICH nämlich keine rechte Ahnung...

Nachtrag:
Hmm...
Der Tiny läuft laut Programm mit 1,2MHz (interner Osci @ 9,6/8 ? ) - Bascom simuliert einen Schleifendurchlauf mit 392,0525ms.
Die 64 Samples, die die Nullinie ermitteln werden im Abstand von 0,0608333...ms gemessen - über 3,91ms hinweg.

Wie paßt das jetzt zu den möglichen 50Hz? Ich stelle mir jetzt mal eine Sinuskurve mit 50Hz (=20ms Periode) vor. Durch die Gesamtschleifenzeit (nicht vielfaches von 20ms) wandert meine Nulllinienfestlegung also mit jedem neuen Durchlauf durch die Periode. Insbesondere kann sie also mal im positiven Extremum liegen, mal im negativen.

Und dann hab ich noch'ne Frage zu der angeblichen Steigerung der Auflösung durch Mittelung mehrerer/vieler Messungen. Der ADC hat ja'ne Auflösung von Vref/1024 - bei 5V also ca 4,8mV. Da ändern doch auch mehrere Messungen nix dran. JEDE Einzelmessung wird durch ein vielfaches dieser 4,8mV approximiert. Mal in Gedanken ins dezimale übertragen:
Ich habe einen ADC, der ganzzahlige Ergebnisse liefert. An den lege ich 1,3 an. Wenn der das jetzt auswertet (rundet/abhackt?), bekomme ich also 1. Soweit klar.
Wenn ich jetzt 10 Messungen durchführe erhalte ich doch trotzdem zehnmal die 1, wo sollte denn da mal'ne 2 rauskommen, bei 1,3?
Wäre dann aufakkumuliert 10, und nach rechtsschieben/durch 10 teilen wieder die 1.
Wenn man die Referenz während der Messung durch 'ne Dreiecksfunktion(?) verschiebt (also von Vref-(4,8mV/2) bis Vref+(4,8mV/2) laufen läßt), könnte das mMn gehen, aber wenn zu messende Spannung und Referenz konstant sind, sind doch auch die Ergebnisse der Einzelmessungen konstant...

Was fehlt mir hier?
 
Ich fürchte, alle Fragen kann ich auch (noch) nicht beantworten.

Der Tiny läuft laut Programm mit 1,2MHz (interner Osci @ 9,6/8 ? ) - Bascom simuliert einen Schleifendurchlauf mit 392,0525ms.
Die 64 Samples, die die Nullinie ermitteln werden im Abstand von 0,0608333...ms gemessen - über 3,91ms hinweg.

Wie paßt das jetzt zu den möglichen 50Hz? Ich stelle mir jetzt mal eine Sinuskurve mit 50Hz (=20ms Periode) vor. Durch die Gesamtschleifenzeit (nicht vielfaches von 20ms) wandert meine Nulllinienfestlegung also mit jedem neuen Durchlauf durch die Periode. Insbesondere kann sie also mal im positiven Extremum liegen, mal im negativen.

Ein Schleifendurchlauf in 392 ms .. das sind knapp 20 50Hz Perioden. Der Fehler, der durch die letzte, nicht vollständige Periode entsteht, geht in den Mittelwert der 19 vollständigen Perioden ein und sollte sich daher in Grenzen halten.


Und dann hab ich noch'ne Frage zu der angeblichen Steigerung der Auflösung durch Mittelung mehrerer/vieler Messungen. Der ADC hat ja'ne Auflösung von Vref/1024 - bei 5V also ca 4,8mV. Da ändern doch auch mehrere Messungen nix dran. JEDE Einzelmessung wird durch ein vielfaches dieser 4,8mV approximiert. Mal in Gedanken ins dezimale übertragen:
Ich habe einen ADC, der ganzzahlige Ergebnisse liefert. An den lege ich 1,3 an. Wenn der das jetzt auswertet (rundet/abhackt?), bekomme ich also 1. Soweit klar.
Wenn ich jetzt 10 Messungen durchführe erhalte ich doch trotzdem zehnmal die 1, wo sollte denn da mal'ne 2 rauskommen, bei 1,3?
Wäre dann aufakkumuliert 10, und nach rechtsschieben/durch 10 teilen wieder die 1.
Wenn man die Referenz während der Messung durch 'ne Dreiecksfunktion(?) verschiebt (also von Vref-(4,8mV/2) bis Vref+(4,8mV/2) laufen läßt), könnte das mMn gehen, aber wenn zu messende Spannung und Referenz konstant sind, sind doch auch die Ergebnisse der Einzelmessungen konstant...

Was fehlt mir hier?

Das hat sich mir bislang auch noch nicht erschlossen. Zum einen wird von jeder Messung der Nullwert abgezogen, zum anderen ein Kunstgriff angewendet, um auf den Effektivwert der Wechselspannung zu kommen. Vielleicht hängt es damit zusammen. Ich werde mal versuchen, die Berechnungen des Programms in Excel nachzuvollziehen.

Gruß
Pirx
 
Ich glaub, ich habs... (also meinen Knoten mit dem Algorithmus den 50Hz usw... nicht das mit der Auflösung)
Es geht ja hier nicht um absolute Spannungen, sondern um die Amplitude der Wechselspannung. Da spielt theoretisch der Wert der Nulllinie keine Rolle - es werden die Absolutbeträge von Differenzen (Abständen) zur Nulllinie aufintegriert.

Der Rest (viele Messungen, Aufintegrierung, Schieben) dient einerseits der mysteriösen Erhöhung der Auflösung, andererseits werden damit Multiplikationen gespart (bzw Divisionen), oder zu Schiebeoperationen vereinfacht.
 
Nachden der Knoten gelöst ist, kann ich jetzt auch das Geheimnis der Auflösung lüften.

Vorweg : Die Rechnerei habe ich mal in Excel nachgebaut (inkl. Simulation von 2780 "Messwerten") und sie funktioniert und man bekommt Ergebnisse in mV Schritten.
Hier mal ein paar Beispiele - linke Spalte : Wechselspannung Spitzenwert | mittlere Spalte : Effektivwert nach offizieller Formel | rechte Spalte : Effektivwert ermittelt nach Tiny13-Algorithmus (alles in V)

2,000 ... 1,414 ... 1,417
2,001 ... 1,415 ... 1,418
2,002 ... 1,416 ... 1,418
2,003 ... 1,416 ... 1,419
2,004 ... 1,417 ... 1,420
2,005 ... 1,418 ... 1,420
2,006 ... 1,418 ... 1,421
2,007 ... 1,419 ... 1,422
2,008 ... 1,420 ... 1,423
2,009 ... 1,421 ... 1,423
2,010 ... 1,421 ... 1,424

1,000 ... 0,707 ... 0,708
1,001 ... 0,708 ... 0,709
1,002 ... 0,709 ... 0,710
1,003 ... 0,709 ... 0,710
1,004 ... 0,710 ... 0,711
1,005 ... 0,711 ... 0,712
1,006 ... 0,711 ... 0,712
1,007 ... 0,712 ... 0,713
1,008 ... 0,713 ... 0,714
1,009 ... 0,713 ... 0,715
1,010 ... 0,714 ... 0,715

Wie funktioniert das ? Sämtliche Messwerte werden vor der Aufsummierung mit 8 multipliziert. Dadurch gibt es nun zwischen den ursprünglichen Messwerten (im 5mV Raster) 8 Zwischenschritte, die infolge der Mittelwertbildung natürlich auch alle vorkommen können und rechnerisch ein Raster von 0,6 mV ergeben. Das ist allerdings nur rein rechnerisch - die sind nicht wirklich gemessen. Für mich sieht das nach einer Art Oversampling aus. Wie zuvor schon vermutet entsteht übrigens durch eine nicht vollständig erfasste Wechselspannungs-Periode ein Fehler, der umso höher ausfällt, je niedriger die Frequenz der Wechselspannung ist. Im schlimmsten Fall liegt der rechnerisch aber nur bei ein paar Prozent.


Ansonsten finde ich die Nummer genial. Den Effektivwert einer Wechselspannung auf diese Art und Weise zu ermitteln - darauf muss man erstmal kommen. Hut ab. :cool:


Was ich nicht getestet habe, sind höhere Frequenzen (in meinem Test waren es ca. 75 Hz). Aus den Zeitangaben von LodataC ergibt sich für die 2780 Messungen eine "Abtastrate" von ca. 7160 Hz. Wenn man nun Wechselspannungen mit höheren Frequenzen mißt (z.B. 20 kHz), ist deren Periodendauer kürzer als der Abstand zwischen zwei Messungen. Vermutlich klappt das trotzdem, weil sich auch über Perioden hinweg wieder ein statistisches Mittel ergibt. Wenn die Frequenz aber exakt der "Abtastrate" entspricht - oder Vielfachen davon, dürfte das zu interessanten Ergebnissen führen.
 
Nachden der Knoten gelöst ist, kann ich jetzt auch das Geheimnis der Auflösung lüften...
Also meiner Meinung nach kann das trotzdem nur gehen, wenn das zu messende Signal (oder eben die Referenz) sich irgendwie (möglichst gleichmäßig) ändert. Und zwar am besten, indem es während aller zu einem Wert gemittelten Sub-Samples einmal die tatsächliche Auflösung überstreicht (also hier ca 4,8mV).

Wenn ich 'ne Wechselspannung mit 1mV eff zu messen Versuche, dann ist die Amplitude der Schwingung doch definitiv kleiner als 4,8mV, oder nicht?
Somit sollte doch auch ein Fall eintreten können(!), wo alle Werte, die den Mittelwert bilden, exakt dasselbe Wandlungsergebnis erzielen (Weil sie eben aufgrund der geringen Amplitude hinreichend dicht am selben vielfachen von 4,8mV liegen - somit also bei der Subtraktion immer 0 rauskommt (sowohl bei der Nulllinie, als auch bei den Messungen wird ja derselbe Wert verachtfacht)), und deswegen eben nicht 1mV eff rauskommt.

Hast Du das mit derart kleinen Spannungen auch mal durchrechnen lassen?
von der oben verlinkten Seite schrieb:
Auch kleine Spannungen von 1 mVeff oder 2 mVeff stehen stabil.
Oder meint er damit: stabil = konstant 0 ?

Der Rest, also wie die Akkumulierung und Schieberei vom ADC-Result zum Ergebnis in mVeff führen ist mir wie gesagt klar geworden (ist ja dort beschrieben).
 
Also meiner Meinung nach kann das trotzdem nur gehen, wenn das zu messende Signal (oder eben die Referenz) sich irgendwie (möglichst gleichmäßig) ändert.
Die hier angewendete Formel für den Effektivwert passt nur für sinusförmige Wechselspannungen. Bei anderen Signalformen wird der ermittelte Wert nicht deren tatsächlichen Effektivwert entsprechen.

Wenn ich 'ne Wechselspannung mit 1mV eff zu messen Versuche, dann ist die Amplitude der Schwingung doch definitiv kleiner als 4,8mV, oder nicht?
Das sehe ich auch so. Sie führen auch in meiner Excel-Simulation im Endergebnis zu Null. Spannungen unterhalb 4,8mV Spitzenwert kann man damit nicht messen.

... und deswegen eben nicht 1mV eff rauskommt.
Doch ich fürchte, das geht. Wie ich zuvor schon schrieb, sind die Zwischenwerte lediglich errechnet - praktisch Interpolationen zwischen Werten darunter und darüber. Wenn nun eine Sinusspannung z.B. 5 mV Spitzenwert hat, dann liegen deren Momentanwerte mal unter und mal über 4,8mV. Bei der AD-Wandlung führt das dann meist zum Wert Null (Momentanwert gerade < 4,8mV) und in wenigen Fällen zum Wert eins (Momentanwert gerade >= 4,8mV). Je nach dem Verhältnis von Nullen und Einsen, können nach deren Verachtfachfachung und Durchschnittbildung dann auch Werte von 1 ... 4mVeff in der Anzeige erscheinen. Inwieweit solche Werte realistisch sind, forsche ich jetzt aber nicht aus.
 
Aber wenn schon alle, vom ADC gemessenen Ergebnisse gleich sind, kommen trotzdem bei jede Differenzbildung Nullen raus. Wie gesagt: ich bin jetzt nicht sicher, ob mit dem Zitat wirklich gemeint ist, daß man eine (Sinus-)Spannung mit 1mVeff messen kann, oder ob bei einer Messung lediglich die 1mV-Stelle konstant bleibt (also die Anzeige da nicht flattert.
1mVeff sind 1mVeff*Wurzel(2)=1,41... mV Spitzenspannung, also 2,83...mV Spitze-Spitze, also definitiv kleiner als 4,8...mV.
Das Signal wird über einen Spannungsteiler um die halbe Versorgungsspannung (5000mV) angehoben.
Damit liegen alle(!) Meßwerte in einem 1,41...mV breitem Schlauch um 2500mV, also von 2498,58...mV bis 2501,41...mV
Für die Untergrenze ermittelt der ADC 511,2106, für den Obergrenze 511,7893.
Da der ADC aber nur ganzzahlig arbeitet, sind das überall 511.
 
Was genau mit dem Zitat gemeint ist, weiß nur dessen Autor. Mit der Schaltung 1mVeff real messen, ist m.E. nicht möglich. Real messen kann man nur, was die Hardware technisch hergibt (ca. 5mV Schritte). Alle Werte dazwischen sind interpoliert.
 
Hallo zusammen,

ich möchte mal rückmelden, was daraus geworden ist.

Das Portieren des BASCOM-Programms hat problemlos geklappt (Quellcode im Anhang). Die Abarbeitung des Messzyklus dauert ca. 300 ms. Ich habe ihn mit einer kleinen Extra-Schleife nach jeder ADC-Abfrage auf ca. 500ms runtergebremst. Das macht die doch recht träge LCD-Anzeige besser ablesbar und dürfte sich zudem positiv auf die Genauigkeit der Messwerte bei niedrigen Frequenzen auswirken.

Nachdem das auf dem Steckbrett funktionierte, habe ich die Schaltung (siehe Anhang) auf einer kleinen Universalplatine aufgebaut (rot eingerahmt) :

Millivoltmeter.jpg

Der Stabi ist auf exakt 5,0 V justiert. Die mit den Messzyklen blinkende LED ist zur Vermeidung von Störungen vor dem Stabi angeschlossen. Der 9V-Anschluss ist für Betrieb mit einem 9V-Block gedacht. Bei Betrieb an 12V reduziert der 47 Ohm Widerstand die Verlustleistung am Stabi um etwa die Hälfte (wären ohne ca. 450 mW).

Da ich keine 470k greifbar habe, habe ich am Messeingang zunächst 1MOhm Widerstände verwendet. Das funktioniert prinziell auch - jedoch wird der Eingang dann so empfänglich für Einstreuungen, dass selbst bei kurzgeschlossenenem Eingang dann und wann auch mal 1 oder 2 mV angezeigt werden. Mit 270k ist das kein Thema mehr, selbst wenn die Brücke nicht geschlossen ist. Dann muss allerdings der Kondensator am Eingang vergrößert werden, da dieser und die Widerstände einen Hochpass bilden, dessen Grenzfrequenz sonst mit 0,1µ bei 75 Hz liegen würde.

Das Bild im Anhang zeigt mal ein paar, mit dem "heißen" Finger erzeugte Anzeigewerte. Wie man sieht, sind werden auch 1 und 2 mV angezeigt (obere Bilder) - das geht also tatsächlich. Bei elektrischem Kontakt zum Kabel, werden die Werte dann gleich deutlich höher (untere Bilder).

Um auch mal Wechselspannung zu messen, habe ich mal quick-and-dirty einen mobilen CD-Player mit Lineausgang als Quelle verwendet (mit Sinustönen von einer Audio-Test-CD). Frequenzen zwischen 100 Hz und 10 kHz ergaben stabile und auch im Pegel nahezu identische Anzeigewerte. Unterhalb 100 Hz und oberhalb 10 kHz jedoch waren die Werte instabil und teilweise auch mit gößeren Abweichungen.

Ich bin schon gespannt, wie das mit einem amtlichen Tongenerator aussieht. Den muss ich mir jetzt nur erstmal irgendwoher besorgen ...


Gruß
Pirx

Millivoltmeter - Anzeigewerte.jpgAnhang anzeigen Millivoltmeter.pdfAnhang anzeigen Millivoltmeter_ATT13.asm
 
Hallo zusammen,

nach Test mit einem amtlichen Tongenerator kann ich jetzt vermelden, was diese einfache Schaltung kann und was nicht.

Nach einigem Probieren habe ich den Test schließlich mit einem Pegel von 100 mV gemacht. Bei Pegeln in Richtung Vollaussteuerung genau sein kann schließlich jeder ...

Frequenzbereich von 75 Hz bis 10 kHz :
In diesem Bereich zeigen sich stabile Werte mit einer Abweichung gerade mal +/- 1 mV. Ausgenommen ist hier allerdings der Bereich 7770 - 7950 Hz, in dem der Wert extrem stark schwankt - offenbar die Folge der in diesem Bereich liegenden Samplingfrequenz. Minimale Schwankungen gibt es übrigens auch in einem kleinen Bereich um die halbe Samplingfrequenz, wobei die aber kaum der Rede wert sind.

< 75 Hz :
Unter 75 Hz wird der Meßwert immer instabiler. Bei 50 Hz schwankt er so stark (-5 ... +12 mV), dass man lediglich noch die Größenordnung der Wechselspannung erkennen kann.

10 kHz bis 18 kHz :
Hier zeigen sich leicht schwankende Werte mit Abweichungen zwischen -2 ... +8 mV. Ausnahme ist der Bereich zwischen 15,5 und 15,9 kHz (doppelte Samplingfrequenz) in dem der Wert wiederum sehr stark schwankt.

> 18 kHz :
Zwischen 18 kHz und 20 kHz geht's mit dem angezeigten Wert kontinuierlich abwärts (bei 20kHz ca. -20 mV). Wie es darüber aussieht, kann ich nicht sagen. Mein Generator ging nur bis 20 kHz.


andere Pegel :
Stichproben bei höheren (bis 1,7 V) und bei niedrigeren Pegeln bestätigen die Ergebnisse bei 100 mV. Getestet habe ich bis herunter zu 10 mV (in 10er Schritten) und die Ergebnisse haben selbst dort auf +/-1 mV gestimmt.


Weil ich ja auch neugierig bin, habe ich das Programm auch mal "full speed" laufen lassen, d.h. ohne meine extra eingefügte "Bremse". Die Frequenzbereiche verschieben sich alle etwas nach oben. Der Bereich mit stabilen Werten geht jetzt von 125 Hz ... 11 kHz und der stark schwankende Bereich verschiebt sich auf um die 8,5 kHz. In den Bereichen < 125 Hz und > 11 kHz sind die Wertschwankungen jetzt deutlich stärker. Insgesamt m.E. eher eine Verschlechterung der Performance.


Fazit
Im Bereich 75 Hz ... 7,7 kHz (mit Einschränkung bis 10 kHz) ist das Teil sehr gut zu gebrauchen. Ab 50 Hz und bis 18 kHz gibt es zumindest noch die Größenordnung der Wechselspannung wieder. Für diese super-simple Schaltung m.E. gar kein so schlechtes Ergebnis.


Gruß
Pirx
 
Hi Pirx,

hast Du Dir mal überlegt, die Samplingfrequenz deutlich(!) zu erhöhen, und ggf die Messzeit zu verlängern (dann wäre der Algorithmus anzupassen, klar)?
Aber eben erstmal nur die Samplingrate (und damit das "Fenster" nach oben schieben).
Theoretisch wären (Tiny13@9,6MHz) bis zu ca. 370kHz Samplingfrequenz einstellbar. (9600kHz/(2*13)). Interessant wäre zu verfolgen, wie die Genauigkeit bei mehr als der empfohlenen Samplingfrequenz (200kHz/(2*13)=7,7kHz) verfällt.
Ggf auch mit 'ner genauen Gleichspannung (kann das der Generator?)

Hmm... eigentlich müßte sich doch daraus auch 'ne Möglichkeit finden lassen, erstmal die Frequenz zu ermitteln, und dann für die eigentliche Spannungsmessung die optimale (mögliche) Samplingfrequenz auswählen.

Äh... also mit "full speed" meintest Du was? Also welche ADC-Clock?
 
Hallo zusammen,

ich hab mir bei den Ergebnissen überlegt ob es keine Möglichkeit gibt, die Samplingfrequenz per Zufall etwas um einen Mittelwert schwanken zu lassen. Dann sollten die Fehlmessungen nicht mehr so stark ausfallen.

Gruß
Dino
 
wobei ein Zufallsgenerator auch nicht trivial ist - insbesondere wenn der ADC schon im Dauerlauf beschäftigt ist...
 
Hallo zusammen,

na sowas, das sind ja sooo viele Fragen ...

... hast Du Dir mal überlegt, die Samplingfrequenz deutlich(!) zu erhöhen ...
Ja, das habe ich. Nach den Ergebnissen mit dieser Schaltung müßte sie idealerweise höher werden als die maximale Frequenz der zu messenden Wechselspannung. Wenn man also bis 20 kHz messen will, müßte die Samplingrate mindestens bei 21 ... 22 kHz liegen - ca. Faktor 3 schneller als jetzt. Dann liegt die Messzeit jedoch nur noch bei einem Drittel der jetzigen, mit der entsprechenden Auswirkung bei der Messung niedriger Frequenzen.

... und ggf die Messzeit zu verlängern ...
Bei dann wieder einer Verdreifachung der Zeit ergäbe sich die 3-fache Anzahl an Messwerten. Dann wäre freilich die ganze Rechnerei anzupassen, was aber ganz und gar nicht trivial ist, weil über die Kalkulation die Mittelwertbildung, die Effektivwertberechnung und die Umrechnung im mV (auf 5V Referenz) in einem Rutsch gemacht werden.

Hmm... eigentlich müßte sich doch daraus auch 'ne Möglichkeit finden lassen, erstmal die Frequenz zu ermitteln, und dann für die eigentliche Spannungsmessung die optimale (mögliche) Samplingfrequenz auswählen.
Sollte prinzipiell gehen. Man braucht dann nur mehrere Konfigurationen mit Samplingfrequenz / Messzeit und entsprechend angepasster Berechnung.

Äh... also mit "full speed" meintest Du was? Also welche ADC-Clock?
Bei meinem ASM-Programm ergibt sich rein durch die ADC-Wandlung und die Berechnungen eine Messzeit von ca. 300ms. Nachdem du in deiner Simulation 400ms ermittelt hattest, habe ich bei mir nach jeder Wandlung eine kleine Pause (Wartezeit) eingebaut, mit der sich eine Messzeit von 500ms ergibt. Wie der Test gezeigt hat , ist der Unterschied zwischen 300ms und 500ms Messzeit schon ein sehr deutlicher. Ich schätze mal, um bei 20 Hz stabile Werte zu bekommen, bräuchte man eine Messzeit von mindestens 2s.

... ich hab mir bei den Ergebnissen überlegt ob es keine Möglichkeit gibt, die Samplingfrequenz per Zufall etwas um einen Mittelwert schwanken zu lassen. Dann sollten die Fehlmessungen nicht mehr so stark ausfallen.
Gute Idee ... und auch relativ problemlos realisierbar, indem ich die Warte-Pause zwischen den ADC-Abfragen von Abfrage zu Abfrage anpasse. Das werde ich demnächst mal testen.

wobei ein Zufallsgenerator auch nicht trivial ist - insbesondere wenn der ADC schon im Dauerlauf beschäftigt ist...
Da dürfte auch eine vorgefertigte Zufallswert-Tabelle ausreichen. Speicherplatz im Flash ist noch zur Genüge vorhanden.


Gruß
Pirx
 
Hallo zusammen,

Die Forschungsarbeiten an dem kleinen Millivoltmeter haben etwas Zeit gebraucht, sich aber schlußendlich richtig gelohnt. Ich gebe das mal nur in Kurzform wieder.

Dino's Tipp folgend habe ich zunächst mal die Abtastrate in zufälliger Weise moduliert. Das stabilisiert zwar tatsächlich die Anzeige in den Fehlstellen etwas, sorgt aber in den anderen Frequenzbereichen - wo die Anzeige sonst stabil ist - für etwas Instabilität. Insgesamt brachte das leider nicht den erhofften Mehrwert. Allerdings habe ich dabei festgestellt, dass sich die Schaltung jetzt speziell im Frequenzbereich > 10kHz deutlich anders verhält - und das unabhängig davon, ob die Abtastrate moduliert wird, oder nicht. Das brachte mich auf eine andere Spur.

Um nämlich den Zufall innerhalb des Programms berechnen zu können, ohne dass sich dadurch der Messzyklus verlängert, hatte ich den Takt des Tiny auf 4,8 MHz erhöht und den ADC Prescaler und die Warteschleife angepasst. Infolge nicht 100%iger Anpassung war die Dauer des Messzyklus jetzt etwas kürzer und damit die Abtastrate geringfügig höher - und tatsächlich erwies sich das als des Pudels Kern.

Nun ging's wieder zurück zu 1,2 MHz Takt - mit dem Testen aller möglicher Startwerte für den Schleifenzähler (und so unterschiedlichen Schleifenzeiten) und der Suche nach dem optimalen Wert. Gefunden habe ich dabei drei Werte, bei denen es die Anzeige bis 20 kHz stabil bleibt und es nur noch wenige Fehlstellen gibt. Das war schonmal ein ordentlicher Fortschritt.

Nun kam ich auf die Idee, das auch nochmal bei 4,8 MHz zu testen. Hier gibt es beim Schleifenzähler schließlich 4x mehr Werte - also praktisch eine "feinere Auflösung" - da müßte doch noch mehr drin sein. Dem war tatschlich so und es gibt einen Wert, der nochmal deutlich heraussticht, so dass er mein Favorit geworden ist.

Damit sieht es jetzt wie folgt aus - gemessen wiederum bei 100mV Eingangsspannung :

Im Frequenzbereich 100 Hz - 19,5 kHz ist die Anzeige stabil und liegt die Grundabweichung bei +/- 1mV - bei 20 kHz Abfall auf -2mV. Es gibt insgesamt nur 3 Fehlstellen, bei denen die angezeiten Werte moderat oder start schwanken :
- moderate Fehlstellen : 4,3 - 4,4 kHz
- starke Fehlstellen : 17,15 - 17,55 kHz, 8,6 - 8,9 kHz

Unter 100 Hz wird die Anzeige schnell sehr instabil, bei 50Hz schwankt sie stark.
Messungen bei einer Eingangsspannung von 1000 mV führten zum gleichen Ergebnis. Stichproben bei 20 mV und 1700 mV legen nahe, dass es bei denen auch nicht anders aussieht.


Fazit:
Das "popelige" Ding ist jetzt im Frequenzbereich 100 - 19.500 Hz echt gut zu gebrauchen. Die Fehlstellen muss man freilich im Hinterkopf behalten und auch, dass die Eingangsimpedanz nicht für hochohmige Messpunkte geeignet ist. In solchen Fällen hilft ein kleiner Vorverstärker mit FET-Eingang.


Gruß
Pirx


PS: Hier noch der finale Code :

Anhang anzeigen Millivoltmeter_ATT13_4800kHz.asm
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)