18F2550 ADC troubleshooting

theo92

New Member
Hi, I'm here again for ADC troubleshoot.

How to do some simple arithmetic calculations on sampled AD value.
I'm using a MPXH6115 pressure sensor as a ADC input RA0 of 18F2550 for measuring atmospheric pressure. Is it a bad idea?

It has the following transfer function:

Vout = Vs*(0.009*P-0.095)±Error

I'm ignoring the error as the operating temp is 10-50 deg C.

simplifying it we get:

P= (Vo+0.475)÷0.045 KPa

or

P=(166.7*Vo + 79.1825) mm

Now how to calculate it in digital world, i mean in the pic?
the code:
Code:
//Cloud Number Nine
//For Watching The Weather

Device = 18F2550
Clock = 20


// some LCD options...
#option LCD_DATA = PORTB.4
#option LCD_RS = PORTB.3
#option LCD_EN = PORTC.1

//DS1307 software I2C config
#option DS1307_SI2C = true
#option I2C_SDA = PORTB.0
#option I2C_SCL = PORTB.1
// uses LCD and AD libraries...
Include "LCD.bas"
Include "ADC.bas"
Include "convert.bas"
Include "USART.bas"
Include "DS1307.bas"
Include "sensirion"
       
  

// read the AD port and scale for 0 - 5 volts...
Function ADInAsVolt() As Word
   result = (ADC.Read(0) + 1) * 500 / 1024
End Function

// sampled AD value...
Dim ADVal As Word

Dim NoError As Boolean
Dim temperature, humidity, dew_point As Float
Dim TempA, TempB As Byte
Dim buf As Integer

// initialise and clear LCD...
ADCON1 = $07       // PORTE as digital (LCD)
TRISA.0 = 1        // configure AN0 as an input 
ADCON1.7 = 1       // set analogue input on PORTA.0 
DelayMS (500)
LCD.Cls

//Sensirion.Sensirion_Init(PORTC.1, PORTC.2)  // Sensirion.Sensirion_Init(Port.(Data Pin), Port.(Clock pin))
                                            // Data an Clock Pin must be at the same Port
                                            // This is a wrong configuration : Sensirion.Sensirion_Init(PORTB.1, PORTD.2) 
Sensirion.Sensirion_Init_(PORTC, 2, 3)      // Sensirion.Sensirion_Init(Port, Data Pin, Clock Pin)
//

// if the DS1307 device has not been enabled, we need to give
// it some default values - here we set for 2 o'clock  
// on the 19th April 2008...
If Not Enabled Then
   Time.Hour = 14
   Time.Minute = 0
   Time.Second = 00
   Date.Day = 19
   Date.Month = 11
   Date.Year = 8
   DS1307.Write(Time,Date)
EndIf



// main program loop...

   While true
   NoError = Sensirion.Sensirion_Get_Temp_Hum(temperature, humidity)
    If NoError Then
        buf = temperature * 100
        TempA = buf / 100
        TempB = buf Mod 100
        LCD.WriteAt(1,6, "T=",DecToStr(TempA,2),".",DecToStr(TempB,2)," ", 223, "C  ")
        buf = humidity * 100
        TempA = buf / 100
        TempB = buf Mod 100
        LCD.WriteAt(1,12, "Rh=",DecToStr(TempA,2),".",DecToStr(TempB,2)," "," %  ")
        dew_point = Sensirion.Sensirion_Get_Dew_Point(temperature, humidity)       
        
    Else 
        LCD.WriteAt(1,8, "ERROR")
    End If
  
   ADVal = ADInAsVolt
   LCD.MoveCursor (1,1)
   LCD.Write("P=", DecToStr(ADVal / 100), ".", DecToStr(ADVal, 2), " ")
   DS1307.Read(Time, Date)
   LCD.WriteAt(2,1,DecToStr(Time.Hour, 2),":",DecToStr(Time.Minute,2),":",DecToStr(Time.Second,2))
   LCD.WriteAt(2,10,DecToStr(Date.Day,2),".",DecToStr(Date.Month,2),".",DecToStr(Date.Year,1))
 
   Wend
   
   While true
   SetBaudrate(br19200)
   NoError = Sensirion.Sensirion_Get_Temp_Hum(temperature, humidity)
    If NoError Then
        buf = temperature * 100
        TempA = buf / 100
        TempB = buf Mod 100
        USART.Write("*********START************",13,10)
        USART.Write("T=",DecToStr(TempA,2),".",DecToStr(TempB,2)," ", 223, "C  ")
        buf = humidity * 100
        TempA = buf / 100
        TempB = buf Mod 100
        USART.Write("R=",DecToStr(TempA,2),".",DecToStr(TempB,2)," "," %  ",13,10)
        dew_point = Sensirion.Sensirion_Get_Dew_Point(temperature, humidity)       
        
    Else 
        USART.Write("ERROR",13,10)
    End If
  
   ADVal = ADInAsVolt
   
   USART.Write("P=", DecToStr(ADVal / 100), ".", DecToStr(ADVal, 2), " ",13,10)
   DS1307.Read(Time, Date)
   USART.Write(DecToStr(Time.Hour, 2),":",DecToStr(Time.Minute,2),":",DecToStr(Time.Second,2),13,10)
   USART.Write(DecToStr(Date.Day,2),".",DecToStr(Date.Month,2),".",DecToStr(Date.Year,1),13,10)
   USART.Write("***************END***************",13,10)
   DelayMS(18000)
Wend

I know there is a wrong in the last USART out portion.
But the else is 100% correct.
It includes a DS1307 RTC and SHT11.

the code where the modificatuions should be done is:
Code:
 ADVal = ADInAsVolt
   LCD.MoveCursor (1,1)
   LCD.Write("P=", DecToStr(ADVal / 100), ".", DecToStr(ADVal, 2), " ")

how to edit it....I can't understand it.
does the ADVal outputs in Volt or not?
will i need to declare a variable?
like:

dim Pout as integer

Pout=(ADVal+0.475)÷0.045

is it right?

And how to make a ADC as accurate as possible? adding a VREF+?
any other tips?
no need to be accurate like a Cs atomic clock though.

Waiting.....
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…