Forum: Mikrocontroller und Digitale Elektronik PIC 16F1509, ADC , Error


von Harry R. (harryr)


Lesenswert?

Hallo zusammen,

ich hoffe dass mir jemand meine Fragen bzgl. ADC-Programmierung
beantworten kann. Vorab, den PIC16F1509 verwende ich zum testen,
weil er verfüg- und bestellbar ist. Natürlich ist das evtl. nicht der 
optimale PIC (der kann viel zu viel - oversized in jeder Beziehung),
aber zum testen ist er okay.

Ich zitiere mal aus der Spezifikation:

____________________________________
ADC VOLTAGE REFERENCE
The ADC module uses a positive and a negative
voltage reference. The positive reference is labeled
ref+ and the negative reference is labeled ref-.
The positive voltage reference (ref+) is selected by the
ADPREF bits in the ADCON1 register. The positive
voltage reference source can be:
• VREF + pin
• VDD
The negative voltage reference (ref-) source is:
• VSS
_______________________________________

Bei Verwendung von VDD/VSS wird also eine Spannung zwischen 0V - 5V 
gemessen ?
Dh. die maximale Auflösung ist ~ 5mV.

Die von mir zu messende Spannung liegt zwischen 0mV - 300mV .

Mich interessiert nur der Bereich zwischen 0 - 10mV.
Die Auflösung wäre also nicht so gut geeignet.
Daher folgende Idee:

1) Bevor die zu messende Spannung an den Pin kommt wird sie mit einem
Impendanzwandler (OpAmp) von der Spannungsquelle entkoppelt. Dahinter 
begrenzt ein Diodenpaar die Spannung auf 0,7V.
2) Danach kommt ein weiterer OPAmp, mit Verstärkung 10.
Die Ausgangsspannung liegt dann zwischen 0 und 10V
3) Ich verzichte auf 1) und verwende nur 2)

Wenn ich die Doku richtig interpretiere würde eine Spannung über VDD 
einen Fehler im ADC provozieren.

a) Ich könnte das ignorieren, weil mich nur der Bereich zwischen 0 und 
100mV interessiert

b) zwei Zenerdioden 4,7V hinter dem Opamp (2)  (bzw vor RAX 16 ANX) 
begrenzen das Eingangssignal , sodass es eigentlich nie einen Error 
geben sollte.

Kann man das so machen ?

Rauschen etc ist nicht relevant.

Bemerkung: Bei genau diesem PIC finde ich in der Doku nichts,
was mir die Situation beschreibt, dass der ADC mehr als VDD im Eingang 
hat, hmmm

Danke und Grüße

Harry

von Harald K. (kirnbichler)


Lesenswert?

Harry R. schrieb:
> Die von mir zu messende Spannung liegt zwischen 0mV - 300mV .
>
> Mich interessiert nur der Bereich zwischen 0 - 10mV.

Dann solltest Du am VREF-Pin eine geeignete Spannung anlegen.

Dazu beachten: Datenblatt, Tabelle 29-13 "ADC Characteristics". Minimale 
externe Referenzspannung beträgt 1.8 V (Parameter AD06).

Harry R. schrieb:
> Bei genau diesem PIC finde ich in der Doku nichts,
> was mir die Situation beschreibt, dass der ADC mehr als VDD im Eingang
> hat, hmmm

Doch. Datenblatt, Abschnitt 29.1 "Absolute Maximum Ratings"
1
Voltage on pins with respect to V SS
2
    on V DD pin
3
        PIC16F1508/9 .... -0.3V to +6.5V
4
        PIC16LF1508/9 ...  -0.3V to +4.0V
5
    on MCLR pin .......... -0.3V to +9.0V
6
    on all other pins .... -0.3V to (V DD + 0.3V)

Der ADC fällt unter "all other pins".

: Bearbeitet durch User
von Harry R. (harryr)


Lesenswert?

Harald K. schrieb:
> Harry R. schrieb:
>> Die von mir zu messende Spannung liegt zwischen 0mV - 300mV .
>>
>> Mich interessiert nur der Bereich zwischen 0 - 10mV.
>
> Dann solltest Du am VREF-Pin eine geeignete Spannung anlegen.
Okay, woher würdest du die beziehen ?
Einfach mit VDD und Begrenzung durch eine Z-Diode zb ?

> Dazu beachten: Datenblatt, Tabelle 29-13 "ADC Characteristics". Minimale
> externe Referenzspannung beträgt 1.8 V (Parameter AD06).
>
> Harry R. schrieb:
>> Bei genau diesem PIC finde ich in der Doku nichts,
>> was mir die Situation beschreibt, dass der ADC mehr als VDD im Eingang
>> hat, hmmm
>
> Doch. Datenblatt, Abschnitt 29.1 "Absolute Maximum Ratings"
>
>
1
> Voltage on pins with respect to V SS
2
>     on V DD pin
3
>         PIC16F1508/9 .... -0.3V to +6.5V
4
>         PIC16LF1508/9 ...  -0.3V to +4.0V
5
>     on MCLR pin .......... -0.3V to +9.0V
6
>     on all other pins .... -0.3V to (V DD + 0.3V)
7
>
>
> Der ADC fällt unter "all other pins".
Okay, man muss die Doku wirklich nach allen Aspekten hin interpretieren 
:-)

Hast du noch Informationen, was einen Fehler im ADC provozieren könnte
(wenn man das Problem der maximum ratings gelöst hat) ?

Wenn ich also als externe Referenz 2V nehme hätte ich eine max. 
Auflösung
von ~ 2mV . Von der Idee mit dem OPAmp hältst du nichts ?

Viele Grüße

von Jochen-paul S. (picfan)


Lesenswert?

> von ~ 2mV . Von der Idee mit dem OPAmp hältst du nichts ?

Hallo,
das mit dem OP scheint mir eine Lösung zu sein. Wenn der OP an der 
gleichen Versorgungspannung liegt wie der Pic, wird er auch keine höhere 
Spannung liefern als der Pic. Falls der OP mit einer eigenen, höheren 
Spannung versorgt wird, dann muss der ADC-Pineingang geschützt werden.
Gruss Jochen-Paul

P.S. Apropos, der Pic16f1509 hat auch ein einstellbares 
Spannungsreferenzmodul(FVR), z.B. 2,048V..

: Bearbeitet durch User
von Thomas (kosmos)


Lesenswert?

Da so ein ADC Eingang recht hochohmig (ca. 50 kOhm) ist, braucht man in 
der Regel keinen Impedanzwandler. Oder ist deinen Spannungsquelle so 
schwachbrüstig?

Man kann sich etwas dadurch behelfen, in dem mann die Abtastrate 
reduzieren, dann hat man mehr Zeit einen kleinen Kerko mit der zu 
messenden Spannung zu laden, welche dann den nötigen Strom für den 
ADC-Eingang liefert, wenn er die Messung durchführt.

von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

Fvr des 16F1509 kann sogar 1,024V.
Da hast du eine Auflösung von 1mV.

von Harry R. (harryr)


Lesenswert?

Fred R. schrieb:
> Fvr des 16F1509 kann sogar 1,024V.
> Da hast du eine Auflösung von 1mV.

Also mit FVR auf 1024mV ?

von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

Harry R. schrieb:
> Also mit FVR auf 1024mV ?

Fred R. schrieb:
> Fvr des 16F1509 kann sogar 1,024V.

von Harry R. (harryr)


Lesenswert?

Fred R. schrieb:
> Harry R. schrieb:
>> Also mit FVR auf 1024mV ?
>
> Fred R. schrieb:
>> Fvr des 16F1509 kann sogar 1,024V.
Okay, das war eine höchst redundante Frage :-(

Ich versuche es mal mit einer sinnvollere Frage.

Wenn ich mehrere analoge Signale "quasiparallel"
mit dem ADC analysieren will gilt die Spannung ja für alle Signale.

Wenn ich jetzt auch noch ein Poti abfragen will (dort würde der Wert 
zwischen VDD und VSS liegen), kann man das während der Laufzeit des 
zukünftigen Programms je nach Bedarf umschalten ?


Viele Grüße

von Jochen-paul S. (picfan)


Lesenswert?

Harry R. schrieb:
> Wenn ich jetzt auch noch ein Poti abfragen will (dort würde der Wert
> zwischen VDD und VSS liegen), kann man das während der Laufzeit des
> zukünftigen Programms je nach Bedarf umschalten ?

Dss scheint mir heikel, denn wenn plötzlich die 1.024V des FVR durch das 
externe Poti "heraufgezogen" würde, könnte dieses Schaden nehmen.
Gruss Jochen

Oder vor jeder ADC-Messung konsequent das FVR einschalten oder 
entsprechend die Einstellung umschalten auf VDD, sicherheitshalber würde 
ich jedesmal, wenn das FVR aktiviert wird, das Poti entfernen.
Die zu messende Spannung darf nicht höher als die Referenzspannung 
b.z.w. VDD sein.

: Bearbeitet durch User
von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

Jochen-paul S. schrieb:
> könnte dieses Schaden nehmen.

Ernsthaft?

Jochen-paul S. schrieb:
> entsprechend die Einstellung umschalten auf VDD,

Ja. Warum nicht?

von Harry R. (harryr)


Lesenswert?

Fred R. schrieb:
> Jochen-paul S. schrieb:
>> könnte dieses Schaden nehmen.
>
> Ernsthaft?
>
> Jochen-paul S. schrieb:
>> entsprechend die Einstellung umschalten auf VDD,
>
> Ja. Warum nicht?
Ich fasse zusammen:
Ein "ständiges" Umkonfigurieren der Referenzspannung des ADC wäre eine 
mögliche und gängige Lösung.

von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

Harry R. schrieb:
> Ein "ständiges" Umkonfigurieren der Referenzspannung des ADC wäre eine
> mögliche und gängige Lösung.

Ja

von Motopick (motopick)


Lesenswert?

> Ein "ständiges" Umkonfigurieren der Referenzspannung des ADC wäre eine
> mögliche und gängige Lösung.

Es waere k.l.u.k., die dynamischen Parameter im Datenblatt zu beachten.

von Toxy T. (toxy_t)


Lesenswert?

Jochen-paul S. schrieb:
> Die zu messende Spannung darf nicht höher als die Referenzspannung
> b.z.w. VDD sein.
Das Letztere ist richtig aber die zu messende Spannung darf schon hoeher 
als die Vref sei - sie darf nur nicht > als VCC sein.
Ich hab hier irgendwo so ein Projekt wo die zu messende Analogspannung > 
Vref werden kann.Soweit ist mit noch kein Pic oder Arduino 
abgefackelt.Warum auch?

======================================
If you apply a higher voltage than Vref, the ADC will return the maximum 
number of counts, but not be damaged. Damage occurs if you apply a few 
tenths of a volt more than Vcc
======================================

von Harry R. (harryr)


Lesenswert?

Toxy T. schrieb:

> Das Letztere ist richtig aber die zu messende Spannung darf schon hoeher
> als die Vref sei - sie darf nur nicht > als VCC sein.
> Ich hab hier irgendwo so ein Projekt wo die zu messende Analogspannung >
> Vref werden kann.Soweit ist mit noch kein Pic oder Arduino
> abgefackelt.Warum auch?
>
> ======================================
> If you apply a higher voltage than Vref, the ADC will return the maximum
> number of counts, but not be damaged. Damage occurs if you apply a few
> tenths of a volt more than Vcc
> ======================================
Das schreit ja geradezu nach einer Zenerdiode mit 5,1 V vor jedem 
(gefährdetem) Eingang, denn wer weiß welches Störsignal mal einen Pike 
über VDD erzeugt.

von Harry R. (harryr)


Lesenswert?

Motopick schrieb:
>> Ein "ständiges" Umkonfigurieren der Referenzspannung des ADC wäre eine
>> mögliche und gängige Lösung.
>
> Es waere k.l.u.k., die dynamischen Parameter im Datenblatt zu beachten.
k.l.u.k. == klug ?

von Axel S. (a-za-z0-9)


Lesenswert?

Harry R. schrieb:
> Die von mir zu messende Spannung liegt zwischen 0mV - 300mV .
> Mich interessiert nur der Bereich zwischen 0 - 10mV.

Das ergibt keinen Sinn. Willst du nun Spannungen von 11mV bis 300mV 
messen können oder nicht?

Auf jeden Fall wird dir kein in einem µC befindlicher ADC einen 
Fullscale-Wert von 300mV (oder gar 10mV) liefern. Also wirst du um einen 
vorgeschalteten OPV als Verstärker nicht herum kommen. Manche µC haben 
aber PGA (programmable gain amplifiers) Blocks eingebaut. Die kann man 
dann natürlich auch verwenden.

Und das mit der Spannungsbegrenzung auf Vss-0.3V bzw. Vdd+0.3V muß man 
auch nicht so eng sehen. Dabei geht es um die Schutzdioden, die 
praktisch jeder µC an fast jedem Eingangspin hat (eine nach Vdd, eine 
nach Vss). Bei 0.3V leiten die noch gar nicht. Deswegen ist diese 
Spannung erlaubt. Bei 0.6V fangen sie langsam an zu leiten. Wenn man 
aber den Strom begrenzt [1], z.B. durch einen geeigneten Vorwiderstand, 
dann ist alles Paletti. Genauso wenn die Quelle den Strom bzw. die 
Energiemenge begrenzt. Deswegen sind Spikes regelmäßig kein Problem.

Aber in deinem Fall stellt sich das Problem gar nicht. Wenn du den OPV 
mit der gleichen Spannung versorgst wie den µC, dann kann der keine 
höhere Spannung ausgeben. Und die ganze Mimik mit Impedanzwandler und 
antiparallelem Diodenpaar kannst du auch vergessen. Wenn du den ADC mit 
sagen wir mal Vref=2.5V betreibst (dann paßt eine Bandgap-Referenz wie 
TL431) dann brauchst du für 300mV FS eine Verstärkung von 8.3 bzw. für 
10mV FS eine von 250. Dafür reicht ein einzelner OPV. Das muß natürlich 
ein rail-to-rail Typ sein.


[1] auf welchen Wert genau, darüber hüllen sich die Hersteller gern in 
Schweigen. Gerüchtehalber sind AVR bis 10mA im grünen Bereich. Wenn du 
bei 1mA bleibst, bist du in jedem Fall sicher.

von Harry R. (harryr)


Lesenswert?

Axel S. schrieb:
> Harry R. schrieb:
>> Die von mir zu messende Spannung liegt zwischen 0mV - 300mV .
>> Mich interessiert nur der Bereich zwischen 0 - 10mV.
>
> Das ergibt keinen Sinn. Willst du nun Spannungen von 11mV bis 300mV
> messen können oder nicht?
So wird ein Schuh draus:
- das Signal kann zwischen 0 - 300mV liegen
- mich interessiert nur der Bereich zwischen 0 und 10 mV
- ein OpAmp vor dem analogen Eingang mit gain 10 würde den 
Eingangsbereich auf 0 - 3V erhöhen, der für mich interessante Bereich 
wäre dann
0-100mV.Ein Gain von 100 würde die Eingangsspannung auf 0-30 V erhöhen,
da der OpAmp aber nur max 5V VDD hat wären es real 0 - 5V.
Der für mich interessante Teil wäre dann 0 - 1V.
Wenn ich dann eine Referenz von 1024 mV für den ADC wählen würde 
(Auflösung 1mV) hätte ich eine Auflösung von 10 Bit auf die 
Ursprungsspannung von 0 - 10 mV.Anders herum, durch das gain erhöhe ich 
die Auflösung um den Faktor 100, wenn ich gleichzeitig akzeptiere, dass 
der Messbereich eigentlich weit überschritten wird, messe also 0 - 10mv 
mit einer Auflösung von 10µV.
Das sind nur Rechenbeispiele, das gain kann auch ganz kleiner sein, man 
wird sehen.

> Auf jeden Fall wird dir kein in einem µC befindlicher ADC einen
> Fullscale-Wert von 300mV (oder gar 10mV) liefern. Also wirst du um einen
> vorgeschalteten OPV als Verstärker nicht herum kommen.
Genau, siehe oben.

> Manche µC haben
> aber PGA (programmable gain amplifiers) Blocks eingebaut. Die kann man
> dann natürlich auch verwenden.
Ich halte das für eine gute Idee, so weit bin ich aber noch nicht.

> Und das mit der Spannungsbegrenzung auf Vss-0.3V bzw. Vdd+0.3V muß man
> auch nicht so eng sehen. Dabei geht es um die Schutzdioden, die
> praktisch jeder µC an fast jedem Eingangspin hat (eine nach Vdd, eine
> nach Vss). Bei 0.3V leiten die noch gar nicht. Deswegen ist diese
> Spannung erlaubt. Bei 0.6V fangen sie langsam an zu leiten. Wenn man
> aber den Strom begrenzt [1], z.B. durch einen geeigneten Vorwiderstand,
> dann ist alles Paletti. Genauso wenn die Quelle den Strom bzw. die
> Energiemenge begrenzt. Deswegen sind Spikes regelmäßig kein Problem.
Okay.
> Aber in deinem Fall stellt sich das Problem gar nicht. Wenn du den OPV
> mit der gleichen Spannung versorgst wie den µC, dann kann der keine
> höhere Spannung ausgeben. Und die ganze Mimik mit Impedanzwandler und
> antiparallelem Diodenpaar kannst du auch vergessen. Wenn du den ADC mit
> sagen wir mal Vref=2.5V betreibst (dann paßt eine Bandgap-Referenz wie
> TL431) dann brauchst du für 300mV FS eine Verstärkung von 8.3 bzw. für
> 10mV FS eine von 250. Dafür reicht ein einzelner OPV. Das muß natürlich
> ein rail-to-rail Typ sein.
Ja,das entspricht ja meiner Idee, s.o.
>
> [1] auf welchen Wert genau, darüber hüllen sich die Hersteller gern in
> Schweigen. Gerüchtehalber sind AVR bis 10mA im grünen Bereich. Wenn du
> bei 1mA bleibst, bist du in jedem Fall sicher.

Danke und Grüße

von Axel S. (a-za-z0-9)


Lesenswert?

Harry R. schrieb:
>> Das ergibt keinen Sinn. Willst du nun Spannungen von 11mV bis 300mV
>> messen können oder nicht?
> So wird ein Schuh draus:
> - das Signal kann zwischen 0 - 300mV liegen
> - mich interessiert nur der Bereich zwischen 0 und 10 mV

Das ist doch wieder Wischiwaschi.

Interessiert dich nun der Meßwert oberhalb von 10mV oder nicht? Das ist 
doch eine einfache Frage. Die meisten (alle?) ADC regieren auf 
Eingangsspannungen oberhalb Fullscale einfach darauf, daß sie den 
maximalen digitalen Wert ausgeben. Du würdest dann also 0..10mV messen 
und könntest eine höhere Eingangsspannung zumindest erkennen.

Denn es macht einen Unterschied in der Auflösung deiner Messung ob du 
das Equipment für 10mV oder 300mV Fullscale auslegst. Dazwischen liegt 
ein Faktor 30 um den deine Messung dann genauer sein könnte.

Harry R. schrieb:
> Wenn ich dann eine Referenz von 1024 mV für den ADC wählen würde
> (Auflösung 1mV) hätte ich eine Auflösung von 10 Bit auf die
> Ursprungsspannung von 0 - 10 mV

Du kannst keine 1024mV als Referenz nehmen. Zumindest nicht mit dem 
ursprünglich gewählten µC. Die minimale Referenzspannug ist dann 1.8V. 
Wenn du eine kleinere Referenzspannung verwendest, dann wird der Fehler 
des ADC größer. Denn z.B. die Offsetspannung des Komparators im ADC ist 
unabhängig von der Referenzspannung. Je kleiner die Referenzspannung, 
desto größer deren Einfluß.

: Bearbeitet durch User
von Harry R. (harryr)


Lesenswert?

Axel S. schrieb:
> Harry R. schrieb:
>>> Das ergibt keinen Sinn. Willst du nun Spannungen von 11mV bis 300mV
>>> messen können oder nicht?
>> So wird ein Schuh draus:
>> - das Signal kann zwischen 0 - 300mV liegen
>> - mich interessiert nur der Bereich zwischen 0 und 10 mV
>
> Das ist doch wieder Wischiwaschi.
>
> Interessiert dich nun der Meßwert oberhalb von 10mV oder nicht? Das ist
> doch eine einfache Frage. Die meisten (alle?) ADC regieren auf
> Eingangsspannungen oberhalb Fullscale einfach darauf, daß sie den
> maximalen digitalen Wert ausgeben. Du würdest dann also 0..10mV *messen*
> und könntest eine höhere Eingangsspannung zumindest erkennen.
Oberhalb von 10mV interssiert mich nicht.
Der maximale Fullscalewert <=> maximalen digitalen Wert interessiert 
mich nur insofern, dass ich dann weiß, dass der Messwert über 10mV ist.
> Denn es macht einen Unterschied in der Auflösung deiner Messung ob du
> das Equipment für 10mV oder 300mV Fullscale auslegst. Dazwischen liegt
> ein Faktor 30 um den deine Messung dann genauer sein könnte.
>
> Harry R. schrieb:
>> Wenn ich dann eine Referenz von 1024 mV für den ADC wählen würde
>> (Auflösung 1mV) hätte ich eine Auflösung von 10 Bit auf die
>> Ursprungsspannung von 0 - 10 mV
>
> Du kannst keine 1024mV als Referenz nehmen. Zumindest nicht mit dem
> ursprünglich gewählten µC. Die minimale Referenzspannug ist dann 1.8V.
> Wenn du eine kleinere Referenzspannung verwendest, dann wird der Fehler
> des ADC größer. Denn z.B. die Offsetspannung des Komparators im ADC ist
> unabhängig von der Referenzspannung. Je kleiner die Referenzspannung,
> desto größer deren Einfluß.
Ja, es waren doch alles bisher nur Gedankenspiele :-)
Die Wahl welchen PIC16F1 ich verwende ist noch nicht gefallen.
Auch alle Zahlenspiele sind nur als Beispiele zu betrachten.

Bisher steht für mich nur fest, dass ich durch den vorgeschalteten OpAMP
"meinen" Spannungsrange (0-10mv) auf einen höhreren Spannungsbereich 
"multipliziere" , dadurch habe ich da dann einfach eine bessere 
Auflösung.
Konkret, ich will eigentlich messsen, wann ein Signal quasi keins mehr 
ist (zu klein, nur noch Rauschen und ein paar Spikes aus der Umwelt). 
Alles über dem Bereich enthält genügend "Nutzsignal" und es reicht mir 
das zu wisssen. Oder ganz profan, der ganze Aufwand kulminiert in dem 
Ergebnis, da ist nicht genügend Signal(amplitude) oder halt doch.

von Axel S. (a-za-z0-9)


Lesenswert?

Harry R. schrieb:
> Konkret, ich will eigentlich messsen, wann ein Signal quasi keins mehr
> ist (zu klein, nur noch Rauschen und ein paar Spikes aus der Umwelt).

Das klingt nicht nach einem Job für den ADC. Eher für den Analog- 
Komparator (oder halt einem externen Komparator). Und dann ein bischen 
digitale Signalverarbeitung hinterher. Im einfachsten Fall ein 
gleitender Mittelwert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.