/*!------------------------------------------------------------------- @brief ADCSineCalculate2 - Calculate ADC Sine Value ADCSineCalculate2(adc data array , adc array length, adc total sample time (us), Application variable , Magnification ) ; @param :ADCSineCalculate2(ADC_VT_Value, ADC1_SAMPLE_COUNT , 231 , &Adc.VT , 0.00322) ; @output :1.Adc.VT.Freq 2.Adc.VT.Avg 3.Adc.VT.Vrms @notes :None 212 us = PCLK2 / 6 ( 1/(42M / 6) = 0.14us 0.14us * ( 480 + 15 ) * 3 = 212 us ------------------------------------------------------------------- */ #include "sine.h" #include "main.h" #include "math.h" MOVE_AVG_FILTER AC_Sine[3]; void ADCSineCalculate2(uint32_t *data, uint16_t adc_length, uint16_t adc_sample_time , MOVE_AVG_FILTER *SineValue, float Magn, uint8_t phase) { uint32_t max_value = 0 , min_value = 4095; uint8_t isSineWave; uint16_t Freq_Header_Grid = 0; uint16_t Freq_Tail_Grid = 0; uint16_t Freq_CLC_Grid = 0; uint16_t idx_Cnt = 0; uint32_t Avg_offset_sum ; float Avg_offset ; float MCU_Vin[ADC2_SAMPLE_COUNT] ; float Deviation_sum ; for (uint32_t i = 0; i < adc_length ; i++) { if (max_value < data[i]) { max_value = data[i] ; } if (min_value > data[i]) { min_value = data[i] ; } } if ((max_value - min_value) > 30) { isSineWave = ON ; } else { isSineWave = OFF ; } if (isSineWave == ON) { for(uint16_t idx=0 ; idx= 2) break; } //Freq Freq_CLC_Grid = Freq_Tail_Grid - Freq_Header_Grid ; if ((1000000/(adc_sample_time * Freq_CLC_Grid )) > 45 && (1000000/(adc_sample_time * Freq_CLC_Grid )) < 65) { //Freq //Freq_CLC_Grid = Freq_Tail_Grid - Freq_Header_Grid ; SineValue->Freq = (1000000/(adc_sample_time * Freq_CLC_Grid )) ; //Avg Avg_offset_sum = 0 ; for (uint32_t i = Freq_Header_Grid; i < Freq_Tail_Grid ; i++) { Avg_offset_sum += data [i] ; } Avg_offset = (float)(Avg_offset_sum/Freq_CLC_Grid)*3.3/4095 ; SineValue->Avg = (uint16_t)(Avg_offset*100.0) ; //Vrms Deviation_sum = 0 ; for (uint32_t i=Freq_Header_Grid; i Avg_offset) { MCU_Vin[i-Freq_Header_Grid] = MCU_Vin[i-Freq_Header_Grid] - Avg_offset ; } else { MCU_Vin[i-Freq_Header_Grid] = Avg_offset - MCU_Vin[i-Freq_Header_Grid] ; } MCU_Vin[i-Freq_Header_Grid] = MCU_Vin[i-Freq_Header_Grid] / Magn; Deviation_sum += pow(MCU_Vin[i-Freq_Header_Grid] ,2); } SineValue->Vrms = (uint16_t)(sqrt(Deviation_sum / Freq_CLC_Grid)*100 ) ; } else { switch(phase) { case 0: SineValue->Vrms = (uint16_t)adc_value.ADC2_IN0.value; break; case 1: SineValue->Vrms = (uint16_t)adc_value.ADC2_IN1.value; break; case 2: SineValue->Vrms = (uint16_t)adc_value.ADC2_IN2.value; break; } } } else { SineValue->Freq = 0 ; Avg_offset_sum = 0 ; for (uint32_t i = 0; i < adc_length ; i++) { Avg_offset_sum += data [i] ; } Avg_offset = (float)(Avg_offset_sum/adc_length)*3.3/4095 ; SineValue->Avg = (uint16_t)(Avg_offset*100.0) ; SineValue->Vrms = 0 ; } }