sine.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /*!-------------------------------------------------------------------
  2. @brief ADCSineCalculate2 - Calculate ADC Sine Value
  3. ADCSineCalculate2(adc data array , adc array length, adc total sample time (us), Application variable , Magnification ) ;
  4. @param :ADCSineCalculate2(ADC_VT_Value, ADC1_SAMPLE_COUNT , 231 , &Adc.VT , 0.00322) ;
  5. @output :1.Adc.VT.Freq
  6. 2.Adc.VT.Avg
  7. 3.Adc.VT.Vrms
  8. @notes :None
  9. 212 us = PCLK2 / 6 ( 1/(42M / 6) = 0.14us
  10. 0.14us * ( 480 + 15 ) * 3 = 212 us
  11. ------------------------------------------------------------------- */
  12. #include "sine.h"
  13. #include "main.h"
  14. #include "math.h"
  15. MOVE_AVG_FILTER AC_Sine[3];
  16. void ADCSineCalculate2(uint32_t *data, uint16_t adc_length, uint16_t adc_sample_time , MOVE_AVG_FILTER *SineValue, float Magn, uint8_t phase)
  17. {
  18. uint32_t max_value = 0 , min_value = 4095;
  19. uint8_t isSineWave;
  20. uint16_t Freq_Header_Grid = 0;
  21. uint16_t Freq_Tail_Grid = 0;
  22. uint16_t Freq_CLC_Grid = 0;
  23. uint16_t idx_Cnt = 0;
  24. uint32_t Avg_offset_sum ;
  25. float Avg_offset ;
  26. float MCU_Vin[ADC2_SAMPLE_COUNT] ;
  27. float Deviation_sum ;
  28. for (uint32_t i = 0; i < adc_length ; i++)
  29. {
  30. if (max_value < data[i]) { max_value = data[i] ; }
  31. if (min_value > data[i]) { min_value = data[i] ; }
  32. }
  33. if ((max_value - min_value) > 30)
  34. {
  35. isSineWave = ON ;
  36. }
  37. else
  38. {
  39. isSineWave = OFF ;
  40. }
  41. if (isSineWave == ON)
  42. {
  43. for(uint16_t idx=0 ; idx<adc_length ; idx++)
  44. {
  45. if(((2048-60)<data[idx]) && (data[idx]<(2048+60)))
  46. {
  47. if(idx_Cnt == 0)
  48. {
  49. Freq_Header_Grid = idx;
  50. idx_Cnt++;
  51. }
  52. else
  53. {
  54. if((73<=(idx-Freq_Header_Grid)) && ((idx-Freq_Header_Grid)<=104))
  55. {
  56. Freq_Tail_Grid = idx;
  57. idx_Cnt++;
  58. }
  59. }
  60. }
  61. if(idx_Cnt >= 2)
  62. break;
  63. }
  64. //Freq
  65. Freq_CLC_Grid = Freq_Tail_Grid - Freq_Header_Grid ;
  66. if ((1000000/(adc_sample_time * Freq_CLC_Grid )) > 45 && (1000000/(adc_sample_time * Freq_CLC_Grid )) < 65)
  67. {
  68. //Freq
  69. //Freq_CLC_Grid = Freq_Tail_Grid - Freq_Header_Grid ;
  70. SineValue->Freq = (1000000/(adc_sample_time * Freq_CLC_Grid )) ;
  71. //Avg
  72. Avg_offset_sum = 0 ;
  73. for (uint32_t i = Freq_Header_Grid; i < Freq_Tail_Grid ; i++)
  74. {
  75. Avg_offset_sum += data [i] ;
  76. }
  77. Avg_offset = (float)(Avg_offset_sum/Freq_CLC_Grid)*3.3/4095 ;
  78. SineValue->Avg = (uint16_t)(Avg_offset*100.0) ;
  79. //Vrms
  80. Deviation_sum = 0 ;
  81. for (uint32_t i=Freq_Header_Grid; i<Freq_Tail_Grid;i++)
  82. {
  83. MCU_Vin[i-Freq_Header_Grid] = (data[i]/4095.0*3.3);
  84. if (MCU_Vin[i-Freq_Header_Grid] > Avg_offset)
  85. {
  86. MCU_Vin[i-Freq_Header_Grid] = MCU_Vin[i-Freq_Header_Grid] - Avg_offset ;
  87. }
  88. else
  89. {
  90. MCU_Vin[i-Freq_Header_Grid] = Avg_offset - MCU_Vin[i-Freq_Header_Grid] ;
  91. }
  92. MCU_Vin[i-Freq_Header_Grid] = MCU_Vin[i-Freq_Header_Grid] / Magn;
  93. Deviation_sum += pow(MCU_Vin[i-Freq_Header_Grid] ,2);
  94. }
  95. SineValue->Vrms = (uint16_t)(sqrt(Deviation_sum / Freq_CLC_Grid)*100 ) ;
  96. }
  97. else
  98. {
  99. switch(phase)
  100. {
  101. case 0:
  102. SineValue->Vrms = (uint16_t)adc_value.ADC2_IN0.value;
  103. break;
  104. case 1:
  105. SineValue->Vrms = (uint16_t)adc_value.ADC2_IN1.value;
  106. break;
  107. case 2:
  108. SineValue->Vrms = (uint16_t)adc_value.ADC2_IN2.value;
  109. break;
  110. }
  111. }
  112. }
  113. else
  114. {
  115. SineValue->Freq = 0 ;
  116. Avg_offset_sum = 0 ;
  117. for (uint32_t i = 0; i < adc_length ; i++)
  118. {
  119. Avg_offset_sum += data [i] ;
  120. }
  121. Avg_offset = (float)(Avg_offset_sum/adc_length)*3.3/4095 ;
  122. SineValue->Avg = (uint16_t)(Avg_offset*100.0) ;
  123. SineValue->Vrms = 0 ;
  124. }
  125. }