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
}
|