aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC_VAC.c
blob: 9ca987e6669ac70e0da250a4cad5511302a54152 (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_VAC.c
 *
 *  Created on: Jan 1, 2020
 *      Author: avi
 *
 *      According to the email  "AC Voltage measurements" on December 20 2019
 */

#include "include.h"
#include "ADC.h"

#define AC_Index 0
#define DC_Index 1

#define AcTable_MaxLine 9
#define AcTable_MaxColumn 2

#ifdef VAC_TEST
double VAC_Test = 230.0;
#endif

double AcLookUpTable[AcTable_MaxLine][AcTable_MaxColumn] =
//VAC = 29.5522 * VDC + 3.981;//linear line according to the lookup table
{
    180.2  , 5.963,
    190.1  , 6.298,
    200.16 , 6.639,
    210.2  , 6.980,
    220.03 , 7.320,
    230.26 , 7.639,
    240.23 , 7.981,
    250.2  , 8.317,
    259.9  , 8.647
};

double VDC2VAC(double VDC)//Volts
{
    double VAC = 0, VAC_Delta = 0, VDC_Delta = 0, Temp = 0;
    unsigned char i = 0;

    if ((VDC < AcLookUpTable[0][DC_Index]) || (VDC > AcLookUpTable[AcTable_MaxLine - 1][DC_Index]))
    {
        VAC = 29.5522 * VDC + 3.981;//linear line according to the lookup table
    }
    else
    {
        for (i = 0; i < AcTable_MaxLine; i++)
        {
            if (VDC == AcLookUpTable[i][DC_Index])
            {
                VAC = AcLookUpTable[i][AC_Index];
                break;
            }
            else if ((VDC > AcLookUpTable[i][DC_Index]) && (VDC < AcLookUpTable[i + 1][DC_Index]))
            {
                VAC_Delta = AcLookUpTable[i + 1][AC_Index] - AcLookUpTable[i][AC_Index];
                VDC_Delta = AcLookUpTable[i + 1][DC_Index] - AcLookUpTable[i][DC_Index];
                Temp = VDC - AcLookUpTable[i][DC_Index];
                Temp = Temp * VAC_Delta / VDC_Delta;
                VAC = AcLookUpTable[i][AC_Index] + Temp;
                break;
            }

        }

    }
    return VAC;//Volts
}

double ReadVAC()
{
    uint32_t VsampleInBits;

    double temp, VADC = 0.0 ,VSensor, VAC = 0.0;

    VsampleInBits = ADC_GetReading(ADC_AIR_PRESSURE_2);

    //---- VBits -> VADC ----

    //ADC 12 bit -> 4096 -> 3V

    //temp = (double)(VsampleInBits)*3.0;
    //VADC =  temp / 4096.0;


    temp = 4096 - VsampleInBits;
    temp *= 3;//Vref internal ADC
    temp *= 1000; //move to mv
    temp /= 4096;
    VADC = 3000 - temp;

    //---- VADC -> VSensor ---

    //VADC = 1.96 - 10k( VSensor - 1.96) / 46.4k (from the electrical scheme)
    // VSensor = 0 V  -> VADC = 2.3824 V
    // VSensor = 10 V -> VADC = 0.2272 V

    VSensor = (1.96- (VADC/1000)) * 4.64 + 1.96;

    VAC = VDC2VAC(VSensor);
#ifdef VAC_TEST
    VAC = VAC_Test;
#endif
    return VAC; //Volts
}