Strugling without floating point
Hi,
I'm trying to build a pressure sensor (altimeter). I have a working circuit and a mpx pressure sensor. I have changed the ref voltages to get more resolution. I'm using a 16f877.
My problem is that I have worked out I get .002421875v per step (0 to 1024)+ the 2.47 ref. I'm currently measuring 671 from my a/d result. I've read about scalling up etc, but I'd exceed the limit of an integer with this?
I want to do
671 * 0.02421875
This must be possible, but maths is my stong point I am afraid! Could someone point me in the right direction?
Thanks.
Round two, or three depending on who's counting
Ok, I needed an intermission for this one.
So we are left with the equation:
____________________________________
definitions:
result (analog result from A/D conversion)
P (pressure in kPa)
VS (voltage supply ie 1024)
____________________________________
result = VS * (((25 * P) + 271) / 6775)
So to start solving for P .....
result * 6775 = VS * ((25 * P) + 271)
(result * 6775) / VS = 25 * P + 271
((result * 6775) / VS) - 271 = 25 * P
(((result * 6775) / VS) - 271) / 25 = P
Or P = (((result * 6775) / VS) - 271) / 25
It only hurts a little when I try to figure these things out. I suppose the more you do it, the less it hurts. Or if you are a math guru, maybe this is fun. You guys are sick!
1 Attachment(s)
Same problem i think. My negative Amp sensor behave nuts.
Hello
Thanks for all the good tips and trick here it has helped me a lot. I think this is the right tread to put this.
I am making an analogue Amp Instrument with a Servo with an arrow that shows the +10 to -10 Amp. Its for an old style motorbike.
I have an Allegro Current Sensor, represented by Pot ASC714. The ASC714 Zero IN current give an output of 2.5V. I want the span to be between +10 Amps to -10 Amps. Each Amp out of the sensor =66mV. The output is:
+10A=3.16V=255
0A=2.5V=127
-10A=1.84V=0
I use only 8bit A/D and a PIC16F887.
I have set Vref+ to 3.16V and Vref- to 1.84V
At first sight it look that its working fine. But after some jogging with the pot it sometimes count up instead of down and vice versa. I think it has something with the Div32 to do and that i overflow it but cant figure out how to correct this.
Thankful for all solutions
Ole Thronborg
'************************************************* ***************
'* Name : Amp887.BAS *
'* Date : 17/3/2011 *
'* Notes : Read ASC714, Out LCD +-10A and move Servo *
'* Show value in bit and Amp on LCD display
'* For PIC16F887 *
'* For standard servo settings 1-2mS set LOW_servo con 100 *
'* and HIGH_servo CON 200 *
'************************************************* ***************
'Define OSC and ADC
DEFINE OSC 4 ' Set internal Oschillator to 4Mhz
DEFINE ADC_BITS 8 ' Set number of bits in result
DEFINE ADC_CLOCK 2 ' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS
' Define LCD pins
Define LCD_DREG PORTD 'LCD data port
Define LCD_DBIT 0 'LCD data starting bit 0 or 4
Define LCD_RSREG PORTD 'LCD register select port
Define LCD_RSBIT 4 'LCD register select bit
Define LCD_EREG PORTD 'LCD enable port
Define LCD_EBIT 5 'LCD enable bit
TRISA = %00001101 ' RA0 = A/D input
ADCON1.7 = 0 ' RA.1 = +Vref, Set PORTA analog and left justify result
ADCON1.5=1 ' Set Vref- to pin 5
ADCON1.4=1 ' Set Vref+ to pin 4
PORTb.6 =0 ' Prepare RB0 for high-going pulseout
ANSEL = %00001101 ' Set PORTA.2 analog, rest digital
'ANSELH = %00000000
' Variables
outpuls VAR byte ' Variable for the calculated puls out in mS
POT_POS VAR BYTE ' Pot position CC=0, CCW=255
ampdum VAR Word ' A dummy to canculate big values
amp var word ' Calculating Ampere
LEFT CON 90 ' Left Stop position 0.70mS
RIGHT CON 163 ' Right Stop position 2.1mS
'Pause 700 ' Wait for LCD to start
MainLoop: ' The Loop start here!
ADCIN 0,POT_POS ' Read A/D channel 0 to variable SVO_POS
IF POT_POS>127 then ' Check if positive
ampdum=(7874* (POT_POS-128)) ' Then calculate the dummy
amp= div32 100 ' Let amp get the dummy value
else
ampdum=(7874 * (127-POT_POS)) ' Now it must be negative Amp so calculate
amp= div32 100 ' Let amp get the dummy value
endif ' End of test if Amp negative
'Output to LCD
Lcdout $fe, 1, "POT_POS= ", #POT_POS ' Display POT Valu between 0-255 on line 1
IF POT_POS>=127 then ' Check if + Ampere Else goto - Ampere
LCDOut $fe,$C0, "AMP= ",DEC (amp/1000),".", DEC1 amp' Display pulswith in mS on line 2
else
LCDOut $fe,$C0, "AMP= -",DEC (amp/1000),".", DEC1 amp' Display pulswith in mS on line 2
endif
'outpuls =100+(POT_POS *100/255) 'Calculate the outpuls in mS
'IF outpuls < LEFT THEN outpuls = LEFT ' Stop if puls shorter than constant LEFT
'IF outpuls > RIGHT THEN outpuls = RIGHT ' Stop if puls shorter than constant RIGHT
' Span 100 gives 100+100 = 200=2mS 150 is center
'PULSOUT portb.6 ,outpuls ' Move servo on pin
'PAUSE 20 ' Constant 20mS pulses(low) between outpuls
'GOTO MainLoop ' Forever
End
Attachment 5307