Pomoc oko referentnog napona za ADC 16f88

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
MIKI73
Napredujem
Napredujem
Posts: 107
Joined: 01-11-2014, 16:57

Pomoc oko referentnog napona za ADC 16f88

Post by MIKI73 »

Pozdrav svima.Interesuje ne kako povezati referentvi napon na pic 16f88 ako merimo na pr 50V ? odnosno odakle ga uzimamo i na kojim pinovima povezati.U DS pise da se koriste pinovi

The ANSEL bits for AN3 and AN2 inputs must be configured as analog inputs for the
VREF+ and VREF- external pins to be used.
Ako moze neka semica ukratko kako dovesti VREF (a da nije Vdd i Vss ) na ovim pinovima i da li VREF uzimamo sa 5V napona napajanja ili sa napona koji merimo pa ga otpornicima smanjimo na na pr. na 2V i dovedemo na pic.
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Pomoc oko referentnog napona za ADC 16f88

Post by Maki »

Opčenito, referentni napon je napon s kojim se uspoređuje neka vrijednost. U prijevodu referentni napon je konstantan. Što je referentni napon stabilniji (znaš njegovu stvarnu vrijednost), mjerenja su preciznija.
Kako bi mjerio veče napone od 5V, moraš koristiti otporničko djelilo.
Za mjerenje 50V možeš postaviti otporničko dijelilo u omjeru 1:9 .
Praktičan primjer. Spojiš dva otpornika u seriju. Prvom koji je spojen na masu postaviš vrijednost na R, a drugom koji je spojen na mjernu točku (u tvom slučaju 50V) postaviš vrijednost na 9R. R je bilo koja veličina otpornika, što veća manje utječe na mjerenu veličinu.
Zatim srednji izvod spojiš na jedan od analognih ulaza PIC-a te očitavaš tu vrijednost, a preračunavanjem očitane dobiš stvarnu. Mase su im zajedničke.
Uvijek postoje problemi, ali bitnij problem koji moraš zadovoljiti je da ti na PIC ne dođe preveliki napon jer bi moglo doči do uništenja PIC-a.
Zapravo ne trebaš mjenjati referentni napon, možeš ga postaviti na +5V odnosno na radni napon MCU-a.
MIKI73
Napredujem
Napredujem
Posts: 107
Joined: 01-11-2014, 16:57

Re: Pomoc oko referentnog napona za ADC 16f88

Post by MIKI73 »

To je uredu i meri mi tacno pa me interesuje cemu onda drugi VREF napon,da li se postize veca tacnost sa tim ?
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Pomoc oko referentnog napona za ADC 16f88

Post by Maki »

Mjenjanjem Vref se omogučuje mjerenje nekih veličina, a da se pritom iskoristi maksimalna rezolucija ADC-a.
Uzmimo za primjer da imaš neki senzor koji ti na izlazu daje napon u rasponu od 0-2V. Ti taj napon možeš pojačati pa dobitit raspon od 0-5V. Međutim sve ti se komplicira, moraš koristiti opamp (zahtijeva +/- 8V) i još neke stvari... Mjenjanjem referentnog napona na 2V ti si dobio maksimalnu rezoluciju (npr. ADC ti je 10bit) kojom pokrivaš mjerenje tog senzora.
MIKI73
Napredujem
Napredujem
Posts: 107
Joined: 01-11-2014, 16:57

Re: Pomoc oko referentnog napona za ADC 16f88

Post by MIKI73 »

Zamolio bih sam za jos nesto.Evo ovaj kod radi kod mene super sa VREF Vdd Vss pa sam hteo da pitam sta bi sad trebalo izneniti u kodu za VREF 2V ? Nemam dovoljno razumevanja da shvatim zasto je na pr BROJ */ 500 ali nema veze snacicu se samo sto nisam nasao nikakav primer na internetu gde se koristi drugi VREF pa bih zmolio samo za tu izmenu da vidim sta i kako.

DEFINE OSC 4

DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50
ANSEL=%11111111
ADCON1=%10000000
ADCON0=%11000101
TRISA = %11111111
BROJ Var WORD

POCETAK:
ADCIN 0 , BROJ
BROJ = ( BROJ */ 500)>>2*10 ' mnozenje sa 4 jer je otpornicki niz 1:4
lcdout $FE, $80, "DC Volts=",DEC (BROJ/100),".", DEC2 BROJ,"V"
pause 10
GOTO POCETAK:
END
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Pomoc oko referentnog napona za ADC 16f88

Post by Maki »

MIKI73 wrote:...Nemam dovoljno razumevanja da shvatim zasto je na pr BROJ */ 500 ali....
Nisam se dosad susretao sa takvim zapisom, možda netko drugi zna.

U datasheetu na stranici 117 nalazi se podatak o ADCON1 registru. Govori koju ulogu ima određeni bit registra.
treba obratit pozornost na 5. i 4. bit koji utječu na referentni napon. Postavljanjem 5. bita u "1" i 4. bita u "0" odabrano je da se za + pol referentnog napona uzme neki napon sa Vref pina dok je donji pol (-) minus spojen na masu.

Također se može postaviti mod u kojem se pozitivan pol referentnog napona dovodi na Vref+, a negativan pol referentnog napon dovodi na Vref-.
Tu možeš ograničiti mjerno područje na npr. 1-2V tj. da na tom rasponu dobiješ maks. rezoluciju od 1024 :wink:

Prvi spomenuti slučaj bi izgledao ovako u tvom kodu:

Code: Select all

DEFINE OSC 4

DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100 

Define  ADC_BITS  10      
Define  ADC_CLOCK 3       
Define  ADC_SAMPLEUS  50  
ANSEL=%11111111	 
ADCON1=%10110000  'tu je napravljena izmjena
ADCON0=%11000101
TRISA = %11111111
BROJ Var WORD      

POCETAK:
ADCIN 0 , BROJ 
BROJ = ( BROJ */ 500)>>2*10                        ' mnozenje sa 4 jer je otpornicki niz 1:4
lcdout $FE, $80, "DC Volts=",DEC (BROJ/100),".", DEC2 BROJ,"V"
pause 10
GOTO POCETAK     'Opcenito, tu nejde ":"
END
MIKI73
Napredujem
Napredujem
Posts: 107
Joined: 01-11-2014, 16:57

Re: Pomoc oko referentnog napona za ADC 16f88

Post by MIKI73 »

Za ADCON1 sam znao posesavanja,mislio sam da li treba nesto oko monozenja izmeniti tj ovde

BROJ = ( BROJ */ 500)>>2*10 ' Ispravka od malopre.mnozi sa 10 jer su otpornici 1:10

ali nema veze,valjda ce se pojaviti neki gotov primer negde na internetu.Ovaj kod je provereno dobar,bez greske radi pa ako nekom treba moze slobodno iskoristiti.Otpornici su 30k i 3.3k
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Pomoc oko referentnog napona za ADC 16f88

Post by Maki »

Oprosti, krivo sam te shvatio.

Principijalno, ako mjeriš npr. napon od 0-50V onda jednostavno u programu tih 50V rascijepkaš na rezoluciju ADC-a. Konkretno 1023 dijela za 10bitnu rezoluciju.

Matematicki:
Mjereni napon = (Maks. napon/1023)*ocitana trenutna vrijednost ADC-a.
Sad ti to zapišeš kako god tebi to odgovara za računanje :wink:

Pričekaj, možda netko zna što konkretno onaj zapis radi.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pomoc oko referentnog napona za ADC 16f88

Post by pedja089 »

*/ je neko specijalno mnozenje u pbp.
U gornjem primeru pomnozi BROJ sa 500, zatim podeli 256.

Code: Select all

There are two special multiplication operators that allow large result values to be handled in a special way. These operators ignore some of the least-significant bytes of the result and return higher order bytes instead. With PBPW, this allows you to work (in a limited way) with 32-bit multiplication results. With PBPL, the top 32 bits of a 48-bit result are available.
The '*/' operator discards the least-significant byte of the result (byte0), and returns the 4 higher bytes to the result variable. If the result variable is a word or byte, the value will be truncated to fit.
W3 = W1 */ W0 ' Multiply W1 by W0, ignorebyte0 of the result, return byte1 and byte2 in W3
L3 = L1 */ L0 ' Multiply L1 by L0, ignore byte0 of the result, return byte1 through byte4 in L3
A simple way to think about '*/' is that it shifts the result 8 places to the right, resulting in an automatic division by 256. (This does not hold true if the result is a negative number.) This is useful for multiplying by non-integer constants.
If you wished to convert miles to kilometers, for example, you would need to multiply by a constant 1.6. PBP's integer math won't allow you to write "1.6" in an equation, but you can use '*/' to accomplish the same result:
kilometers = miles */ 410
' Same as kilometers = (miles * 410) / 256
The '**' operator is similar, but ignores two bytes instead of one. When using PBPL with long variable types, it returns byte2 through byte5 of the 48-bit result value. This gives a result that is shifted 16 places to the right, an inherent divide by 65536.
W2 = W0 ** 1000 ‘ Multiply W0 by 1000 and place the high order 16 bits (which may be 0) in W2
Post Reply