Labor Netzteil oder das was es dann wird

  • Träume weiter, Pius


    Wie so oft verstecken sich die Probleme in den Details. Nachdem nun die ADC Messung korrekt arbeitet, versuchte ich mir eine Vorstellung über Verbesserungen des Voltmeters zu machen. Da mein Gerät später einmal ein Labornetzgerät steuern soll, vieles digital gelöst sein soll und damit den Verdrahtungsaufwand und den Komfort der Anwendung optimieren soll, meinte ich, eine Erhöhung der Genauigkeit mit der Software alleine zu erreichen.


    Gehe ich von einem Labor Netzgerät mit einem einstellbaren Ausgangsspannungsbereich von 0-30V aus, dann erreiche ich eine Auflösung von (30V/1000) = 30mV.


    (10Bit AD entspricht 210 Schritten 0-1023, benutzen möchte ich den Bereich aber nur bis 1000, da auch Spannungen knapp darüber noch messbar bleiben. Vorsicht, dies ist lediglich die Auflösung und hat nichts mit der Genauigkeit zu tun)


    Stelle ich nun eine Spannung von 5V ein, dann müsste der ADC Wert bei runden 167 (167 * 30mV= 5.1V) liegen. Da kam mir die Überlegung, dass wenn ich für Messungen unter 10V anstelle der 2.56V Referenz die 1.1V Referenz benütze, dann könnte ich für den Bereich 0-10V eine höhere Anzeigeauflösung erreichen. Die Software müsste dann lediglich den ADC Wert mit dem entsprechenden Faktor korrigieren. Die Kalibrierung müsste dann z.B: bei 20V mit der 2.56V Referenz erfolgen (20V ist 2/3 des Bereiches), wozu ich ein Poti für die Korrektur im Eingangsspannungsteiler vorgesehen habe. In der Annahme, dass die beiden Referenzen (2.56V und 1.1V) eine gleiche oder zumindest ähnliche Genauigkeit aufweisen würden, müsste dies funktionieren.

    Pustekuchen, ein Blick ins Datenblatt der ATmega644 (Seite 325) zeigt die folgenden Daten:


    ATmega644_Reference.png
    Da kann sich bereits die 2.56V Referenz im Bereich von 2.4V – 2.8V bewegen. Dies lässt sich mit der Kalibrierung locker korrigieren, aber die Annahme, dass sich dann die 1.1V Referenz gleich verhält ist wohl zu optimistisch. Einzige Hoffnung wäre, die Kalibrierung mit der 2.56V Referenz und dem Trimmer vorzunehmen und die Kalibrierung der 1.1V Referenz anschliessend per Software zu erledigen. In Anbetracht der Fehler bei der AD Wandlung von bis zu 2 Bit LSB (bei 200kHz) erscheint mir der Aufwand für die Software viel zu hoch und der resultierende Nutzen minimal.


    Tja, da habe ich wieder einige Stunden mit Ausprobieren und der Suche nach Lösungen investiert, mit der logischen Konsequenz es mir zu sparen.


    und weil es Andere auch schon bemerkt haben hier zwei Links:

    Genauigkeit der Referenz

    Spannungsmessung mit dem Arduino

  • Endlich wagte ich mich wieder an diese Idee zurück. Nachdem ich den "Flick" mit dem Spannungsfolger wieder rückgängig machte und den Serie R im Input Spannungsteiler nochmals prüfte, passte die Anzeige. Hmm, vermutlich war beim Spannungsteiler irgendwo eine kleine Lötbrücke, die ich unbewusst mit dem Entlöten des R entfernte. Ist zwar ärgerlich, aber es wäre die einzige plausible Erklärung. Nun geht es an die Implementierung aller AD Eingänge.
    schönes Wochenende
    Pius

  • Der Spannungsfolger war nicht die Lösung. Zwar stellte sich ein ganz kleine Verbesserung der Genauigkeit ein, die aber die Präzision merklich verbesserte.
    Im nächsten Schritt versuchte ich einen Fehler in der Masseverbindung auszuschliessen, indem ich die Masse der Spannungsquelle direkt an den Masseanschluss des AD Converters verband. Auch dies führte nicht zu eine Verbesserung. Zum Glück, weil ein falsche Masseführung wäre nicht leicht zu beheben gewesen.
    Beim nächsten Versuch änderte ich den Taktvorteiler des AD. Diesen hatte ich wie im Datenblatt gefordert:

    Zitat

    By default, the successive approximation circuitry requires an input clock frequency between 50kHz and

    200kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the input clock frequency to the

    ADC can be higher than 200kHz to get a higher sample rate.


    Bei meinem Takt von 16MHz benutzte ich den /128 Teiler was dann 125kHz für den AD Takt entspricht und dieser liegt amit unter den geforderten 200kHz. Versuchsweise reduzierte ich den Vorteiler und zuerst auf /64 und dann gar auf /32 und die Abweichungen verkleinerten sich ein wenig. Bei noch höheren Clockraten begannen die Werte einzelner Messungen stark zu schwanken und der Fehler stieg bei kleinen Spannungen unbrauchbar an.


    Teiler_32.png

    Was mich dann etwas sicherer machte war der Umstand, das sich auch das Gain leicht veränderte (30V zeigte einen leicht höheren Wert). Wenn ich den Abweichfehler durch die Kalibrierung in der Mitte verteile. Aber mit den kleinen Spannungen bin ich nach wie vor unzufrieden. Bevor ich nun weitere Vesruche zur Verbesserung starte, muss ich meine Software auf einen einzelnen Kanal reduzieren um sicher zu stellen, dass sich Fehler nicht von anderen Kanälen auf die Messung auswirken. Die aktuelle Software scant alle benutzten Kanäle ab und wechselt nach jeder Messung den Mux. Da ich im Augenblick die interne 2.56V Referenz benutze könnte ich mir vorstellen, wenn ich keine andere Fehlerquelle mehr ausmachen kann, bei kleinen Spannungen die 1.1V Referenz zu nutzen. Dies würde dann einen um den Faktor 2.328 höheren binären Wert liefern. Zwar sagt das Datenblatt, dass bei Benutzung der internen Referenz der erste AD Wert unbrauchbar sei und wenn ich die Referenz im Betrieb umschalte, müsste ich daneben jeweils die erste Messung nach dem Umschalten verwerfen.


    Tja, vielleicht wäre die Differenzmessung die ideale Lösung gewesen, aber die HW steht und würde ich eine Differenzwandlung anstreben, hätte ich zuwenig AD EIngänge zur Verfügung.

  • Hier läuft alles etwas langsam und manchmal zweifle ich, ob mein Lösungsansatz richtig ist. In der Zwischenzeit habe ich die zwei Drehencoder in die Software verpflanzt. Das Gerät soll sich am Ende wie ein „normales“ Labornetzgerät anfühlen. Der linke Encoder soll die Ausgangsspannung steuern, der Rechte die Stromgrenze (am welchem Strom sich das Gerät als Konstantstromquelle verhalten soll. Die beiden Tasten der Drehencoder werden dazu benutzt, die Einstellschritte der Geber zu definieren. Wird die Taste gedrückt, dann kann durch Drehen die entsprechende Schrittgrösse bestimmt werden (z.B: 1,10,100,1000). Zur Darstellung auf dem Zweizeilendisplay benutze ich die erste Zeile als Ausgabe der Ist-Werte (30.00V 1.255A) und in der zweiten Zeile wird dann nur bei Änderungen der eingestellte Sollwert kurz dargestellt. Im Betrieb wird dann die zweite Zeile auch zur Ausgabe von Statusmeldungen (wie CI (const current) oder die Temperaturen angezeigt.

    Sobald ich dann ein Beispiel für die analoge Regelung gebaut habe, wende ich mich dann der Fernsteuerung zu. Nach meiner Vorstellung möchte ich das Netzgerät auch vollständig via UART bedienen können. Dies soll parallel mit der Bedienung am Gerät und der UART möglich sein, oder man sperrt die Bedienung und lässt nur noch die Befehle von der UART aktiv werden.

    On ich am Ende eine RS232 oder eine RS485 Interface benutze ist noch offen. Sicher ist, dass ich die UART Schnittstelle galvanisch getrennt ausführen muss, da man Labornetzgeräte auch auf anderen Spannungslevels, in Serie oder Parallel Schaltungen benutzen will und dazu darf und will ich keine Masseverbindungen haben.


    Im Augenblick muss ich aber ein weiteres Problem mit dem AD Wandler lösen. Für ein „übliches“ Labornetzgerät gehe ich von einem Spannungsbereich von 0 – 10V aus und dies mit einem Strom von 0-3A. Also habe ich den Spannungsteiler vor dem AD für maximal 30.69 Volt ausgelegt (bin 1000 entspricht dann den 30V). Der AD Wandler in meiner Beschaltung zeigt aber gössere Abweichungen, wie die folgende Tabelle zeigt.



    TabelleFehler.png



    Die Software misst zyklisch alle benutzten AD Eingänge und kumuliert die Werte 16x. Dies bedeutet, dass ich jeden Eingang 16 mal messe und die Summe davon zur Weiterverarbeitung benutze.

    Der Trimmer für die Kalibrierung wurde hier bei 30V vorgenommen. Als Referenz für die Spannungen benutze ich einen Fluke 5101B Kalibrator um sicher zu sein, dass ich keinen Mist messe. Der grösste Fehler liegt verständlicherweise bei 0.5V, was im Augenblick weniger wichtig ist, als die Werte ab 2V.

    Der Versuch, die Kalibrierung bei 10V vorzunehmen verhält sich analog zu dieser Tabelle, weshalb ich mich dann für den Kalibrierpunkt bei 30V entschied. Die Ursachen für die starken Abweichungen könnten zum einen in einer

    - falschen Masseverbindung liegen (ein Strom im Masseleiter könnte einen Offset erzeugen) ,

    - in einer zu schnellen Messung des AD, wobei ich da bereits jetzt sehr langsam arbeite,

    - oder in einer Fehlanpassung der Eingangsimpedanz (Spannungsteiler 15kΩ/1.3kΩ).


    Im nächsten Schritt werde ich zuerst einen Spannungsfolger dazwischen schalten (das Thema kommt eben immer wieder) um den Fehler beim Spannungsteiler auszuschliessen. Aber natürlich hoffe ich, dass damit der Fehler dann kleiner wird.


    AD_Eingang.png

    (Die Schutzdiode ist noch nicht bestückt)


    schönen Sonntag
    Pius

  • Nein, ich habe einen Pfostenstecker auf der Platine. Her ist der DAC noch nicht bestückt (auf dem freien Platz gleich unter dem ISP Anschluss)
    Ps_Ctrl_Unten.jpg


    Nun arbeitet mein 2-Kanal DAC auch richtig und macht alles im Hintergrund. Was man tun muss, eine Variable für Spannung oder Strom aufsetzen und

    einen Eventcode in das Fifo stellen, erledigt. Werden beide Variablen beinahe gleichzeitig aufgesetzt und die Events für beide Kanäle abgesetzt, dann kann es sein, dass die SPI noch mit dem Schreiben der 1. Variable beschäftigt ist. Dann wird das Event im Hintergrund einfach wieder in die Queue gestellt und etwas später (im Main Loop) erneut behandelt. Das Schreiben eines 16 Bit Wertes in den DAC kostet etwa 9uS SPI Zeit und wird im SPI Interrupt (ausser das erste Byte natürlich) abgearbeitet. Da die Werte des DAC für der Sollvorgabe dient, muss ich im nächsten Schritt die Inhalte der Variablen mit den Drehencodern ändern können, so dass es sich wie bei einem üblichen Labornetzteil verhält. Ein Drehgeber für die Spannung der andere für die Stromlimite. Vermutlich werde ich die Soll Werte in der zweiten Zeile und die aktuell gemessenen Werte in der ersten Zeile darstellen.

    schönen Abend

    Pius

  • KaiR das ist ganz einfach. Bei jedem Schema das ich neu zeichne ist der 6-polige ISP Header immer das Erste was ich tue.
    Den Programmes slebst sieht man auf dem Bild mit den Messkabel.
    schönen Abend
    Pius

  • Sehr interessant. Auch das Werkzeug. Wie schließt Du den Programmer an die SMD ICs an? Leider kann ich das auf dem Bild nicht richtig erkennen.

    Was verwendest Du dafür?

  • Nun, manchmal ist es so dass man einen Fehler sucht und, sofern man es öfters erlebt, man(n) den Fehler bei sich selbst sucht.

    Ich teste im Augenblick die uC HW einer kleinen Projektidee aus. Ich möchte mir, den Steuer- und Anzeigeteil eines Labornetzgerätes mit einem ATmega realisieren. Dabei soll der Kontroller die Referenzspannungen für den Regelteil zur Verfügung stellen, die U und I Werte für die Anzeige messen und ein paar anderen Kleinigkeiten erledigen. Die Netzteilschaltung ist nicht Bestandteil dieses Aufbaus, da ich weitgehend unabhängig vom Regelteil bleiben will.

    Ich versuchte seit gestern einen Zweikanal DAC (MCP4822) mit der Software in den Griff zu bekommen. Hätte ich nicht versucht, mir einen Pin am Prozessor einzusparen, wäre ich schneller ans Ziel gelangt. Heute aber probierte ich die ersten Befehle via SPI an den DAC zu senden und wunderte mich lange Zeit, dass ich keine Ausgangsspannung am DAC feststellen konnte. Nachdem ich mir mit dem KO das SPI Protokoll anschaute stieg meine Verunsicherung zusätzlich, weil da war alles wie man es gemäss dem Datenblatt erwarten könnte.


    SPI_DA.png

    Kanal 1 ist der Clock, Kanal 2 die Datenleitung, Kanal 3 dann das CS Signal und zu guter Letzt zeigt der Kanal 4 den Load-Befehl.

    In der Meinung, ein Test mit einer hochzählenden Variable für den DA Wert würde mir von Erfolg gekrönt. Nun, da das heutige Wetter zum Rausgehen verpflichtete, setzte ich erst nach einem Waldspaziergang mich erneut ans Problem und sass etwas ratlos vor meinem Messaufbau.

    Board.jpg


    Als ich dann verwundert feststellte, dass sich eine Linie (nicht auf dem Bild) in der oberen Bildschirmhälfte befand, stellte ich fest, dass der DAC ja richtig funktioniert. Mein Fehler war, dass ich alle 100mS einen neuen ansteigenden DA Wert schickte, und dies eben bei 12 Bit's seine Zeit beansprucht.


    Lernfazit: ich zweifle weiter an mir selbst, weil ich meistens die Ursache des Fehlers bin.


    Mein Status mit dem Konstrukt: Anzeige läuft (übrigens mit dem vorgestelltem Konzept @xx), AD Wandlungen arbeitet, DAC und die zwei Rotary Encoder. Der anfänglich vermeintlich effiziente Versorgungsteil (Switchregler) musste ich entfernen, da dieser bis zu 2mV die Versorgung verstörte. Als Ersatz musste ich auf einen Längsregler zurück greifen.


    Ps_Ctrl_Oben.jpg


    Alles geht in klienen Schritten nun weiter, hoffentlich bis zum Abschluss.

    schönen Sonntagabend
    Pius