MVMFirmwareCpp v0.1
driver_5525DSO.cpp
Go to the documentation of this file.
1 //
2 //
3 //
4 
5 #include "driver_5525DSO.h"
6 
7 
24 bool Sensor5525DSO::Init(t_i2cdevices device, t_ps_sensor model, t_ps_resolution ps_resolution, void* handle)
25 {
26  //Copy device contex and extract pointer to DebugClass and Hardware Class
27  DriverContext* dc;
28  dc = (DriverContext*)handle;
29  hwi = (HW*)dc->hwi;
30  dbg = (DebugIfaceClass*)dc->dbg;
31  i2c_device = device;
32  sensor_model = model;
33  sensor_resolution = ps_resolution;
34 
35  //Download calibration table from sensor
36  _initialized = false;
37  bool bres = true;
38  uint8_t wbuffer[6];
39  uint8_t rbuffer[6];
40  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "Starting 5525DSO Initialization... ");
41 
42  //Reset Senspr
43  Reset_5525DSO();
44  hwi->__delay_blocking_ms(100);
45 
46  //Read Calibration Table
47  for (int i = 0; i < 6; i++) {
48  wbuffer[0] = 0xA0 + ((i + 1) << 1);
49  bres = hwi->I2CRead(i2c_device, wbuffer, 1, rbuffer, 2, true);
50  if (!bres) return false;
51  sensorCT.C[i] = (rbuffer[0] << 8) + rbuffer[1];
52  }
53  sensorCT.ZERO = 0;
54 
55  //Select coefficient in function of model
56  switch (sensor_model) {
57  case DS_01:
58  sensorCT.Q[0] = 15;
59  sensorCT.Q[1] = 17;
60  sensorCT.Q[2] = 7;
61  sensorCT.Q[3] = 5;
62  sensorCT.Q[4] = 7;
63  sensorCT.Q[5] = 21;
64  break;
65 
66  case GS_05:
67  sensorCT.Q[0] = 16;
68  sensorCT.Q[1] = 17;
69  sensorCT.Q[2] = 6;
70  sensorCT.Q[3] = 5;
71  sensorCT.Q[4] = 7;
72  sensorCT.Q[5] = 21;
73  break;
74  }
75 
76  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "SENS_T1: " + String(sensorCT.C[0]));
77  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "OFF_T1: " + String(sensorCT.C[1]));
78  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "TCS: " + String(sensorCT.C[2]));
79  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "TCO: " + String(sensorCT.C[3]));
80  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "TREF: " + String(sensorCT.C[4]));
81  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "TEMPSENS: " + String(sensorCT.C[5]));
82 
83  //Initialize default parameters
84  //We need a cache for P and T because we
85  //read T only few time in order to reduce
86  //bus access
87  __last_is_T=false;
88  __chache_P=0;
89  __chache_T=0;
90  __TDiv=0;
91  __pending_meas = false;
92 
93  startup_counter = 1;
94  data_valid = false;
95  _initialized = true;
96  __last_millis = hwi->GetMillis();
97  return true;
98 }
99 
107 bool Sensor5525DSO::doMeasure(float* P, float* T)
108 {
109  bool bres = true;
110  uint8_t wbuffer[6];
111  uint8_t rbuffer[6];
112  int32_t pressure_raw;
113  int32_t temperature_raw;
114 
115  if (!_initialized) return false;
116  //Read raw pressure
117  wbuffer[0] = GetResolutionByteCodePressure();
118  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
119  if (!bres) return false;
120  hwi->__delay_blocking_ms(GetResolutionDelay()*2);
121 
122  wbuffer[0] = 0x00;
123  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
124  if (!bres) return false;
125 
126  hwi->__delay_blocking_ms(2);
127 
128  bres = hwi->I2CRead(i2c_device, rbuffer, 3, true);
129  if (!bres) return false;
130 
131  pressure_raw = (rbuffer[0] << 16) + (rbuffer[1] << 8) + rbuffer[2];
132 
133  //Read raw temperature
134  wbuffer[0] = GetResolutionByteCodeTemp();
135  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
136  if (!bres) return false;
137  hwi->__delay_blocking_ms(GetResolutionDelay()*2);
138 
139  wbuffer[0] = 0x00;
140  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
141  if (!bres) return false;
142 
143  hwi->__delay_blocking_ms(2);
144 
145  bres = hwi->I2CRead(i2c_device, rbuffer, 3, true);
146  if (!bres) return false;
147 
148  temperature_raw = (rbuffer[0] << 16) + (rbuffer[1] << 8) + rbuffer[2];
149 
150  //Convert raw in P,T
151  CalibrateDate_5525DSO(temperature_raw, pressure_raw, T, P);
152 
153  dbg->DbgPrint(DBG_KERNEL, DBG_INFO, "T: " + String(*T) + " P: " + String(*P));
154 
155 
156  return true;
157 }
158 
169 {
170  bool bres = true;
171  uint8_t wbuffer[6];
172 
173  if (!_initialized) return false;
174 
175  //Check if there is a measure pending, if yes return
176  if (__pending_meas)
177  return false;
178 
179  //Every 50 cycles read temperature
180  if (__TDiv <= 0)
181  {
182  __TDiv = 50;
183  wbuffer[0] = GetResolutionByteCodeTemp();
184  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
185  if (!bres) return false;
186  __last_is_T = true;
187  }
188  else
189  {
190  __TDiv--;
191  wbuffer[0] = GetResolutionByteCodePressure();
192  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
193  if (!bres) return false;
194  __last_is_T = false;
195  }
196  __last_millis = hwi->GetMillis();
197  __pending_meas = true;
198  return true;
199 }
200 
211 bool Sensor5525DSO::asyncGetResult(float* P, float* T)
212 {
213  bool bres = true;
214  uint8_t wbuffer[6];
215  uint8_t rbuffer[6];
216  int32_t pressure_raw;
217  int32_t temperature_raw;
218 
219  if (!_initialized) return false;
220 
221  //Check if there is a measure pending, if no return
222  if (!__pending_meas)
223  return false;
224 
225  //Check if conversion time is expired
226  if (hwi->Get_dT_millis(__last_millis) < GetResolutionDelay())
227  return false;
228 
229  __pending_meas = false;
230 
231  //Start readout process
232  wbuffer[0] = 0x00;
233  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
234  if (!bres) return false;
235  hwi->__delay_blocking_ms(2);
236  bres = hwi->I2CRead(i2c_device, rbuffer, 3, true);
237  if (!bres) return false;
238 
239  //Get P or T and use opposite (not read value) from cache
240  //Then convert raw to P,T
241  if (__last_is_T)
242  {
243  temperature_raw = (rbuffer[0] << 16) + (rbuffer[1] << 8) + rbuffer[2];
244  __chache_T = temperature_raw;
246  }
247  else
248  {
249  pressure_raw = (rbuffer[0] << 16) + (rbuffer[1] << 8) + rbuffer[2];
250  __chache_P = pressure_raw;
252  }
253 
254  //Discard data on startup
255  if (startup_counter > 0)
256  {
257  startup_counter--;
258  }
259  else
260  {
261  data_valid = true;
262  }
263 
264  return data_valid;
265 }
266 
275 void Sensor5525DSO::CalibrateDate_5525DSO(int32_t raw_temp, int32_t raw_pressure, float* T, float* P)
276 {
277  float PINSIDE, PINSIDE_ZERO;
278  int32_t Q1 = sensorCT.Q[0];
279  int32_t Q2 = sensorCT.Q[1];
280  int32_t Q3 = sensorCT.Q[2];
281  int32_t Q4 = sensorCT.Q[3];
282  int32_t Q5 = sensorCT.Q[4];
283  int32_t Q6 = sensorCT.Q[5];
284 
285  int32_t C1 = sensorCT.C[0];
286  int32_t C2 = sensorCT.C[1];
287  int32_t C3 = sensorCT.C[2];
288  int32_t C4 = sensorCT.C[3];
289  int32_t C5 = sensorCT.C[4];
290  int32_t C6 = sensorCT.C[5];
291 
292  int32_t dT;
293  int64_t OFF;
294  int64_t SENS;
295 
296  int32_t Temp;
297  int64_t Pres;
298 
299  dT = raw_temp - (C5 * pow(2, Q5));
300  Temp = 2000 + ((dT * C6) / pow(2, Q6));
301  OFF = (C2 * pow(2, Q2)) + ((C4 * dT) / (pow(2, Q4)));
302  SENS = (C1 * pow(2, Q1)) + ((C3 * dT) / (pow(2, Q3)));
303  Pres = (((raw_pressure * SENS) / (pow(2, 21))) - OFF) / (pow(2, 15));
304 
305  *T = ((float)Temp) / 100.0;
306  PINSIDE = ((float)Pres) / 10000.0 * 68.9476;
307  PINSIDE_ZERO = PINSIDE - sensorCT.ZERO;
308  // Serial.println("DBG; " + String(PINSIDE) + " " + String(sensorCT.ZERO) + " " + String(PINSIDE_ZERO));
309  *P = PINSIDE_ZERO;
310 }
311 
318 {
319  switch (sensor_resolution) //ERRORE DEVE ESSERE ps_resolution
320  {
321  case OVS_256:
322  return 0x50;
323  case OVS_512:
324  return 0x52;
325  case OVS_1024:
326  return 0x54;
327  case OVS_2048:
328  return 0x56;
329  case OVS_4096:
330  return 0x58;
331  default:
332  break;
333  }
334 }
335 
342 {
343  switch (sensor_resolution) //ERRORE DEVE ESSERE ps_resolution
344  {
345  case OVS_256:
346  return 0x40;
347  case OVS_512:
348  return 0x42;
349  case OVS_1024:
350  return 0x44;
351  case OVS_2048:
352  return 0x46;
353  case OVS_4096:
354  return 0x48;
355  default:
356  break;
357  }
358 }
359 
360 
367 {
368  switch (sensor_resolution) //ERRORE DEVE ESSERE ps_resolution
369  {
370  case OVS_256:
371  return 1;
372  case OVS_512:
373  return 2;
374  case OVS_1024:
375  return 3;
376  case OVS_2048:
377  return 4.9;
378  case OVS_4096:
379  return 11;
380  default:
381  break;
382  }
383 }
384 
391 {
392  bool bres = true;
393  uint8_t wbuffer[6];
394 
395  //Read raw pressure
396  wbuffer[0] = 0x1E;
397  bres = hwi->I2CWrite(i2c_device, wbuffer, 1, true);
398  if (!bres) return false;
399 
400 
401  return true;
402 }
403 
409 void Sensor5525DSO::setZero(float value)
410 {
411  sensorCT.ZERO = value;
412 }
413 
414 
423 {
424  float T, P;
425  float value=0;
426  float cnt = 0;
427  sensorCT.ZERO = 0;
428  doMeasure(&P, &T);
429 
430  for (int i = 0; i < 50; i++)
431  {
432 
433  if (doMeasure(&P, &T))
434  {
435  value += P;
436  cnt++;
437  }
438 
439  }
440  if (cnt > 0)
441  {
442  value = value / cnt;
443  }
444  sensorCT.ZERO = value;
445  doMeasure(&P, &T);
446  return value;
447 }
448 
449 
455 void Sensor5525DSO::correctZero(float value)
456 {
457  sensorCT.ZERO += value;
458 }
459 
466 {
467  return (float) GetResolutionDelay();
468 }
469 
470 // # # ###
471 // ## # #
472 // # # # #
473 // # # # #
474 // # # # #
475 // # ## #
476 // # # ###
477 //
478 // Nuclear Instruments 2020 - All rights reserved
479 // Any commercial use of this code is forbidden
480 // Contact info@nuclearinstruments.eu
Sensor5525DSO::data_valid
bool data_valid
Definition: driver_5525DSO.h:85
DriverContext::dbg
DebugIfaceClass * dbg
Definition: DriverContext.h:7
Sensor5525DSO::sensor_resolution
t_ps_resolution sensor_resolution
Definition: driver_5525DSO.h:65
DBG_INFO
@ DBG_INFO
Definition: DebugIface.h:21
Sensor5525DSO::doMeasure
bool doMeasure(float *P, float *T)
Perform a full measure in blocking mode.
Definition: driver_5525DSO.cpp:107
Sensor5525DSO::__chache_P
uint32_t __chache_P
Definition: driver_5525DSO.h:77
HW_V4::I2CRead
bool I2CRead(t_i2cdevices device, uint8_t *wbuffer, int wlength, uint8_t *rbuffer, int rlength, bool stop)
Write buffer to I2C bus and read data.
Definition: fw_board_ni_v4.cpp:182
Sensor5525DSO::i2c_device
t_i2cdevices i2c_device
Definition: driver_5525DSO.h:63
Sensor5525DSO::__last_millis
uint64_t __last_millis
Definition: driver_5525DSO.h:82
Sensor5525DSO::Init
bool Init(t_i2cdevices device, t_ps_sensor model, t_ps_resolution ps_resolution, void *hw_handle)
Init pressure sensor TE 5525DSO.
Definition: driver_5525DSO.cpp:24
DriverContext
Definition: DriverContext.h:5
Sensor5525DSO::correctZero
void correctZero(float value)
Incremental 0 correction for Venturi cycle to cycle adjust.
Definition: driver_5525DSO.cpp:455
Sensor5525DSO::__pending_meas
bool __pending_meas
Definition: driver_5525DSO.h:81
Sensor5525DSO::doZero
float doZero()
Calculate sensor zero.
Definition: driver_5525DSO.cpp:422
Sensor5525DSO::_initialized
bool _initialized
Definition: driver_5525DSO.h:87
Sensor5525DSO::CalibrateDate_5525DSO
void CalibrateDate_5525DSO(int32_t raw_temp, int32_t raw_pressure, float *T, float *P)
Convert row measure in P/V.
Definition: driver_5525DSO.cpp:275
HW_V4::I2CWrite
bool I2CWrite(t_i2cdevices device, uint8_t *wbuffer, int wlength, bool stop)
Write buffer to I2C bus.
Definition: fw_board_ni_v4.cpp:145
Sensor5525DSO::Reset_5525DSO
bool Reset_5525DSO()
Reset the sensor.
Definition: driver_5525DSO.cpp:390
driver_5525DSO.h
t_5525DSO_calibration_table::C
int32_t C[6]
Definition: driver_5525DSO.h:15
OVS_512
@ OVS_512
Definition: driver_5525DSO.h:22
OVS_256
@ OVS_256
Definition: driver_5525DSO.h:22
OVS_2048
@ OVS_2048
Definition: driver_5525DSO.h:22
Sensor5525DSO::GetResolutionDelay
uint32_t GetResolutionDelay()
Obtain the conversion time for specified resolution.
Definition: driver_5525DSO.cpp:366
OVS_1024
@ OVS_1024
Definition: driver_5525DSO.h:22
t_5525DSO_calibration_table::ZERO
float ZERO
Definition: driver_5525DSO.h:17
Sensor5525DSO::hwi
HW * hwi
Definition: driver_5525DSO.h:74
Sensor5525DSO::startup_counter
int startup_counter
Definition: driver_5525DSO.h:84
DriverContext::hwi
HW * hwi
Definition: DriverContext.h:6
t_ps_resolution
t_ps_resolution
Definition: driver_5525DSO.h:22
Sensor5525DSO::GetConversionDelay
float GetConversionDelay()
Return correction delay.
Definition: driver_5525DSO.cpp:465
Sensor5525DSO::asyncMeasure
bool asyncMeasure()
Start an asynchronous measure process (NON BLOKING)
Definition: driver_5525DSO.cpp:168
DS_01
@ DS_01
Definition: driver_5525DSO.h:21
Sensor5525DSO::__TDiv
int __TDiv
Definition: driver_5525DSO.h:79
t_5525DSO_calibration_table::Q
int32_t Q[6]
Definition: driver_5525DSO.h:16
HW_V4
Driver for the Nuclear Instruments V4 Hardware Board.
Definition: fw_board_ni_v4.h:23
Sensor5525DSO::sensor_model
t_ps_sensor sensor_model
Definition: driver_5525DSO.h:64
Sensor5525DSO::__chache_T
uint32_t __chache_T
Definition: driver_5525DSO.h:78
t_i2cdevices
t_i2cdevices
Definition: generic_definitions.h:36
Sensor5525DSO::dbg
DebugIfaceClass * dbg
Definition: driver_5525DSO.h:75
t_ps_sensor
t_ps_sensor
Definition: driver_5525DSO.h:21
DBG_KERNEL
@ DBG_KERNEL
Definition: DebugIface.h:25
DebugIfaceClass::DbgPrint
void DbgPrint(dbg_source source, verbose_level vl, String s)
Print a message on the debug console.
Definition: DebugIface.cpp:40
DebugIfaceClass
Debug class: this class print debug message.
Definition: DebugIface.h:38
OVS_4096
@ OVS_4096
Definition: driver_5525DSO.h:22
GS_05
@ GS_05
Definition: driver_5525DSO.h:21
Sensor5525DSO::GetResolutionByteCodePressure
uint8_t GetResolutionByteCodePressure()
Obtain the conversion code for P for specified resolution.
Definition: driver_5525DSO.cpp:341
Sensor5525DSO::__last_is_T
bool __last_is_T
Definition: driver_5525DSO.h:80
Sensor5525DSO::asyncGetResult
bool asyncGetResult(float *P, float *T)
Get result from an NON BLOCKING measure process.
Definition: driver_5525DSO.cpp:211
Sensor5525DSO::setZero
void setZero(float value)
Calibrate sensor zero with a specified value.
Definition: driver_5525DSO.cpp:409
Sensor5525DSO::sensorCT
t_5525DSO_calibration_table sensorCT
Definition: driver_5525DSO.h:62
Sensor5525DSO::GetResolutionByteCodeTemp
uint8_t GetResolutionByteCodeTemp()
Obtain the conversion code for T for specified resolution.
Definition: driver_5525DSO.cpp:317