View previous topic :: View next topic |
Author |
Message |
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
MS5607B Calculations |
Posted: Tue May 17, 2011 5:35 am |
|
|
Hi All
I am trying to write a driver for a pressure sensor MS5607B
Datasheet Here http://www.intersema.ch/products/guide/calibrated/ms5607b/
I have managed to aquire all the variables from the device over I2C but I am having trouble with the final stage of the calculations.
On the datasheet Pg 7 under "Calculate temperature compensated pressure"
The calculation uses signed int 64 variables and states that "Maximal size of intermediate result during evaluation of variable" is upto between 41 and 58 bits
Is there a way/what is the best way, to do this on PIC18 CCS Compiler ?
Any help would be much appreciated
Thanks
Jeff |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Tue May 17, 2011 5:43 am |
|
|
Surely the mfr. has an example either in the datasheet or some application note ? I find it hard to believe that they don't supply such important information !
Perhaps 'googling' will help find existing code for this product, even if it's written in another language, it'd be simple to convert to CCS C.
That being said, perhaps if you post your relevent code and the algorithm we can help... |
|
|
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
|
Posted: Tue May 17, 2011 5:55 am |
|
|
Hi Temtronic
They do indeed have an example in "C" but its for a system that can use 64 bit floats.
The longest float in CCS for PIC18's is 32 bit
The code is not really the problem its the 64 bit maths
I have searched for code but can find noe that is helpfull
Jeff |
|
|
Douglas Kennedy
Joined: 07 Sep 2003 Posts: 755 Location: Florida
|
|
Posted: Tue May 17, 2011 6:21 am |
|
|
Quantum Mechanics is the theory that underpins electronics. It is accurate to 12 places and is the most accurate of any theories to date. Now 64bit well exceeds this for precision. This 64bit stuff is done often to paper over the mathematically correct issues that occur when changing notation from the decimal system to binary and vice versa. Unless you are using whole numbers or the fixed point equivalent notational conversion issues will arise.
64 bit moves the conversion issue many digits right of the decimal point so that after truncation and conversion to decimal notation calculations appear as if they were done in exclusively in decimal notation. It is rare sensors are more accurate than 32 bit binary float ( 6 or 7 significant decimal digits). I'd write the code using 32 bit it should be 99.99% as accurate as 64bit. |
|
|
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
|
Posted: Tue May 17, 2011 7:14 am |
|
|
HI Douglas
Thanks for that
Can you see an easy way to reduce the formulae on Pg 7 to a lower resolution ?
Thanks
Jeff |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Tue May 17, 2011 7:18 am |
|
|
I have to giggle at ANYTHING over 16 bits. Real World gotchas include noise ,EMI, magnetic deviation, solar flares, PCB layout,etc.etc,etc.
Sure in THEORY 64 bits are better than 12 or 16 or 32 BUT unless you spend hundreds of hours making 'ultra quiet' PCBs,tri-coaxial shielded cables,etc. it really is a futile effort.
Heck if 64 bit is great, 128 has to be better !Hmm..how about 256 bits?
Do a realty check, you can get to the moon and back on less then 16 bits.
Brings up a point, what is the specs of the sensor? It can't be cheap if you require 64 bit math !
Also beaware that float math is a hog on time and if your application is time sensitive, then the sensor data may have signifigantly changed during the match calculations. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Tue May 17, 2011 7:24 am |
|
|
Have you just tried the code as it is?.
You can use the keyword 'double' in CCS, it just does nothing (except on the PCD compiler), with the basic accuracy remaining at 24bit plus exponent. The sensor itself 'only' has a 24bit data return, and the last couple of bits of this will be 'doubtful' in most circumstances. But realistically it should work pretty well with the maths 'as is'.
They are using double, because it is available, and to reduce the risk of rounding errors in the intermediate stages (which may be a problem), but I suspect it'll work quite well with single precision floats....
Best Wishes |
|
|
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
|
Posted: Tue May 17, 2011 7:56 am |
|
|
Hi Telmah
I did try this very quickly whilst I was coding the i2c but got garbage.
I will try again with a bit more attention to detail !
Thanks
Jeff |
|
|
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
|
Posted: Wed May 18, 2011 1:59 pm |
|
|
Hi All
Temtronic, 16 bits may be good enough for a lot of things but there are a lot of things its not good for ie if you earn more than 65536 then the 16 Bit calculations computer that pays you has a problem ! also The moon is 238,357 miles away (an 18 bit integer) I dont fancy trying to land a spacecraft with a altimeter that has 3.6mile resolution.
In answer to your question the sensor costs about $10
Ttelmah, Thanks for the suggestion however the calculation falls at the first part of the first equations on Pg7
C2 *2^17 where C2 is 43981 but using CCS the max multiplier is 2^16 that gives a correct answer
Code: |
int16 C[6];
int32 D1,D2;
signed int32 dT;
float Pressure_Sensor_Temp;
int32 Offset;
void MS5670_Read_Coefficients (int8 Address)
{
C[0] = 46372;
C[1] = 43981;
C[2] = 29509;
C[3] = 27842;
C[4] = 31553;
C[5] = 28165;
}
void MS5670_Power_On_Reset (int8 Address)
{
i2c_start(); // Start condition
i2c_write(Address*2); // (Slave Address * 2) For R/W bit low for a write
i2c_write(0x1E); // Command POR
i2c_Stop();
}
void MS5670_Start_Conversion_and_Read_Pressure (int8 Address)
{
D1 = 6465444;
}
void MS5670_Start_Conversion_and_Read_Temperature (int8 Address)
{
D2 = 8077636;
}
void MS5670_Calculate_Temperature_and_Pressure()
{
dT = D2-((float)C[4]*256);
Pressure_Sensor_Temp = (2000 + (dT*((float)C[5]/8388608)))/100;
Offset = ((float)C[1] * 65536); //+(((float)C[4]*dT)/64);
}
|
The Display Routine (To RS232)
Code: |
#include <18f67j60_Trial_RS232.h>
#include <Math.h>
#include <MS5607B_Trial.c>
void main()
{
MS5670_Read_Coefficients(0x77);
while(true){
Delay_ms (1000);
output_low(LED);
MS5670_Start_Conversion_and_Read_Pressure (0x77);
MS5670_Start_Conversion_and_Read_Temperature (0x77);
MS5670_Calculate_Temperature_and_Pressure();
output_high(LED);
printf("\033[2J");
printf ("Pressure Sensor C1 = %Lu\n\r",C[0]);
printf ("Pressure Sensor C2 = %Lu\n\r",C[1]);
printf ("Pressure Sensor C3 = %Lu\n\r",C[2]);
printf ("Pressure Sensor C4 = %Lu\n\r",C[3]);
printf ("Pressure Sensor C5 = %Lu\n\r",C[4]);
printf ("Pressure Sensor C6 = %Lu\n\r",C[5]);
printf ("Pressure Sensor D1 = %Lu\n\r",D1);
printf ("Pressure Sensor D2 = %Lu\n\r",D2);
printf ("Dt = %Ld\n\r",dT);
printf ("Pressure_Sensor_Temp = %3.3f\n\r",Pressure_Sensor_Temp);
printf ("Pressure_Sensor_Offset = %Lu\n\r",offset);
}}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Wed May 18, 2011 3:05 pm |
|
|
Your multiplier is working as an int16, not a float. You are gong to have to be scrupulously careful about casting, since CCS doesn't 'propagate upwards', and if a numeric type overflows you will just get garbage.
I think the 2^x construct only works with int16. You will need to use the fp 'pow' operation instead.
Best Wishes |
|
|
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
|
Posted: Wed May 18, 2011 3:19 pm |
|
|
HI Ttelmah
I have tried casting the multiplier as int32 and float
but both ways the answer is incorrect the correct answer is 5764677632
Code: |
Offset = ((float)C[1] * (float)131072); answer = 1469710337
and
Offset = ((float)C[1] * (int32)131072); answer = 1469710337
|
as you point out I think there is an overflow
I am really a hardware man and far from an expert in maths (especially in CCS C) is there a good reference you can suggest ?
I can reduce the resolution (I only need 12 bits really) but working out WHERE to do it is not obvious to me
many thanks for your attention
Jeff
Last edited by JeffLewcock on Wed May 18, 2011 3:36 pm; edited 1 time in total |
|
|
JeffLewcock
Joined: 10 Apr 2007 Posts: 29
|
|
Posted: Wed May 18, 2011 3:36 pm |
|
|
Hi Ttelmah
I will look into the "pow" operator !
Thanks
Jeff |
|
|
|