aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC_DispPressSens.c
blob: 7c42ff82301a00a40a2cd4d3d7402c22128bfb33 (plain)
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]);
}