Het schema
De Werking.
We gebruiken een Motorola druksensor in mijn geval de MPXH6115A, deze levert een analoge spanning die afhankelijk is van de druk. Echter het bereik van de sensor is veel groter dan nodig. De sensor kan meten van 150 Hpa tot 1150 Hpa. En het bereik van de AD omzetter is maar 10 bits. We zouden dan een uitlezing hebben van ongeveer 1 Hpa. Om dit te veranderen maken we gebruik van twee referentiespanningen. De AD convertor van de pic zal dan tussen deze twee waarden sampelen. Deze waarden worden aangeleverd door een I2C 8 bits DA omzetter de MAX518. De Vref- word 3.164v en de Vref+ word 4.688v. Nu kunnen we al een veel nauwkeuriger uitlezing krijgen. Maar we willen nog nauwkeuriger dit bereiken we dmv oversampling. Van 10 bits gaan we naar max 16 bits. We sampelen voor 14 bits bijvoorbeeld 256 keer en dit totaal delen we dan door 16. We krijgen dan een 14 bits waarde. De software is nog niet optimaal een correctie is nog niet ingebouwd. Naast de HPA geven op het display het voltage en de AD waarde weer.
Source:
'****************************************************************
'* Name : Barometer.BAS *
'* Author : VoXiT-Pro *
'* Notice : Copyright (c) 2010 *
'* : All Rights Reserved *
'* Date : 19-11-2010 *
'* Version : 1.0 *
'* Notes : barometer *
'* : *
'****************************************************************
Device 16F876A
Xtal 20
SCL_Pin = PORTC.3 ' i2c
SDA_Pin = PORTC.4
LCD_DTPin PORTB.0 'lcd
LCD_ENPin PORTB.4
LCD_RSPin PORTB.5
Adin_Res = 10 ' 10-bit ADC
Adin_Tad = frc '
Adin_Stime = 50 '
TRISA = %11111111 ' PORTA allemaal input
ADCON1 = %10001111 ' PORTa.0 en vref-,vref+ gebruiken
Symbol max518 = %01011110
Dim ADvalue As Word ' global - the final A/D value
Dim ADCount As Word ' sample count
Dim ADDivisor As Word ' averaging divisor
Dim ADmax As Word ' max Advalue
Dim ADAccum As Dword ' 32-bit sample accumulator
Dim Volts As Float
Dim Prcalc As Float
Dim Pressure As Float
Cls
DelayMS 100
Print $FE,$40,$08,$08,$08,$0E,$09,$09,$09,$00 ' H
Print $FE,$48,$00,$0C,$12,$12,$1E,$12,$12,$00 ' a
BusOut max518,$00,[$A2] ' max518 uitgang 0 op 3.164v vref-
BusOut max518,$01,[$F0] ' max518 uitgang 1 op 4.688v vref+
main:
GoSub GetADC ' Haal A/D value op
Volts = (1.524/ADmax)*ADvalue ' volts out from mpx4115
Volts = Volts + 3.164
Prcalc = (Volts/5)+ 0.095 ' (Vout/5)+0.095)
Pressure = (Prcalc/0.009)*10 ' convert to pa by *1000
'Pressure = Pressure + 2.1
Print At 1,1, Dec1 Pressure ,0,"P",1," ",Dec Volts,"v"
Print At 2,1, Dec5 ADvalue
DelayMS 1000
GoTo main
GetADC: ' voor 12 bits waarde 16 x sampelen dan delen door 4
' voor 14 bits waarde 256 x sampelen dan delen door 16
' voor 16 bits waarde 4096 x sampelen dan delen door 64ADCount = 256 ADDivisor = 16 ADAccum = 0 ADmax = 16368 AdLoop: ADvalue= ADIn 0 ' 10-bit sample ADAccum = ADAccum + ADvalue ADCount = ADCount - 1 If ADCount > 0 Then AdLoop ADvalue = ADAccum / ADDivisor ; get the average value 14 bits Return End
Geen opmerkingen:
Een reactie posten