Analoges mit dem PIC

Begonnen von picass, 20.05.2022, 15:43:44 CEST

⏪ vorheriges - nächstes ⏩

picass

Bevor gleich an meinem Wohnort aktuell es zu Sindfluten und Orkanböen kommt - ist zumindest so vorher gesagt - , habe ich noch Aufklärungsbedarf über die Verwendung von Ports mit analogen Signalen. Demnächst gebraucht werden mindestens 4 analoge Eingänge, die im Wechsel abgefragt werden. Bei mindestens zwei der vier Quellen steht fest, dass der Eingangspegel sich etwa zwischen 1 und 3 Volt bewegen wird, die genauen Werte müssen noch ermittel werden. Jedenfalls soll die 10-bit-Auflösung in genau diesen Bereich gelegt werden, was ja möglich ist.

Gettz gibt es zwei Module im PIC18F14K22, die da eine Rolle spielen könnten.
1) Zum Einen ein DAC, der als Eingang wahlweise z.B. die 5V-Spannung oder eine an Port A1 angelegte externe Spannung oder aber den FVR, also so'ne Festspannungsrefernz haben kann. Als Ausgang kann der DAC dann eine je nach Einstellung noch in 32 Stufen aufgelöste Spannung ausgeben.
2) Zum Anderen der schon genannte FVR, der je nach Einstellung 1,024 Volt oder 2,048 oder 4,096 Volt liefert.

Die fraglichen Portpinne sind A0, der u.a. zuständig sein kann für
- "CVref" = Comparator referenz voltage output
oder auch als
- "Vref-" = ADC und Comparator voltage referenz voltage (low) input

und Portpin A1, der u.a. zuständig sein kann für
- Vref+ = Comparator referenz voltage (high) inpit ADC qual.

Da blicke ich im Moment nicht durch. Die zwei Komponenten DAC und FVR sollen unabhängig voneinander sein. Andererseits benutzen beide den Pin PA0, mal als Eingang, mal als Ausgang.
Kann man beide hintereinander schalten, also z.B. den FVR einen Pegel von 4,096 Volt erzeugen lassen und das dann in 32 Stufen zerlegen? Und das dann als untere Schwelle für den gewünschten unteren Mindestpegel von 1 Volt nehmen?

Ich bitte um aufklärende Hinweise. Nochmal: das Ziel soll sein, analoge Signale zu erfassen und mit den üblichen 10-bit aufzulösen im Bereich zwischen ca. 1 Volt und ca. 3 Volt.
Und - ach ja - Beeilung tut not, die ersten Blitze zuckten bereits.
Grüße, picass

PICkel

Hallo picass!

Meine Empfehlung: Benutze den FVR als Referenz eventuell mit 2,048V, der sollte wohl recht genau sein. Gegebenenfalls einen Spannungsteiler davorschalten.
Das/die untersten 1/2Bit kann man meist vergessen wegen Störeinstrahlungen. Ich habe meist die "linksbündige" Ausrichtung des Ergebnisses bevorzugt, also Bit9...2 als High-Byte und Bit 1...0 als Low-Byte.
Davon habe ich dann nur das High-Byte verwendet. Und 2,048V/256=8mV Auflösung. Reicht das nicht?

Dass man den ADC-Bereich "von unten her" hochsetzen kann, ist mir nicht bekannt.

Weiteres bei Bedarf morgen, jetzt kommt erstmal das Regenwetter bei uns am Erzgebirgsrand an. Und ich habe prinzipiell beim I-net-surfen keinen Zugriff auf meine Arbeitsdaten und Datenblätter.

Gruß
PICkel

pic18

#2
So wie ich dich verstehe willst Du die FVR-Spannung mit dem programmierbaren Spannungsteiler teilen = VRef, diese am CVRef pin (RA0) ausgeben und dann von hier aus über VREF- als Referenzspannung eingeben. Das wird meiner Meinung nach nicht funktionieren, da der Eingang VREF- negativ ist. Wenn müßtest Du diesen auf VREF+ Hardwaremäßig schalten. (also Brücke zwischen RA0 und RA1) Softwaremäßig muß dann noch der Eingang der Referenzspannung VREF- gegen Masse geschaltet werden. Das könnte funktionieren, wäre mir aber zu viel Aufwand. Was hältst du davon. Du nimmst die FVR-Spannung ungeteilt als Referenzspannung. Also PVCFG[1:0] = 10 (VREF+), NVCFG[1:0] = 00 (VREF-) = Masse.
Was ich noch nicht ganz verstanden habe ist das Stabilisierungsbit FVR1ST. Wenn das gesetzt wird muß noch irgendeine Zeitschleife programmiert werden damit die FVR-Spannung stabil ist?!

pic18

#3
Ich habe jetzt gerade nochmal im Datenblatt nach dem FVR1ST-Bit geschaut. Das kann man nur lesen. Das heißt man muß nach dem das FVR1EN-Bit gesetzt wird, in einer Schleife das FVR1ST-Bit so lange abfragen bis dieses gesetzt ist, dann ist die Spannung stabil.

bsf   VREFCON0, FVR1EN

btfss VREFCON0, FVR1ST ; wartet ab bis die Spannung stabil ist
bra   $-2

picass

Und wieder erwischt es mich voll. Da hatte ich geglaubt, ein recht einfach zu installierendes Feature einbringen zu können, und nu' sitze ich wieder vor dem Datenblatt und suche händeringend nach dem Grund fürs Nichtfunktionieren.
Habe mir heute versucht, die Sache wirklich einfach zu machen und auf alle Manipulationen direkt auf die beiden angesprochenen internen Spannungs-Einstellungs-Funktionen zu verzichten und nur das Einstellen des unteren Grenzwertes mittels einer  extern angelegten Spannung auszuführen.
Vergebene Liebesbemühung: kaum ist im Prog das im zuständigen Register ADCON1 mit dem Setzten eines einzigen Bits eingestellt, weigert sich der PIC, überhaupt irgendwas auszugeben. Ohne dieses ADCON1,1 Bit gibt er fein säuberlich einstellbar die über A2 eingelesenen Spannungswerte eines Trimmers aus. Ist ADCOM1,1 wieder gesetzt, schmollt er und protestiert durch Ausgabe von Nullen.

Die Wetterfrösche hatten gestern Abend mit ihrer Vorhersage Pech und wir Dortmunder Glück. Sowohl der angekündigte Starkregen fand nicht oder nur in marginalen Ansätzen statt, auch der Tornado machte einen Bogen um unsere Stadt. Dafür traf er nur wenig östlich dann Paderborn. Glück und Pech im Wetter..... und mal wieder Pech mit Assembler. :(
Grüße, picass

pic18

willst Du einen analogen Wert abfragen oder ausgeben? Ich gehe mal davon aus, dass Du einen analogen Wert einlesen möchtest. Mit setzen des Bits ADCON1.GO startest Du die Abfrage. Natürlich müssen vorher die anderen Parameter gesetzt sein. Also den Eingang auf Eingang setzen, den richtigen analogen Kanal setzen, sowie die richtige Acquisition Zeit. Diese ist abhängig von der Taktfrequenz und der Impedanz vom Eingang. Nach dem Start von ADCON1.GO mußt du dieses Bit solange abfragen bis dieses auf -DONE also Null springt. Dann ist die Auswärtezeit erreicht und du kannst das Ergebnis im ADRES - Register abfragen.

pic18

ich habe hier mal ein Programmausschnitt von meinem Projekt. Ich arbeite hier mit einer Taktfrequenz von 40MHz also FOSC/4 = 10MHz
adc.zip

ps: warum muß alles gepackt werden?[

ADMIN

Zitat von: pic18 am 21.05.2022, 15:30:36 CESTps: warum muß alles gepackt werden?[
Es muss nur das gepackt werden, was nicht in der Liste steht, die unter Anhang einfügen steht.
Bei Codes kann man oben in der Leiste beim schreiben, den TAG CODE wählen und so den Code einfügen.

picass

Schwitz! :( Der PIC ist ja doch ein Guter! Zumindest, wenn man ihm klare Anweisungen erteilt! :(
Wie üblich hatte ich für diese Änderung die Vorlage eines älteren Programm-Entwurfes genutzt. In dem waren die Port-Initialisierungen zwar funktionabel, aber die Semantik gefiehl mir nicht mehr. Nun hatte ich alle Einstellungen für PortA auf das Format gebracht: movlw b'xxxx xxxx' und movwf XXX. Nach der Bereinigung funktionierte ja auch das normale Einlesen der analogen Spannung an Port A2 wieder korrekt, aber bei den vielen binären Nullen und Einsen war dann doch eine Unkonzentriertheit dabei, und so hatte ich beim ADCON1 aus Versehen das Bit 1 gesetzt und nicht das Bit 0. Das Einser war aber "reserved" und das hat den PIC verleitet, verschnupft zu reagieren.

Gettz klappt das Hochlegen des untersten Wertes des Bereiches für den ADC: die 1024 bit verteilen sich im Moment auf den Bereich von 1 Volt bis 5 Volt. Der obere Bereich kommt vielleicht später noch. Interessant ist noch, das unterhalb der neuen Einstiegsquelle - also von null Volt bis nun 1 Volt - alle Werte als Nullen vom ADC angegeben werden. Danke für wohlmeinende Hilfen, Grüße, picass

picass

#9
Gettz hat auch die Einführung einer oberen Grenze für den Bereich des ADC geklappt: Der PIC wandelt nunmehr mit seinen 1.024 bit nur noch im Bereich zwischen 1 und 4 Volt.

Die untere Grenze hatten wir schon. Um die einzuführen, muss zunächst eine externe Spannung an den für die untere Grenze halt zuständigen Portpin gelegt werden – beim PIC18F14K22 ist das der Pin Port A0. Selbst hatte ich da einen Spannungsteiler angelegt mit 39 kO an Plus und 10 kO an GND. Mag sein, dass der zu hochohmig ist, da müsste ggf. noch experimentiert werden. Im Programm wird dann mit movlw b'0000 0001' und movwf ADCON1 das Bit 0 gesetzt und das wars.

Die obere Grenze bietet mehr Auswahlmöglichkeiten, auch wieder eine externe Spannung. Die müsste dann an den Pin Port A1. Selbst habe ich das FVR genommen, das interne Festspannungsmodul, welches 3 verschiedene Spannungen anbietet, siehe auch oben: 1,024 und 2,048 und 4,096 Volt. Nimmt man das, spart man sich halt den Spannungsteiler.

Um die obere Grenze zu aktivieren inclusive der Nutzung des FVR wird im ADCON1 Register das Bit 3 gesetzt, also movlw b'0000 1000' und mov das Ganze ins ADCON1.  [Für beide Grenzen gleichzeitig entsprechend b'000 1001' ] Nun noch die gewünschte Spannung und "Enabelung" des FVR: für 4,096 Volt wird mit movlw b'1011 0000' und movwf VREFCON0 dies ausgeführt.

Und dann sucht sich der PIC leicht überprüfbar seine ADC-Werte nur noch in diesem Bereich. Unterhalb wird konstant 0 ausgegeben, oberhalb konstant 1.023. Damit hat man unversehens auch eine deutlich höhere Auflösung in diesem Bereich als die üblichen 10 bit des ADCs.
Grüße, picass

picass

Zitat von: picass am 22.05.2022, 10:04:30 CEST.........Spannungsteiler........ mit 39 kO an Plus und 10 kO an GND. Mag sein, dass der zu hochohmig ist, da müsste ggf. noch experimentiert werden.
Ist experimentiert und die Befürchtung bestand zurecht: es stellte sich auch nicht die erwartete Spannung von 1 Volt ein, sondern stattdessen 1,4 Volt. Eine Zehnerpotenz niedriger, dann passt es besser, also 3,9 kO und 1,0 kO. Oder halt so'n niedliches Regelungs-IC mit passender Spannungsausgabe.
Grüße, picass

picass

Diesen Fred führe ich mal fort, ändere aber das interne Thema. Vorher ging es um die Eingrenzung des Bereiches, in welchem an einem Port ein analoges Signal eingelesen werden kann. Das funktionierte letztlich auch sehr gut, hier zwischen 1 und 4 Volt.

Gettz was Anderes:
Wie hoch-ohmig ist so'n PIC-Port bei Verwendung als analoger Eingang. Habe in dem Datenblatt nichts darüber gefunden.
Hintergrund der Frage: in einem aktuellen Projekt - Anzeige der Regeneration des Dieselpartikelfilters - habe ich vor meinen geliebten PIC18F14K22 einen OPA335 gesetzt, in der Absicht und Annahme, dass dieser Opa als Spannungsfolger das Eingangssignal nicht belastet, am Ausgang aber den PIC gut füttern kann.

Nun stellt sich in diesem Projekt raus, dass der OPA eigene Probleme mit sich bringt, und insbesondere das Füttern des PICs auch Unerwartetes gebiert. Daher die Überlegung, den OPA gleich wegzulassen. Aber da würde ich doch gerne wissen wollen, wie hochohmig so'n PIC dabei ist, denn das Messsignal soll wirklich nicht belastet werden.
Grüße, picass

PICkel

#12
Hallo picass,

im DaBla zum 18F14K22, Absatz 16.3 werden max. 10kOhm als Eingangswiderstand genannt, und auf Seite 208 in Fig. 16_5 ist die Eingangsbeschaltung dargestellt.

Die 10kOhm gelten aber nur, wenn man dem PIC genügend Zeit zum Laden der internen Kondensatoren CPIN und CHOLD gibt. Da diese aber zusammen nur ca. 20pF haben, ist das für Deinen Fall unkritisch.
Mit 2...4,7 kOhm bist Du auf der sicheren Seite, auch was den Leckstrom am Pin anbelangt.

Gruß
PICkel

picass

Ähm..., so ganz klar ist mir das noch nicht.
Maximal... von "oben" oder von "unten" gesehen? Darf das Eingangssignal nun niederohmiger sein oder soll es hochomiger sein?
In "meinem" Fall, also demjenigen, welcher mir im Moment auf den Nägeln brennt, also dem testweisen Einsatz meines 4segment-LED-anzeigenden PIC ist ursprünglich zwischen dem vorgeschalteten OP OPA335 und dem Port A2 am PIC schlicht nichts, die sind diretissima miteinander verbunden.

Allerdings hat dies zu dem beschriebenen Dilemma geführt, dass die Anzeige wie wild springt, hier gleich beide letzte Stellen. Überlegt hatte ich heute, ob es möglich sein könnte, den OPA wegzulassen und den PIC direkt an das Signal für die Messung der Abgastemperatur vor dem Dieselpartikelfilter im Auto zu hängen.

Das wird - so eine allerdings gute Vermutung - erzeugt, indem eine geregelte Uv von +5 Volt auf einen Widerstand von 1 kO geführt wird, der wiederum ist mit einem PTC verbunden, welcher als Kaltwiderstand bei etwa 20°C ca. 215 Ohm hat (200 Ohm bei 0°C). Also ein Spannungsteiler von 5 Volt über 1 kO auf 215 Ohm und das auf Masse.
Dieses Signal ist also recht niederohmig, aber es soll nicht durch eine zusätzliche niederohmige Mess-Schaltung belastet werden.
Bitte auch in den anderen, gerade laufenden Fred über die Messung dieser Temp schauen. Den Gedanken an das Weglassen des OPA habe ich wieder verworfen.
Und danke für den Hinweis auf das Datenblatt.
Grüße, picass

PICkel

Zitat von: PICkel am 11.08.2022, 13:43:23 CESTim DaBla zum 18F14K22, Absatz 16.3 werden max. 10kOhm als Eingangswiderstand genannt

Zitat von: picass am 11.08.2022, 17:52:47 CESTÄhm..., so ganz klar ist mir das noch nicht.
Maximal... von "oben" oder von "unten" gesehen

War wohl ein wenig unklar ausgedrückt: Es ist nicht der Eingangs-R im PIC gemeint, sondern dass die äußere Beschaltung (RS in FIG. 16-5) des ADC-Pin nicht mehr als 10kOhm Innenwiderstand haben soll.

Gruß
PICkel

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:

2 Beeren und 2 Bananen. Welche Farbe hat die Banane ?:
Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau