要使用ADC采集交流电压并计算有效值,需要进行一些特定的步骤。以下是一个基本的流程:
-
采集交流电压:使用ADC将交流电压转换为数字量。在进行ADC采集之前,需要确保采样频率足够高,以便能够准确地采集交流信号的波形。
-
计算均方根(RMS)值:通过对采集到的数字量进行处理,可以计算出交流电压的有效值。有效值通常使用均方根(RMS)来表示,其计算公式如下:
[ V_{\text{RMS}} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} V_i^2} ]
其中,( V_i ) 是每次采样得到的电压值,( N ) 是采样点的数量。
-
考虑波形的周期性:由于交流电压是周期性变化的,因此在计算有效值时需要考虑整个周期内的采样数据。通常可以采集多个周期的数据,并对这些数据进行处理以获得更准确的有效值。
一下为一个12位的adc采集电压值的代码
由于adc无法采集负电压,此处为把整个正弦波抬离了负半轴之后,把ADC值转化为电压值的代码
首先定义全局变量:
#define CURRENT_ADC_OFFSET 2048 电压为0时adc的值
#define Reference_voltage 3.3 //定义参考电压值
/*adc值转换为电流值,连续采样5000次,Cur_AdcValue为采集到的adc值*/
void CurAdcValue_2_iRMS(uint32_t Cur_AdcValue,uint8_t i)
{
uint16_t CurrentAVG_Bak;
if(Cur_AdcValue > CURRENT_ADC_OFFSET)
{
Cur_AdcValue = Cur_AdcValue - CURRENT_ADC_OFFSET;
}
else
{
Cur_AdcValue = CURRENT_ADC_OFFSET - Cur_AdcValue;
}
Cur_AdcValue *= Cur_AdcValue;
CurrentSquSum += Cur_AdcValue;
CurrentSampleCnt ++;
if((CurrentSampleCnt % 1000)==0)
{
CurrentAVG += CurrentSquSum/1000;
CurrentSquSum = 0;
if(CurrentSampleCnt == 5000)
{
CurrentSampleCnt = 0;
CurrentAVG = CurrentAVG/5;
CurrentAVG = sqrt(CurrentAVG);
CurrentAVG_Bak = CurrentAVG;
i_RMS[i] = Reference_voltage*(CurrentAVG - CURRENT_ADC_OFFSET)/2048;//通过RMS值计算电流值,并存在全局变量i_RMS中
printf("L%d Current is %.1f A,CurrentAVG ADC Value is %d @Full=4096\r\n",i+1,i_RMS[i],CurrentAVG_Bak);
}
}
}