Yes, Not sure why I am getting this math all assbackwards. I think I've spent to many years as a mumps programmer. I think I get this part so far. My range of .5 to 4.5 isn't relivant... yet. the 24/25 reading is going off a REF of 5v which as you pointed out makes complete sense to me. I keep frogetting to take that into account but I am learining and willing to learn. I jsut can't seem to get past that part I think I need to programatically figure out how to factor in my range is only going to be .5 to 4.5 or 0 to 4 or I must have to give the pic a VREF. If you can point me in the right direction I would appreciate it.
With in mind and I believe I get it so far I will post the program that I have been working on with some success. I think I am close.
Here is my program and my logic/math
So if my scale is 0-1024 with an internal ref of 5v and using an earlier example form Mack I would conclude give my sensor range of 0-150psi with an proportinate output voltage of .5 to 4.5v then...
(150-0) / (4.5-.5) = 37.5 psi per volt
150/1024 at a 5v ref range is .1464 psi per reading
That part I understand completely. The next part is were I am lost.
Converting the .5 -> 4.5v with an offset somehow so that works out to
0 -> 4 then calculating out that voltage to PSI which would be easy would it not be my vdc * 37.5?
0-1024 with a 5v ref gives me .0048 volts per incrment or 204.8 increments per volt. If I leave the 5v ref as it is then I think my offset would be -102.4 so to get the PSI reading I would take:
Given ADVal = reading from the ad result
( ADVal - 102.4 ) * .1464
Let's say I know the PSI is 75 then the calc should work... Half of 1024 would be 512 so ( 512 - 102.4 ) * .1464 = 59.96
but... my reading would not be 512 for 75 psi it would be 512+102.4 right? arghhhhhhhh I'l be back I have to sweep up the last of my hair!
Thanks for your help. I am trying.
P.S. It's a beautiful day here in Pennsylvania
David
INCLUDE "modedefs.bas"
' Hardware specific settings
@ DEVICE pic16F877, XT_OSC ' System Clock Options
@ DEVICE pic16F877, WDT_ON ' Watchdog Timer
@ DEVICE pic16F877, PWRT_ON ' Power-On Timer
@ DEVICE pic16F877, BOD_ON ' Brown-Out Detect
@ DEVICE pic16F877, LVP_ON ' Low-Voltage Programming
@ DEVICE pic16F877, CPD_OFF ' Data Memory Code Protect
@ DEVICE pic16F877, WRT_ON ' Flash Memory Word Enable
' ADC definitions 16F877 - (8) 10bit channels
'*****************************
DEFINE ADC_BITS 10 ' (8) 10 Bit channels
DEFINE ADC_CLOCK 3 ' tell the us per osc clock tick?
DEFINE ADC_SAMPLEUS 50 ' how long to sample the pin
DEFINE OSC 10
DEFINE LOADER_USED 1
'INIT ADC
ADCON1 = %10001110 ' Just one analog input needed see page 112 of 16f877 spec
ADCON0 = %11000001 ' Analog converter Fosc/32, ADC module is ON
'ADCON0.7 = 1 I DID THAT ABOVE RIGHT?
'Varibles
SO VAR PORTC.6
ADval VAR word ' Storage for A/D result
PRESSURE VAR word
PRESS VAR word
ADavg VAR WORD[2]
READING var byte
Value VAR WORD
'CONSTANTS
AvgCount CON 64 ' = Number of samples to average
FAspread CON 25 ' = Fast Average threshold +/-
BAUD CON 32
'**************************************
'****START OF PROGRAM*****
'**************************************
BEGIN:
SerOut2 SO,baud,[12,"Hello World AD Test",10,13]
pause 2000
Serout2 so,baud,[12,27,"[1;1H","Pressure: "]
MAINLOOP:
ADCIN 0,adval ' Read A/D channel 0 to adval variable
Serout2 so,baud,[27,"[3;11H",DEC5 adval]
'average out press first before calcuating true pressure
READING = 1
value = adval
gosub average
press = value
Serout2 so,baud,[27,"[2;11H",DEC5 PRESS]
'PRESSURE = ( 58 * PRESS - 58 ) / 100
pressure = ( 1464 * press - 1464 ) / 10
value = pressure
READING = 2
GOSUB AVERAGE
PRESSURE = VALUE
Serout2 so,baud,[27,"[1;11H",DEC5 PRESSURE]
Pause 200 ' Wait period between updates
GOTO MAINLOOP
END
' -=-=-=-=-=-= Average Analog values -=-=-=-=-=-=-=-=-=-=
' compliments of Darryl Taylor
AVERAGE:
IF Value = ADavg[READING] Then NoChange
IF ABS (Value - ADavg[reading]) > FAspread OR Value < AvgCount Then FastAvg
IF ABS (Value - ADavg[reading]) < AvgCount Then RealClose
ADavg[reading] = ADavg[reading] - (ADavg[reading]/AvgCount)
ADavg[reading] = ADavg[reading] + (Value/AvgCount)
GoTo AVGok
FastAvg:
ADavg[reading] = Value
GoTo AVGok
RealClose:
ADavg[reading] = ADavg[reading] - (ADavg[reading]/(AvgCount/4))
ADavg[reading] = ADavg[reading] + (Value/(AvgCount/4))
AVGok:
Value = ADavg[reading] ' Put Average back into Value
NoChange:
Return
Bookmarks