PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] 5V-Referenzspannungsquelle an RA3 als ADC-Referenz funktioniert nicht.



pointhi
29.03.2014, 16:37
Ich arbeite gerade an einem Board, welches unter anderem ein PIC für diverse Aufgaben beheimatet. Da ich die Spannungen am ADC mit hoher genauigkeit auslesen muss (8-10 Bit genauigkeit) hab ich eine Referenzspannungsquelle auf dem Board installiert. Sobald ich diese aber aktiviere, liefert der ADC nur mehr 1023 als Ergebnis.

Die Referenzspannungsquelle selber liefert saubere 5V (gemessen), die Versorgungsspannung am PIC sind 5V (von StepDown +-0,1V)-0,3V von der Schutzdiode.

Hier die Schaltung an RA3:

27889
Code
Allgemeine Initialisierung
https://github.com/pointhi/PointhiBoard/blob/master/firmware/PointhiBoard_fw.X/src/init.c
Initialisierung des ADC's
https://github.com/pointhi/PointhiBoard/blob/master/firmware/PointhiBoard_fw.X/src/adc.c

Sobald ich diese Zeile aktiviere liefert der ADC nur mehr 1023 als ergebnis, wenn diese deaktiviert ist liefert sie korrekte werte (mit starken schwankungen ab dem 5,6 Bit):



ADCON1bits.VCFG0 = 1; // Vdd

Meine Ideen Bzgl. Fehlerursache:

Der Spannungsunterschied zwischen VDD und VREF+ ist etwa 0,3V (bin da an der maximalen Spezifikation, werde das ganze sowieso auf 3,3V-Referenz umbauen müssen).
Irgendwo ein Register vergessen oder falsch konfiguriert
zu großer eingangswiederstand für eine Referenzspannungsquelle?
Der PIC auf dem ich gerade entwickle musste kurzzeitig mal 8V oder so wegstecken als der StepDown durchgebrannt war. Er hat es aber nach meinen derzeitigen erkenntnissen unbeschaded überlebt (es funktioniert alles noch was vorher schon funktioniert hat)


mfg, pointhi

RoboHolIC
30.03.2014, 00:01
Ich habe im Register ADCON1 eines beliebigen PIC18Cxx2 (das erste Datenblatt, das mir vor die Flinte kam, da kein Typ benannt wurde) kein Bit VCFG0 entdeckt.
Es wäre ungewöhnlich, wenn die Bitbenennungen der Header-Files von den Namen des Datenblattes abweichen. Daher sieht es für mich erstmal nach einer Verwechselung deinerseits aus.

Was passiert, wenn die Schutzdiode testweise überbrückt wird, damit Vref nicht signifikannt höher als Vcc ist?

Klebwax
30.03.2014, 09:40
Ich hab zwar mit PIC18 noch nichts zu tun gehabt, den ADC von PIC12/16 oder PIC24 hab ich mehrfach benutzt. Da die aus der gleichen Chipschmiede kommen, sollten sie vergleichbar sein.

Um 8 oder 10Bit zu bekommen, braucht man keine extra Spannungsreferenz. Die Auflösung von 10-Bit ist 1 auf Tausend, eine Referenz, deren Qualität in "Parts Per Million" spezifiziert ist, ist da Overkill. Wenn der ADC 16 Bit oder mehr hätte, wäre das anders.

Wenn der Aufbau der Schaltung ok ist, sollte der ADC-Wert höchstens um ein, zwei Werte schwanken. Das ist zumindestens meine Erfahrung, egal was ich als Referenz benutzt habe (eine eingebaute oder Vdd oder AVdd je nach Chip). Ich hab mir das in der SW auch einfacher gemacht: den internen MUX auf den gewünschten Kanal gestellt, einige µs gewartet, den ADC gestartet und wenn er fertig war das Ergebniss verwendet. Manche PICs haben auch einen Auto-Modus, da wartet er selbsständig die Sample-Time ab und startet dann den ADC alleine. Die Ergebnisse sind gut brauchbar.

Du wandelst zweimal und wirfst einen Wert weg, das ist IMHO unnötig wenn die Sample-Zeit groß genug ist. Und wenn die Signalquelle eine Impedanz von wenigen Kiloohm hat, ist das in wenigen µs erledigt. Die ADC-Clock ist auch ein Punkt, wenn man da unsicher ist, kann man den internen Oszillator benutzen. den die PICs typischerweise haben.

My 2 cents

MfG Klebwax

pointhi
30.03.2014, 13:10
Tschuldigung, Typ vergessen: PIC18F4420


Ich habe im Register ADCON1 eines beliebigen PIC18Cxx2 (das erste Datenblatt, das mir vor die Flinte kam, da kein Typ benannt wurde) kein Bit VCFG0 entdeckt.

Hier der Teil aus dem Datenblatt, VCFG0 existiert:


VCFG1: Voltage Reference Configuration bit (V REF - source)
1 = V REF - (AN2)
0 = V SS

VCFG0: Voltage Reference Configuration bit (V REF + source)
1 = V REF + (AN3)
0 = V DD


Was passiert, wenn die Schutzdiode testweise überbrückt wird, damit Vref nicht signifikannt höher als Vcc ist?

Werd ich mal ausprobieren.


Um 8 oder 10Bit zu bekommen, braucht man keine extra Spannungsreferenz. Die Auflösung von 10-Bit ist 1 auf Tausend,

Das Problem ist dass die Versorgungsspannung von einem Step-Down mit +- 0,1V genauigkeit kommt, dazu kommt noch die Diode und diverse Temperaturschwankungen welche die ADC-Referenz noch weiter beeinflussen. Bei meinen derzeitigen Tests waren villeicht 4-6 Bit brauchbar, der rest datenmüll. Einen Tiefentladeschutz für LiPos kann ich mit so einer genauigkeit nicht realiseren. Der ADC für die Versorgungsspannung ist selber mit einem 1:9 Spannungsteiler am ADC angeschlossen, wodurch sich die Auflösung in mV noch weiter verschlechtert.


Du wandelst zweimal und wirfst einen Wert weg, das ist IMHO unnötig wenn die Sample-Zeit groß genug ist. Und wenn die Signalquelle eine Impedanz von wenigen Kiloohm hat, ist das in wenigen µs erledigt. Die ADC-Clock ist auch ein Punkt, wenn man da unsicher ist, kann man den internen Oszillator benutzen. den die PICs typischerweise haben.

Als ich diesen Teil geschrieben habe haben wir im Labor gerade ADC beim AVR durchgemacht, und der Lehrer hat unter anderem das empfohlen um die genauigkeit zu erhöhen. Also hab ich es einfach mal implementiert. Dazu kommt noch, das ich außer den internen MUX noch einen Externen Analog-MUX benutze. Dieser hat auch noch schaltzeiten, und durch die kapazitäten und widerstände auch diverse umladezeiten (welche sicher nicht hoch, aber doch da sind). Also besser auf nummer sicher, kann man später ja noch ändern falls es benötigt wird.

mfg, pointhi

pointhi
12.04.2014, 19:11
Das ganze funktioniert jetzt, ich bin mir aber nicht ganz sicher was genau geholfen hat.

Vermutlich war es eine kalte lötstelle beim IC. Ich hab noch einmal ein paar pins nachgelötet, da ich 1. ADC-Pin nicht auslesen konnte (war wohl nicht verbunden, soetwas sieht man bei TQFP nur nicht wirklich gut). Zusätzlich habe ich im Code das Register CMCON mit 0x00 überschrieben, damit ja kein komperator aktiv ist.

Die Code-Änderungen welche ich vorgenommen habe bis es funktionierte sind in diesem Commit zusammengefasst:
https://github.com/pointhi/PointhiBoard/commit/dd80995ddde4b9ab7dc51915b834c4aa03d69d35

mfg, pointhi