1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/*
* ADC_DispPressSens.c
*
* Created on: Jun 7, 2020
* Author: avi
*/
#include "include.h"
#include <DataDef.h>
#include "ADC.h"
#include <Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h>
float DispenserPressure[MAX_SYSTEM_DISPENSERS] = {0};
float Vlow,VHigh,Bits_Min,Bits_Max,a[MAX_SYSTEM_DISPENSERS]= {0}, b[MAX_SYSTEM_DISPENSERS]= {0};
void Calculateinit (void)
{
int DispenserId = 0;
float Min = 0.0;//default for old pressure sensor
float Max = 1.0;//default for pressure sensor
Vlow = 0.004 * 130.0; // 4mA*130ohm = 0.52 V(Min Pascal)
VHigh = 0.020 *130.0; // 20mA*130ohm = 2.6V (Max Pascal)
Bits_Min = Vlow * 4096.0 / 3.0; // Vlow * 4096bit / 3Vref = 709.973328 bits
Bits_Max = VHigh * 4096.0 / 3.0; // VHigh * 4096bit / 3Vref = 3549.86646 bits
for(DispenserId = 0;DispenserId < MAX_SYSTEM_DISPENSERS; DispenserId++)
{
Min = 0.0;//default for old pressure sensor
Max = 1.0;//default for pressure sensor
if(Dispenser_struct[DispenserId].Read_Disp_EEPROM.bytes.Header == Disp_EEPROM_Header)
{
Min = (float)(Dispenser_struct[DispenserId].Read_Disp_EEPROM.bytes.Minimal_Pressure) / 10000.0;
if(Dispenser_struct[DispenserId].Read_Disp_EEPROM.bytes.Maximal_Pressure == 0x1027)//
{
//Bug in dispenser test V1.9 - send this field as big endian, (0x2710 is 10000, so we will use the default value 0x2710 = 100000, 10000/10000 = 1)
Max = 1.0;//default
}
else
{
Max = (float)(Dispenser_struct[DispenserId].Read_Disp_EEPROM.bytes.Maximal_Pressure) / 10000.0;
}
}
else if(Dispenser_struct[DispenserId].I2C_Status = I2C_COMM_FAILED)//#warning need to implement !!!!
{
#warning need to implement i2c status !!!!
Min = - 0.1;//-1000 / 10000.0;//default for NEW pressure sensor
Max = 1;//10000 / 10000.0;//default for NEW pressure sensor
Report("unable to read the dispenser EEPROM, use default NEW pressure values",__FILE__,__LINE__,DispenserId,RpWarning,(int)Dispenser_struct[DispenserId].Type,0);
}
else
{
Report("Dispenser's EEPROM - Wrong header! use default OLD pressure values",__FILE__,__LINE__,DispenserId,RpWarning,(int)Dispenser_struct[DispenserId ].Read_Disp_EEPROM.bytes.Header,0);
}
a[DispenserId] = (Max - Min) / (Bits_Max - Bits_Min);// Mpascal/Bits = 0.000352125 with default values
b[DispenserId] = Max - (a[DispenserId] * Bits_Max ); // y = ax + b (x= Bits_Min, y = 0)
}
}
float CalculateDispenserPressure (int DispenserId)
{
unsigned short data = 0;
float temp = 0.0;
/*
data = ADC_GetReading(DispenserIdToPressureSensorId[DispenserId]);
temp = 4096 - data;
temp *= 3;
temp *= 1000; //move to mv
temp /= 4096;
DispenserPressure[DispenserId] = 3000 - temp;
*/
data = ADC_GetReading(DispenserIdToPressureSensorId[DispenserId]);
if(data<Bits_Min)
{
data = Bits_Min;//40mA 0Bar
//if (isDispenserInConfig(DispenserId))
// Report("Dispenser - Reading wrong data from ADC",__FILE__,__LINE__,DispenserId,RpWarning,(int)data,0);
}
temp = a[DispenserId] * data + b[DispenserId];
DispenserPressure[DispenserId] = temp; // [Mpascal] ( 1 Mpascal = 10 Bar )
//unmark one of them to convert from Mpascal to :
//-----------------------------------
//DispenserPressure[DispenserId] /= 1000000; //Pascal
//DispenserPressure[DispenserId] *=10; //Bar;
//DispenserPressure[DispenserId] *=10000000; //uBar;
//DispenserPressure[DispenserId] *=145.0377; //PSI;
DispenserPressure[DispenserId] *= 10.0; //MPascal -> Bar
//if(DispenserPressure[DispenserId] < 0 ) //why????
// DispenserPressure[DispenserId] = 0;
return(DispenserPressure[DispenserId]);
}
|