'**************************************************************** '* Name : airspeed.BAS * '* Author : Steve Turner * '* : www.steveonweb.com brightspectrum@hotmail.com * '* Notice : Use as you like * '* Date : 6/06/02 * '* Version : 1.4 * '* Notes : An airspeed Project Created for an unmanned * '* : Aerial Vehicle. Uses a Motorola MPX5050 * '* : differential pressure sensor connected to RA1 * '* : good to 270 Mph using an op-amp for a sensor * '* : gain of 5 * '**************************************************************** ' PicBasic Pro program ' ' Connect analog input to channel-1 (RA1) 'Setup LCD 'This setup will tell PBP a 2-line LCD is connected in 4-bit mode 'with the data bus on the top 4 'bits of PORTB, Register Select on PORTB.1, and Enable on PORTB.0. DEFINE LCD_DREG PORTB 'Set LCD Data port DEFINE LCD_DBIT 4 'Set starting Data bit DEFINE LCD_RSREG PORTB 'Set LCD Register Select port DEFINE LCD_RSBIT 1 'Set LCD Register Select bit DEFINE LCD_EREG PORTB 'Set LCD Enable port DEFINE LCD_EBIT 0 'Set LCD Enable bit symbol cr = 13 ' Carrige Return symbol lf = 10 ' Line Feed sout var portd.7 temp1 var word Pressure var word ' in pascals Airspeedmet var word ' Airspeed meters / sec Airspeed var word ' Airspeed in MPH OutVolt var word ' Output voltage of sensor in .1 mv ADvalue var word counter var byte NewADvalue var word ' Sets up the port for AD conversion TRISA = %11111111 ' Set PORTA to all input ADCON1 = %10000100 ' Set PORTA analog and RIGHT justify result ' RA1 is AD in, Vdd is V+ ref, Vss is V- ref (GND) ADCON0 = %10001011 ' Configure and turn on A/D Module 'Fosc RC Pause 500 ' Wait .5 second for it to warm up loop: 'Resets temp variables for a fresh start counter = 1 NewADvalue = 0 'This loop adds 64 AD conversion values together, and then divides 'by 16 to get a 12 bit value from a 10 bit input for counter = 1 to 50 'no more than 64, then it can overflow ADCON0.2 = 1 ' Start Conversion notdone: Pause 5 If ADCON0.2 = 1 Then notdone ' Wait for low on bit-2 of ADCON0, conversion finished 'Load Value into word variable ADvalue ADvalue.highbyte = ADRESH ' Move HIGH byte of result to ADvalue ADvalue.lowbyte = ADRESL ' Move LOW byte of result to ADvalue NewADvalue = NewADvalue + ADvalue 'just keep adding them next ADvalue = NewADvalue / 50 'will produce 12bit from a 10bit AD converter 'calculate the values gosub calcVoltage gosub calcPressure gosub calcairspeed 'display the results on an LCD LCDOUT $FE,1,"AD ",dec4 ADvalue," Volt ",dec5 OutVolt LCDOUT $FE,$C0,"Pres ",dec5 pressure," Asp ", dec3 airspeed pause 5 SEROUT2 sout,396,["ADvalue = ",dec4 ADvalue," OutVolt = ",dec5 OutVolt," Pressure = ",dec5 pressure, " Airspeed = ", dec3 airspeed,10,13] goto loop end 'Subroutines 'gives millivolt*10 calcVoltage: 'OutVolt = ADvalue * resolution OutVolt = ADvalue */ 2500 ' = ADvalue * 2500 / 256 OutVolt = OutVolt + 260 'Correcting for Sensor Being a little off return calcPressure: if outvolt < 2000 then goto zero 'Vout = VS x (0.018 x P +0.04) gives with VS = 5volt 'P=(Vout - 0.2)/0.09 'p = ((Vout0.1mv - 2000) * 10) / 9 pressure = (OutVolt - 2000) * 10 pressure = div32 9 'In pascals return zero: Pressure = 0 gosub calcairspeed calcairspeed: 'airspeed = square root of {(2*pressure) / 1.225} ' pressure in Pascals '/ 1.225 = *.8163 '53499/65536 = .8163 temp1 = (2*pressure) ** 53499 airspeedmet = sqr temp1 'takes the square root of temp1 'meters per second * 2.237 = miles per hour airspeed = airspeedmet * 224 airspeed = airspeed/100 return