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 64
ADCount = 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