123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #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<adc_length ; idx++)
- {
- if(((2048-60)<data[idx]) && (data[idx]<(2048+60)))
- {
- if(idx_Cnt == 0)
- {
- Freq_Header_Grid = idx;
- idx_Cnt++;
- }
- else
- {
- if((73<=(idx-Freq_Header_Grid)) && ((idx-Freq_Header_Grid)<=104))
- {
- Freq_Tail_Grid = idx;
- idx_Cnt++;
- }
- }
- }
-
- if(idx_Cnt >= 2)
- break;
- }
-
- 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)
- {
-
-
- SineValue->Freq = (1000000/(adc_sample_time * Freq_CLC_Grid )) ;
-
-
- 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) ;
-
-
- Deviation_sum = 0 ;
- for (uint32_t i=Freq_Header_Grid; i<Freq_Tail_Grid;i++)
- {
- MCU_Vin[i-Freq_Header_Grid] = (data[i]/4095.0*3.3);
-
- if (MCU_Vin[i-Freq_Header_Grid] > 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 ;
- }
- }
|