Robosub controller

Dependencies:   IMU MODSERIAL Servo mbed

Fork of RTOS_Controller by Marco Rubio

Committer:
aolgu003
Date:
Fri Jul 29 15:34:59 2016 +0000
Revision:
7:396fa2a8648d
Fixed issues and integrated with the sub.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aolgu003 7:396fa2a8648d 1 #include <stdlib.h>
aolgu003 7:396fa2a8648d 2 #include "MS5837.h"
aolgu003 7:396fa2a8648d 3
aolgu003 7:396fa2a8648d 4
aolgu003 7:396fa2a8648d 5 /*
aolgu003 7:396fa2a8648d 6 * Sensor operating function according data sheet
aolgu003 7:396fa2a8648d 7 */
aolgu003 7:396fa2a8648d 8
aolgu003 7:396fa2a8648d 9 void MS5837::MS5837Init(void)
aolgu003 7:396fa2a8648d 10 {
aolgu003 7:396fa2a8648d 11 MS5837Reset();
aolgu003 7:396fa2a8648d 12 MS5837ReadProm();
aolgu003 7:396fa2a8648d 13 return;
aolgu003 7:396fa2a8648d 14 }
aolgu003 7:396fa2a8648d 15
aolgu003 7:396fa2a8648d 16 /* Send soft reset to the sensor */
aolgu003 7:396fa2a8648d 17 void MS5837::MS5837Reset(void)
aolgu003 7:396fa2a8648d 18 {
aolgu003 7:396fa2a8648d 19 /* transmit out 1 byte reset command */
aolgu003 7:396fa2a8648d 20 ms5837_tx_data[0] = ms5837_reset;
aolgu003 7:396fa2a8648d 21 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
aolgu003 7:396fa2a8648d 22 //printf("send soft reset");
aolgu003 7:396fa2a8648d 23 wait_ms(20);
aolgu003 7:396fa2a8648d 24 }
aolgu003 7:396fa2a8648d 25
aolgu003 7:396fa2a8648d 26 /* read the sensor calibration data from rom */
aolgu003 7:396fa2a8648d 27 void MS5837::MS5837ReadProm(void)
aolgu003 7:396fa2a8648d 28 {
aolgu003 7:396fa2a8648d 29 uint8_t i,j;
aolgu003 7:396fa2a8648d 30 for (i=0; i<8; i++) {
aolgu003 7:396fa2a8648d 31 j = i;
aolgu003 7:396fa2a8648d 32 ms5837_tx_data[0] = ms5837_PROMread + (j<<1);
aolgu003 7:396fa2a8648d 33 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
aolgu003 7:396fa2a8648d 34 if ( i2c.read( device_address, ms5837_rx_data, 2 ) );
aolgu003 7:396fa2a8648d 35 C[i] = ms5837_rx_data[1] + (ms5837_rx_data[0]<<8);
aolgu003 7:396fa2a8648d 36 }
aolgu003 7:396fa2a8648d 37 }
aolgu003 7:396fa2a8648d 38
aolgu003 7:396fa2a8648d 39 /* Start the sensor pressure conversion */
aolgu003 7:396fa2a8648d 40 void MS5837::MS5837ConvertD1(void)
aolgu003 7:396fa2a8648d 41 {
aolgu003 7:396fa2a8648d 42 ms5837_tx_data[0] = ms5837_convD1;
aolgu003 7:396fa2a8648d 43 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
aolgu003 7:396fa2a8648d 44 }
aolgu003 7:396fa2a8648d 45
aolgu003 7:396fa2a8648d 46 /* Start the sensor temperature conversion */
aolgu003 7:396fa2a8648d 47 void MS5837:: MS5837ConvertD2(void)
aolgu003 7:396fa2a8648d 48 {
aolgu003 7:396fa2a8648d 49 ms5837_tx_data[0] = ms5837_convD2;
aolgu003 7:396fa2a8648d 50 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
aolgu003 7:396fa2a8648d 51 }
aolgu003 7:396fa2a8648d 52
aolgu003 7:396fa2a8648d 53 /* Read the previous started conversion results */
aolgu003 7:396fa2a8648d 54 int32_t MS5837::MS5837ReadADC(void)
aolgu003 7:396fa2a8648d 55 {
aolgu003 7:396fa2a8648d 56 int32_t adc;
aolgu003 7:396fa2a8648d 57 wait_ms(150);
aolgu003 7:396fa2a8648d 58 ms5837_tx_data[0] = ms5837_ADCread;
aolgu003 7:396fa2a8648d 59 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
aolgu003 7:396fa2a8648d 60 if ( i2c.read( device_address, ms5837_rx_data, 3 ) );
aolgu003 7:396fa2a8648d 61 adc = ms5837_rx_data[2] + (ms5837_rx_data[1]<<8) + (ms5837_rx_data[0]<<16);
aolgu003 7:396fa2a8648d 62 return (adc);
aolgu003 7:396fa2a8648d 63 }
aolgu003 7:396fa2a8648d 64
aolgu003 7:396fa2a8648d 65 /* return the results */
aolgu003 7:396fa2a8648d 66 float MS5837::MS5837_Pressure (void)
aolgu003 7:396fa2a8648d 67 {
aolgu003 7:396fa2a8648d 68 return P_MS5837;
aolgu003 7:396fa2a8648d 69 }
aolgu003 7:396fa2a8648d 70 float MS5837::MS5837_Temperature (void)
aolgu003 7:396fa2a8648d 71 {
aolgu003 7:396fa2a8648d 72 return T_MS5837;
aolgu003 7:396fa2a8648d 73 }
aolgu003 7:396fa2a8648d 74
aolgu003 7:396fa2a8648d 75 /* Sensor reading and calculation procedure */
aolgu003 7:396fa2a8648d 76 void MS5837::Barometer_MS5837(void)
aolgu003 7:396fa2a8648d 77 {
aolgu003 7:396fa2a8648d 78 int32_t dT, temp;
aolgu003 7:396fa2a8648d 79 int64_t OFF, SENS, press;
aolgu003 7:396fa2a8648d 80
aolgu003 7:396fa2a8648d 81 //no need to do this everytime!
aolgu003 7:396fa2a8648d 82 //MS5837Reset(); // reset the sensor
aolgu003 7:396fa2a8648d 83 //MS5837ReadProm(); // read the calibration values
aolgu003 7:396fa2a8648d 84
aolgu003 7:396fa2a8648d 85
aolgu003 7:396fa2a8648d 86 MS5837ConvertD1(); // start pressure conversion
aolgu003 7:396fa2a8648d 87 D1 = MS5837ReadADC(); // read the pressure value
aolgu003 7:396fa2a8648d 88 MS5837ConvertD2(); // start temperature conversion
aolgu003 7:396fa2a8648d 89 D2 = MS5837ReadADC(); // read the temperature value
aolgu003 7:396fa2a8648d 90
aolgu003 7:396fa2a8648d 91 /* calculation according MS5837-01BA data sheet DA5837-01BA_006 */
aolgu003 7:396fa2a8648d 92 dT = D2 - (C[5]* 256);
aolgu003 7:396fa2a8648d 93 OFF = (int64_t)C[2] * (1<<16) + ((int64_t)dT * (int64_t)C[4]) / (1<<7);
aolgu003 7:396fa2a8648d 94 SENS = (int64_t)C[1] * (1<<15) + ((int64_t)dT * (int64_t)C[3]) / (1<<8);
aolgu003 7:396fa2a8648d 95
aolgu003 7:396fa2a8648d 96 temp = 2000 + (dT * C[6]) / (1<<23);
aolgu003 7:396fa2a8648d 97 T_MS5837 = (float) temp / 100.0f; // result of temperature in deg C in this var
aolgu003 7:396fa2a8648d 98 press = (((int64_t)D1 * SENS) / (1<<21) - OFF) / (1<<13);
aolgu003 7:396fa2a8648d 99 P_MS5837 = (float) press / 10.0f; // result of pressure in mBar in this var
aolgu003 7:396fa2a8648d 100 }