ADC instellen bij een PIC16F877A

Hallo allen,

Ik ben op dit moment bezig met het digitaal uitlezen van mijn labvoeding (van deze site).

Opzich werkt het goed, maar ik krijg de PIC niet goed ingesteld.
Dit is de situatie:

code:


------|--------26.6V
      |
      |
     ----    5V Naar port A.0
     |  |    |
     |	|    |
100K |	|<----
Pot  |	|
     |	|
     ----
      |
      |
      |
--------------GND

De refspanning gebruik ik van de voeding van de PIC. Deze is exact 5V, net als de 5V van de potmeter.
De GND van de uitgaande spanning is met doorverbonden met de GND van het IC.

Het Probleem is dat ik met de onderstaande code de uitgelezen spanning niet helemaal precies krijg.
Bij 26.6V krijg ik een uitgelezen spanning van 26,9 en bij 10V een uitgelezen spanning van 9.6V.

pic basic code:


DEVICE 16F877A ;We gebruiken een 16F877A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, HS_OSC  
XTAL 20

ALL_DIGITAL TRUE                              ;Alle ingangen digitaal
PORTB_PULLUPS ON                              ;Alle pullup weerstanden voor de B poorten +5V (aan)


DECLARE LCD_ENPIN = PORTB.2
DECLARE LCD_RSPIN = PORTB.1
                                                                     
CLEAR


 ADIN_RES = 10                  
 ADIN_TAD = FRC                 
 ADIN_STIME = 50                
 DIM RAWvolts AS WORD 
 DIM VOLTS AS FLOAT
 DIM RAWstroom AS WORD
 DIM STROOM AS FLOAT
 DIM UITspanning AS BYTE

 TRISA = %00000011               
 ADCON1 = %11000000             

 DELAYMS 500                    
 CLS
 
WHILE 1 = 1
 RAWvolts = ADIN 0
 VOLTS = RAWvolts / 38,45865
 
 PRINT AT 1,1, DEC1 VOLTS, "V    ", DEC4 RAWvolts

WEND
END

Hoe kan ik dit verhelpen?
Ik denk zelf dat het met de instelling van

pic basic code:

VOLTS = RAWvolts / 38,45865

te maken heeft, maar ik weet niet hoe ik dit in moet stellen.
Iemand ideeën?
Alvast heel erg bedankt.

Murphy's Law: Anything you try to fix will take longer and cost more than you think.
Arco

Special Member

100k is veeel te hoog, max. 2k5 ingangsweerstand. (Zie datasheet)
Je kunt zo ook de spanning tot 26.6v opdraaien, dan blaas je de PIC input op.

[Bericht gewijzigd door Arco op vrijdag 27 juli 2012 16:15:37 (38%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
flash2b

Special Member

Voor mijn VAMT meter met 16F819 las ik 10x de ADIN in en deelde dit door 10 om een stabielere waarde te krijgen.

Ik zou met een hoogohmige spanning deler doen, met daarachter een op-amp. Zie IC2a (link hieronder), de negatieve voeding en de diode daarachter zijn dan niet nodig.

http://www.circuitsonline.net/forum/view/message/1340892#1340892

They say attention is a shovel. It's time to dig 'em out.

@ Arco.
Ja inderdaad, helemaal gelijk.
Heb t nu veranderd(en weer ingesteld op 5V) maar de gemeten spanning blijft gelijk helaas.

Murphy's Law: Anything you try to fix will take longer and cost more than you think.
Arco

Special Member

Schrijf dan eerst eens de gevonden waarde (rawvolts) naar het display, dan weet je of die klopt. Heb je de potmeter al vervangen door wat lagers?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

@Flash2b:
Ik heb jou opstelling nagemaakt(met een op496), maar de uitgangsspanning van de opamp komt dan niet hoger dan 2.5V

@Arco:
Ik heb de potmeter inderdaad al vervangen.
De waardes zijn:
1023 bij 26.6V
998 bij 25V
798 bij 20V
591 bij 15V
383 bij 10V
176 bij 5V
0 bij 0V

En toen ging er bijna een lampje branden.

pic basic code:


VOLTS = RAWvolts / 1023 * 26.6

Hiermee kom ik al in de buurt 10V is nu 9.8V, maar 26.6 V is wel netjes 26.6V

Murphy's Law: Anything you try to fix will take longer and cost more than you think.

Inderdaad staat er in de datasheets dan de pot max. 2K5 mag zijn (soms wel 3K).
Dan is het wel erg grappig om te zijn dat MC zelf pots van 10K op de experimenteerprintjes zet.

Je meetwaarden zien er toch best redelijk lineair uit.

Pas even op met dit soort berekeningen:
RAWvolts is een Word.
VOLTS is een Float.

VOLTS = RAWvolts / 38,45865

Het zou zomaar kunnen zijn dat die 38,45865 wordt afgekapt op 38 (omdat RAWvolts een word is).

Dit zou je kunnen uittesten door te delen door bv 38,123. Zou een ander resultaat moeten opleveren.

En anders kun je nog altijd het volgende proberen

VOLTS = RAWvolts (gaat altijd goed)
VOLTS = VOLTS / 38,45865

Just find out what you like and let it kill you

Ondertussen de 2de ADC ingang gesloop door er met mijn stomme kop 21V op te zetten. Vond ie niet leuk.
Dus nu gaan we verder met een PIC18F252. Na enig gepruts deze toch aan de praat gekregen en de config's achterwegen gelaten (dus aleen DEVICE 18F252 en XTAL 20 er neer gezet), omdat ik het niet voor elkaar krijg om deze goed neer te zetten.

@hadv:
ik heb inderdaad geprobeerd om het te delen door een ander getal te delen en er komt een ander getal uit.

Wat ik niet helemaal snap is dat ik moet opletten met WORD en FLOAT.
Is dit omdat het geheugen dan vol loopt en de PIC vast loopt? of is het om een andere reden?
De waarde word namelijk niet afgekapt of zo.
Hoe zou ik dit anders kunnen oplossen?

Murphy's Law: Anything you try to fix will take longer and cost more than you think.
flash2b

Special Member

Op 27 juli 2012 17:15:01 schreef jorim23:
@Flash2b:
Ik heb jou opstelling nagemaakt(met een op496), maar de uitgangsspanning van de opamp komt dan niet hoger dan 2.5V

Nee dat klopt, aangezien ik een externe 2.5V refentie gebruik (TL341). Als je 5V wilt zul je de spannings deler R9//R10 + R11 aan moeten passen !!

Je moet dan R11 iig verhogen.

They say attention is a shovel. It's time to dig 'em out.
Arco

Special Member

Je deelt een word door een float. Het hangt van de compiler af wat die daar precies van maakt... Ik zou eerst een wat veiligere opstelling maken, zodat er niet meer dan 5V op de input kan komen.

Klopt 38,45865 trouwens wel? (normaal is de punt de separator, niet een komma)

[Bericht gewijzigd door Arco op vrijdag 27 juli 2012 22:03:43 (18%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Maar een Float is toch groter dan een Word?
ik heb trouwens even gekeken of het verschil maakt door de komma te veranderen met een punt, maar dat maakt niet uit.

@flash2b:
ik heb de volgende opstelling gemaakt:

code:


------|--------26.6V
      |  -----
      |      |
     ----    2K18 k
     |  |    |		
     |	|    |		|-----\         2K7
2,5K |	|<-------------3| +    \      |-----|
Pot  |	|    |		|       >1--|-|     |----naar port A.0
     |	|    |	     --2| -    /    | |-----| 
     ----    |       |  |-----/     |
      |	    628 Ohm  |              |
      |	     |	     |--------------|
      |	     |	      
--------------GND

Maar de versterking wordt een verzwakking klopt dat?
Jij had het over de meting 10 keer uitvoeren en daar het gemiddelde van berekenen. Mag ik weten hoe jij dat gedaan hebt?

Murphy's Law: Anything you try to fix will take longer and cost more than you think.

Compilers hebben zo hun eigen manieren om berekeningen met verschillende datatypen uit te voeren.
Vooral als het gaat om float-achtigen en integer-achtigen.

Dat Float groter is dan Word is niet belangrijk.

Ik heb het stukje even door de compiler gehaald en in de .asm gekeken.
Zo te zien doet-ie een keurige int16 naar float32 conversie.

Just find out what you like and let it kill you
flash2b

Special Member

Je maximum te meten waarde is 5V. De CO labvoeding is maximaal 30V. Je zult dus een spannings deler van 5/30 = 1/6 moeten maken.

Als je een potmeter gebruikt van 2K5 dan moet je die in serie zetten met een een 12K5 weerstand. 2K5 / (2K5 + 12K5) = 1/6.

Dus 12K5 aan de V+, andere kant v/d 12K5 aan je potmeter, andere kan potmeter naar massa, en de loper naar de ingang van de op-amp.

Je kunt met je loper nu trimmen dat je met een 30V voeding tot het max van 5V komt.

Omdat jij als max 26.6V gebruikt, zul je zelf even de juiste waarde van die serie weerstand moeten uitrekenen.

Maak een for-next loop rond je ADIN statement, met een 10x lus tel je steeds de waarde van ADIN op in een variable, aan het einde van je for-next deel je die variable door 10.

pic basic code:


RAWvolts= 0
FOR X=1 to 10
 RAWvolts = ADIN 0 + RAWvolts
NEXT X
RAWvolts = RAWvolts /10
They say attention is a shovel. It's time to dig 'em out.
Arco

Special Member

Ik doe voor batterijspanningsmeting ook altijd een gemiddelde van een aantal metingen. Of:

code:

((oude waarde * 4) + nieuwe waarde) / 5  

werkt ook goed. Als je Vcc als Vref gebruikt, is dat veel te instabiel om een solide meetsignaal te krijgen. Bij 50mV rimpel (helemaal niet ongebruikelijk) spreken we al over een verschil van 11 stapjes bij 10 bits A/D.

Je kunt ook de PIC omwisselen voor een 16F1937 (pin-compatible), die heeft een interne Vref van 4.096V, heel handig...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
flash2b

Special Member

Vandaar dat ik een voor de Vref een TL431 gebruik en alles naar de 2.5V omreken. Maar je kan een TL431 ook op 5V of 4.096V instellen, of een externe 4.096V ref gebruikten.

They say attention is a shovel. It's time to dig 'em out.