0-35V meten mbv. 16F819 ADC

Wat ik van plan ben is een gelijkspanning van 0V tot 35V te meten mbv. een 16F819 en dit een een LCD weer te geven.

Met behulp van Google en verschillende topics op CO ben ik tot dit schema gekomen:
http://home.kpn.nl/w_ermers/misc/pic%20dvm.jpg

Wat ik hierbij in gedachte had:
R2, R3 en instelpot R4 vormen een spanningsdeler. Bij 35V op de ingang, bedraagt de spanning aan pin 3 van de LM358 nog net iets minder dan 5V. De LM358 wordt (gevoed door een spanning van +12V) gebruikt als spanningsvolger en stuurt via weerstand R5 een spanning van 0V tot 5V naar de ADC van een 16F819.

Ik heb nog nooit eerder iets met een op-amp gedaan, dus ik ben er niet zeker van dat ik de theorie helemaal snap. Nou ben ik er niet bang voor om af en toe iets te proberen en daarbij een ic-tje op te blazen, maar ik heb maar 1 stuks LM358 liggen. Als deze 'poef' zegt, kan ik er voorlopig niet verder mee, totdat ik weer een redelijk bestellijstje bij elkaar heb.

Mijn vraag is dus:
Klopt dit schema een beetje; kan ik hiermee wat experimenteren of doe ik iets structureel fout?

[edit]
Ik zie net dat ik een waarde ben vergeten te veranderen: R2 zou 3k9 moeten zijn i.p.v. 3k3.
[/edit]

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!

Bij gebrek aan reacties maar gewoon op deze manier geprobeerd en alles is heel gebleven.
Resultaat viel me wel tegen.

In eerste instantie had ik de spanningsdeler gebruikt zonder de LM358. Theoretisch is de delerwaarde dan iets van 0,14-nogwat. Dit is natuurlijk afhankelijk van de nauwkeurigheid van de weerstanden, dus daar komt de trimpot in beeld om het af te kunnen regelen zonder in het programma exact de juiste deler in te hoeven voeren. Als ik dit echter doe bij bijv. 15V (een beetje in het midden), dan komt de meter in het grootste deel van het bereik heel aardig overeen met mijn multimeter. Bij hele lage waardes echter (onder de 3V) geeft de meter 0,1V te weinig aan. Bij grote waardes (boven de 25V) geeft de meter 0,1 à 0,2V te veel aan.

Ik had verwacht dat dit opgelost zou worden door de op-amp er tussen te zetten, maar dat maakt dus geen bal uit. Nog steeds dezelfde afwijkingen.
Verder nog wat zitten variëren met lagere en hogere weerstandswaardes (wel in dezelfde verhouding), maar daar zie ik ook geen verschil.

Is er een manier om de meting op deze manier toch nog meer lineair te krijgen, of moet ik dan het bereik opsplitsen over meerdere spanningsdelers?
Ik hoef met deze meter geen mVolts te kunnen meten, maar een nauwkeurigheid van +/- 0,05V zou toch wel fijn zijn.

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!

Ik heb ook nog steeds plannen om zoiets te maken, maar dat is er vooralsnog niet van gekomen. Als je zoekt op dit forum op "dvm pic" dan vind je wel het een en ander. Bijvoorbeeld deze: http://www.circuitsonline.net/forum/view/59433/1/dvm+pic

Hopelijk helpt dit je een beetje.

Wat ik zo gauw uit het "PIC_DVM"-schema begrijp, is dat er voor de voltmeter alleen een spanningsdeler wordt gebruikt en geen op-amp.
Wat ik daar linksonder dan over hou is: R10 en R15; vervolgens C5 naar de 0; vervolgens R13 en R14 naar de 0; R16; C6 naar de 0 en dan heb ik het signaal waar de ADC het mee moet doen.
Ik ga hier eens wat mee proberen.

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!

Ik denk dat het door de PIC komt. Ik gebruik zelf in een voedingkje ook een PIC16f819 voor de spanningsmeting en die voldoet precies aan jouw beschrijving van de niet-lineairiteit...

Ik denk dat de meest betrouwbare meting nog altijd met een externe ADC is...

Henry S.

Moderator

Op 13 maart 2010 23:10:30 schreef fritsuitoosterstreek:
Ik denk dat het door de PIC komt.

Ik denk het niet. ;)

-zorg voor een opamp die 100% met zowel ingangen als uitgangen echt tot 0V kan gaan, CA3130, CA3140, plus nog wat modernere. Of zorg voor een symetrische spanning (7660 converter). En zorg dat de opamp genoeg headroom heeft, heb je goed gdaan.
-zorg voor een nauwkeurige referentie, bijv 2.5V bandgap.
-zorg voor een nauwkeurige offset regeling, 0V op de ingang moet echt OV op de ADC geven en niet een paar mV hoger.
-Maak de versterking van de opamp regelbaar en je ingang met een vaste deler.
-gebruik 10-slageninstelpotmeters.
-gebruik het volledige bereik van de ADC.
-belast de ADC volgens datasheet, dat heb je goed gedaan zo.
-denk programmeertechnisch om afrondingen.

BTW, het getoonde schema bevat diverse fouten die op de bovenstaande regels slaan. En de maximale waarde van de ADC is geen 1024, maar 1023!

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

Op 13 maart 2010 23:30:03 schreef Henry S.:
[...]
Ik denk het niet. ;)

Ik geloof je.

-zorg voor een opamp die 100% met zowel ingangen als uitgangen echt tot 0V kan gaan, CA3130, CA3140, plus nog wat modernere.

Dit advies van je had ik al ergens in een topic gelezen, maar een LM358 had ik zo liggen. Ik zal per eerste gelegenheid iets anders bestellen

-zorg voor een nauwkeurige referentie, bijv 2.5V bandgap.

Hmm, schreef jij niet ook ergens dat een 7805 voeding nauwkeurig genoeg is als referentie voor dit soort toepassingen?
Waarom trouwens die 2,5V en geen 5V (of 4,096V)? Als ik van 0 tot 35 wil meten met 1 cijfer achter de komma heb ik toch genoeg resolutie met een 10-bits ADC i.c.m. een Vref van 5V?

-zorg voor een nauwkeurige offset regeling, 0V op de ingang moet echt OV op de ADC geven en niet een paar mV hoger.

In mijn huidige opstelling krijg ik inderdaad een AD-waarde 0 bij 90mV.

-Maak de versterking van de opamp regelbaar en je ingang met een vaste deler.

OK.

-gebruik 10-slageninstelpotmeters.

Doe ik.

-gebruik het volledige bereik van de ADC.

Je bedoelt Vref = AD-waarde 1023?

-belast de ADC volgens datasheet

Ik neem aan dat je hiermee die 2k7 weerstand bedoelt?

-denk programmeertechnisch om afrondingen.

Mijn laatste programmeerervaringen stammen uit het Turbo-Pascal en AutoLisp tijdperk. Sinds kort met PicBasic aan de gang, maar het begint allemaal wel weer een beetje te dagen.

BTW, het getoonde schema bevat diverse fouten die op de bovenstaande regels slaan. En de maximale waarde van de ADC is geen 1024, maar 1023!

1024 waardes, van 0 tot 1023 toch? ;)

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!

Op 13 maart 2010 23:02:34 schreef Willis:
Wat ik zo gauw uit het "PIC_DVM"-schema begrijp, is dat er voor de voltmeter alleen een spanningsdeler wordt gebruikt en geen op-amp.

Klopt.
De grote truc is de condensator van 100nF. Deze geeft een lage impedantie voor de pic ADC waardoor het zonder opamp een zeer goed resultaat geeft. 10nF gaat trouwens ook nog prima, dat geeft een wat snellere reactie van het display op spanningsveranderingen.

Bij mij loopt de PIC-DVM gelijk op met mijn Dynatek DVM binnen 2 digits over de hele range. Gewoon met 2 weerstanden en een C van 100nF over de ADC ingang.

Bij stroommeting ontkom je niet aan een opamp, neem dan een goede rail to rail versie.
'Goedkope' opamps geven er gratis een niet-lineariteit bij..

Ik heb nu een CA3140E bemachtigd, maar ik krijg m'n meting nog steeds niet nauwkeuriger.
Het meetgedeelte is nu aangesloten volgens dit schema:
http://home.kpn.nl/w_ermers/misc/PIC%20DVM%20CA3140.JPG

De offset krijg zo echter niet op 0; die wordt minimaal 0,003V.
Ik heb het ook al geprobeerd met een weerstand van 1k of 10k tussen de loper van R4 en de 0, maar dat maakt geen verschil.

Bij de lage waardes van de te meten spanning heb ik nog steeds 0,1V te weinig op de lcd, en bij hoge waardes waardes 0,1 à 0,2V te veel.

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!

Heb je de ADC wel goed ingesteld staan? Aquisitietijd enz, in orde?
Dat kan zo'n onnauwkeurigheid veroorzaken.

Die CA3140 is geen railtorail opamp. Het zou kunnen dat de uitgang niet helemaal naar nul wil gaan. Ja zou kunnen proberen de uitgang met een pulldown weerstandje naar beneden te trekken.

Ik zou echter een opamp kiezen die beter geschikt is voor deze taak.
De LMC7101 doet het prima in m'n pic-DVM.

Geen rail2rail opamp zonder symmetrische voeding is sowieso vragen om verkeerde metingen omdat je buiten hun bereik gaat zitten. Rond hun voedingsspanning gedragen ze zich alles behalve lineair. Met een weerstand kan je dan inderdaad deze wellicht naar 0 krijgen, maar vooralsnog krijg je dan een afwijking in dat gebied.

Kijk dus echt even naar een andere geschikte opamp, er zijn er genoeg.

Overigens is R5 best hoog van waarde, let dan erop dat je lang genoeg sampled met een pic voordat je een adc conversie uitvoert. Bij de PIC moet namelijk de interne condensator eerst opgeladen worden. Een kleine 100nF condensator na R5 kan hierbij ook helpen.

http://www.020it.nl - Industriële elektronica ontwikkeling. - http://www.procircuits.nl

Mag ik even wat in de groep gooien?

Waarom wil je een OPAMP gebruiken?

In deze opstelling ("Spanningsvolger") zorgt de opamp er voor dat je de impedantie omlaag krijgt. Om de opamp te sparen, zet je er vervolgens weer een weerstand achter. Uitgangsimpedantie, toch 2k7. OK. Mij best.

De weerstandsdeler heeft een te hoge uitgangsimpedantie? Nee, die is ergens tussen de 2k en de 3k. Dat lijkt mij precies een mooie waarde om direct aan de microcontroller te hangen. Jou kennelijk ook. Je zet er 2k7 tussen....

Het enige wat de opamp voor mekaar krijgt is dat ie een offset introduceert.

Oh ja, als je nu rare waardes (300V) op je ingang zet, blaas je nu een dure opamp op en niet een microcontroller. Wow!

Wat mij betreft mag je de opamp er tussenuit halen. Ik zie het nut er niet van in.

Dat je metingen bij lage waardes te veel, bij grote waardes te weinig zijn, implicieert nog niet "niet lineair" mogelijk is er gewoon een lineaire relatie: Y=aX + b;

Dus calibreer hem eens door bij 5V en bij 30V (of 10 en 25) de ADC waarde te meten en dan daar een rechte lijn door heen te maken (met als uitgangs waarde de voltages).

[Bericht gewijzigd door rew op 19 maart 2010 08:20:49 (12%)]

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Algemene regel voor een lage uitgangs-offset-spanning bij opamps is dat beide ingangen dezelfde impedantie moeten zien tov. de voeding.

je hebt aan de niet-invertedende ingang een spanningsdeler hangen met inwendige weerstand X.
de inverterende ingang hangt echter direkt aan de laagohmige uitgang van de opamp (spanningsvolger).
Je zou in die verbinding een weerstand moeten toevoegen met waarde X om de offset klein te houden.

Dit geldt algemeen voor elke op-amp, omdat de lekstromen in de ingangen een bepaalde spanningsval veroorzaken over de weerstand die een ingang 'ziet'. Is voor beide ingangen die spanningsval ongeveer gelijk, wordt een extra spanningsverschil wat hierdoor ontstaat niet meeversterkt in het uitgangssignaal.

Overigens varieert deze lekstroom met de spanning op de ingang (tov. de voedingsrails). dit kan mede een oorzaak zijn voor kleine afwijkingen bij extreme ingangsspanningen (nabij de positive of negatieve voedingsspanning)

Henry S.

Moderator

Op 19 maart 2010 06:53:25 schreef Zonnepaneeltje:
Die CA3140 is geen railtorail opamp. Het zou kunnen dat de uitgang niet helemaal naar nul wil gaan.

Die wil zelfs onder 0V, die opamp is het probleem niet.

Maar de opamp moet je idd als nietinverterende versterker gebruiken, 2k5 potmeter (regelt deelfout in je deler weg) als terugkoppeling, en weer een 2k7 op de inverterende ingang naar de massa.

Op 19 maart 2010 08:18:24 schreef rew:
Om de opamp te sparen, zet je er vervolgens weer een weerstand achter. Uitgangsimpedantie, toch 2k7. OK. Mij best.

Dat is hier niet de functie van de weerstand, 2k7 ligt dicht in de buurt van de optimale ingangsimpedantie van de ADC. Te laag (uitgang opamp) is dus ook niet goed.

[Bericht gewijzigd door Henry S. op 19 maart 2010 15:10:56 (29%)]

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

Op 19 maart 2010 14:34:47 schreef Henry S.:
[...]
Die wil zelfs onder 0V, die opamp is het probleem niet.

Voor de duidelijkheid. Ik had het niet over de ingang maar over de uitgang, die kan niet tot 0V. Dus 0v in (als spanningsvolger) is >0v uit.

http://www.020it.nl - Industriële elektronica ontwikkeling. - http://www.procircuits.nl

Op 19 maart 2010 14:34:47 schreef Henry S.:
...
Maar de opamp moet je idd als nietinverterende versterker gebruiken, 2k5 potmeter (regelt deelfout in je deler weg) als terugkoppeling, en weer een 2k7 op de inverterende ingang naar de massa.
...

Dus:
2k5 potmeter = tussen pin 6 en pin 2 ?
2k7 weerstand = tussen pin 2 en de massa ?

Zal vandaag niks uithalen, maar ik ga het morgen meteen proberen.
Ik meld me weer met de resultaten.

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!
Henry S.

Moderator

Op 19 maart 2010 16:17:57 schreef willyp:
Voor de duidelijkheid. Ik had het niet over de ingang maar over de uitgang, die kan niet tot 0V. Dus 0v in (als spanningsvolger) is >0v uit.

De uitgang kan wel tot 0V. Is een bekende eigenschap van de 3130 en 3140.
Heb dit al een paar keer toegepast (3130), zonder compensatie heb je hooguit een paar mV offset wat dan prima is weg te regelen.

Op 19 maart 2010 17:06:55 schreef Willis:
2k5 potmeter = tussen pin 6 en pin 2 ?
2k7 weerstand = tussen pin 2 en de massa ?

Klopt.

[Bericht gewijzigd door Henry S. op 19 maart 2010 18:05:23 (11%)]

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

Door omstandigheden heeft het even wat meer tijd gekost om het uit te proberen, maar het wil nog steeds niet lukken.

Even voor de duidelijkheid:
Zoals ik het begrepen heb, heeft de opamp een bepaalde offset-waarde en moet je deze op 0 afregelen met de 10k potmeter (R4). Toch?
Dat lukt me dus al niet; ik kom niet lager dan 3mV.

Ik heb onderstaand lijstje gemaakt met meetgegevens.

Vref=5080mV (gemeten)
10 bits meting: 2^10=1024
kwantisatie = 5080/1024 = 4,9609375
spanningsdeler R1=1M8 R2=270k = 0,1304348

Als voorbeeld even de gegevens bij een afgelezen RAW waarde van 100:
Volgens de berekening in de PIC zou de spanning aan de ADC-ingang dan 496mV moeten bedragen (100/kwantisatie); ik meet echter 508mV; een verschil van -12mV.
Volgens de berekening in de PIC zou de spanning voor de spanningsdeler dan 3,80V moeten bedragen (100/kwantisatie/deler/1000); ik meet echter 3,83V; een verschil van +0,03V.
Over de hele linie is de afwijking na de opamp dus telkens negatief; voor de opamp positief en negatief.

Hoe moet ik hier de logica van zien?
Wat doe ik verkeerd, of wat meet ik verkeerd?

code:


	mVolt aan ADC ingang	    Volt aan spanningsdeler	
RAW	berekend gemeten verschil   berekend gemeten verschil
0	   0	    3	  -3	     0,00     0,00    0,00
20	  99	  110	 -11	     0,76     0,84    0,08
40	 198	  210	 -12	     1,52     1,58    0,06
60	 298	  310	 -12	     2,28     2,34    0,06
80	 397	  409	 -12	     3,04     3,08    0,04
100	 496	  508	 -12	     3,80     3,83    0,03
200	 992	 1006	 -14	     7,61     7,55   -0,06
300	1488	 1502	 -14	    11,41    11,29   -0,12
400	1984	 1999	 -15	    15,21    15,00   -0,21
500	2480	 2496	 -16	    19,02    18,75   -0,27
600	2977	 2994	 -17	    22,82    22,46   -0,36
700	3473	 3491	 -18	    26,62    26,22   -0,40

Dit is de code van het programma:

code:


Device 16F819                
Config INTRC_IO,WDT_OFF,BODEN_OFF,LVP_OFF,MCLRE_OFF, PWRTE_ON, CP_OFF
OSCCON = %01110000                                ; 8MHz 

'ADC waarde van kanaal 0 lezen en in variabele RAW plaatsen. 
Adin_Res = 10                                     ; 10-bit ADC resolutie 
Adin_Tad = FRC                                    ; Interne RC oscillator 
Adin_Stime = 50                                   ; 50us sample tijd
Dim RAW As Word 
Dim VOLTS As Word
Dim MVOLTS As Word
Symbol QUANTA = 4.9609375                         ; Vref 5080mV / 10 bits (2^10=1024)
Symbol DELER = 0.1304348                          ; Spanningsdeler 1M8 - 270k 

;        543210 
TRISA = %000001                                   ; AN0 (PORTA.0) is input 
;         76543210
ADCON1 = %10000100                                ; PORTA.0 analoog; Vref+=Vdd; Vref-=Vss  

DelayMS 500                                       ; LCD stabilisering

Clear                                             ; Wis RAM geheugen
Cls                                               ; Wis scherm; cursor linksboven

While 1=1                                         ; Meetlus 
 RAW = ADIn 0
 MVOLTS = RAW * QUANTA 
 VOLTS = MVOLTS / DELER
 Print At 1,1,"RAW=",Dec RAW,
 Print At 2,1,Dec MVOLTS,"mV - ",Dec VOLTS/1000, ".", Dec2 VOLTS/10, "V  "
Wend                                               

End                                               ;Einde programma
So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!
Henry S.

Moderator

-Offset, die moet idd weg te regelen zijn met de potmeter.
-Variaties in spanning na een passieve deler, het lijkt mij dat de opamp meespeelt. je gebruikt ook een hele hoogohmige deler. Bij ICL7106 DPM's gebruik je ook zo'n hoogohmige deler, en krijg je ook dergelijke meetfouten.
-De maximale waarde bij 10 bits is 1023, niet 1024.

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

Hij doet het!
...alleen snap ik niet waarom...

Wat heb ik gedaan:
- De hele zooi van het breadboard gehaald en alles opnieuw opgebouwd
- De weerstandsdeler veranderd in 3k3/22k.
- De kwantisatiefactor veranderd in 5080/1023.
(Henri had het al eerder gezegd, maar toch ging ik in de berekening nog steeds uit van 5080=2^10=1024 stapjes, i.p.v. 5080=max ADC-waarde=1023.)
- De 2k5 potmeter en 2k7 weerstand voor de gaininstelling veranderd in 10k potmeter en 10k weerstand (Ik had geen 10-slagen pot van 2k5; wel van 10k).

Toen domweg een beetje zitten spelen met de instelpotmeters van de gain en de offset en ineens geeft de display over het hele bereik de juiste waarde (binnen een tolerantie van enkele honderdsten volt).
Offset is nu iets van 9,6mV, maar toch krijgen ik de juiste waarden; zou toch eigenlijk niet moeten kunnen, of wel?

Weet je wat? Ik ga een printje etsen om alles in te kunnen bouwen. Ik verdiep me hier later nog wel eens in, als ik meer tijd heb, om uit te zoeken hoe het nu precies werkt of zou moeten werken.

So far...so good...KABOEM! | Cars, motorcycles and metalworking => Visit Willy's website!