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