计算交流电压波峰峰值电压的简单方法

信息处理 峰值检测 电信号
2022-02-06 19:39:51

我想测量交流电压信号的峰峰值电压。电压本身约为 220V 和 60Hz。当通过连接到 Arduino 的传感器进行测量时,它会缩小到 5V 到 0V。

几年前我用我在互联网上找到的代码实现了这个。

float getVPP(const uint8_t sensorIn)
{
    float result = 0;
    int readValue = 0;
    int maxValue = 0;
    int minValue = 4096;

    uint32_t start_time = millis();
    while ((millis() - start_time) < 1000)
    {
        readValue = analogRead(sensorIn);
        Serial.println(readValue);
        if (readValue > maxValue)
        {
            maxValue = readValue;
        }
        if (readValue < minValue)
        {
            minValue = readValue;
        }
    }
    result = ((maxValue - minValue) * 5.0) / 4096.0;
    return abs(result);
}

我不确定这是否是最好的方法。对于初学者来说,我想完全摆脱它,但这不是重点。我想知道的是,有没有更好的方法来读取交流电源电压?我的最终目标是计算功率。我使用相同的函数来计算电流的峰峰值,将两者除以0.707得到 RMS 值,然后将它们相乘。

任何帮助将不胜感激。

编辑: 电气测量电源电压和电流本身的行为是完全安全的,并且已使用相关传感器完成。我所指的“信号”处于安全的 5V 电平。所以这个问题纯粹与信号分析有关。

3个回答

我同意 OP 的担忧,即给定的方法不是最好的,因为它对噪音最敏感。它正在读取绝对峰峰值,除了样本上可能存在的任何不可避免的噪声之外,它还包括峰峰值信号实际是什么的潜在“真相”。

理想情况下,将计算标准偏差计算或等效地与参考 60 Hz 信号进行时间对齐的相关性。对于需要处理资源的次优但高效且优越得多的实现,我建议使用平均绝对偏差(MAD) 计算,因为这可以通过简单的移动平均滤波器来完成,或者如果需要进一步简化,则可以使用 CIC 滤波器结构体。方便的是,MAD 与我们通过常数寻求的标准偏差有关4/(π2)(常数2/π参考链接中给出的特定于测量高斯分布噪声,但对于正弦分布,MAD 与 RMS 的比率为4/(π2)). 只要谐波降低超过 15 dB 或更多(很可能,因为这是向计算机设备提供交流电的典型要求,但如果精度很重要,则应进行验证),这应该会导致非常合理的估计。

当处理不是问题时,只需直接计算 RMS 值(每个样本的平方和的平均值),或者如果最终需要进行功率测量,则还需要电流测量,功率将是电流和电压样本的乘积(假设是电阻性负载,请阅读下文,了解有关外壳或无功负载的 I 和 V 波形之间相位测量的重要性的更多详细信息)。

要计算 MAD,只需在至少几个周期内对每个样本的绝对值进行平均(平均时间越长,结果越准确,因此这可能是时间与准确性的交易)。如果需要进一步简化,则可以实现 CIC 滤波器(甚至更简单)。CIC 滤波器只是移动平均线的有效实现。

要将得到的移动平均值转换为 rms 值,只需将其乘以π2/4.

这将提供有效的 rms 电压测量,但要测量功率,您还需要测量电流和两者之间的相位关系(这两者也可以非常有效地完成),因为平均功率是VrmsIrmscos(θ). 有许多低成本的电流传感器可用,它们将使用电感耦合测量电流(有关这方面的更多详细信息,在电子堆栈交换站点上更合适,因此如果该解决方案仍然难以捉摸,请在此处发布)。要估计电压和电流读数之间的相位,您可以乘以并缩放电压和电流读数,因为该乘积的平均值是cos(θ)上述所需的术语:

Vp(cos(ωt)Ip(cos(ωt+θ))=VpIp2cos(θ)

加上一个更高频率的“2f”项cos(2ωt+θ)我们只是过滤掉(使用另一个移动平均过滤器!)。在负载为电阻性或大部分为电阻性的情况下,θ=0cos(θ)=1. 我们已经知道VpIp来自 MAD 结果,因为峰值与 MAD 有另一个常数相关π/2.

如果相位测量是必要的,并且按照上述逐个样本的产品进行了测量,则可以通过结合相位和 MAD 处理直接计算功率,但对于电力线监控,可能需要了解负载是否为无功作为从该处理中导出的信息。

为了简化相位估计,产品相位检测器可以使用检测到的电流和电压信号(转换为脉冲)的 XOR 门和 RC 低通滤波器来实现,或者类似地在 Arduino 中使用这两个符号的 XOR 操作信号。这两种方法都将产生与相位的线性结果(当相位从 1 线性归一化到 0 时)0π/2, 从 0 到 1 相位从 -π/20.

我在此处提供了有关 CIC 滤波器结构及其等效于移动平均滤波器的更多详细信息

它按比例缩小

这实际上取决于缩放是如何实现的。请确保这是安全的(通过隔离变压器或类似的东西)。如果管理不当,220V 会对设备和人员造成严重损害。

我使用相同的函数来计算电流的峰峰值,将两者除以 0.707 得到 RMS 值,然后将它们相乘

RMS 是峰峰值除以8. 这仅适用于阻性负载,如果负载具有非平凡的电抗,则会给出错误的结果。

要获得实际功耗,您可以直接将电压和电流波形相乘,然后对结果进行低通滤波。这将要求您具有足够高的采样率。如果线路谐波无关紧要,则应该使用 150Hz 之类的东西。

有没有更好的方法来读取交流电源电压

我建议在https://electronics.stackexchange.com/上发布您当前的示意图请确保您注意您将到达那里的安全建议。

对于纯正弦波,Asin(ωt)有效值是 VRMS=A(2)
虽然峰峰值是Vpkpk=2A

通过这两个关系,您可以从峰峰值中找到 RMS 值。但是,我认为这不是一个强大的实现

首先,我没有看到您的交流电源电压曲线,但在典型的交流电源上,变压器饱和和非线性负载会引起谐波。这些将打破 RMS 和峰峰值之间的关系。当涉及谐波时,您需要逐个样本计算 RMS。

其次,如果存在明显的噪声,您可能会高估峰峰值估计值。

编辑:检查这个答案,看看交流电源电压可能是什么样子。 https://electronics.stackexchange.com/a/256424/155482

他们测量的交流电压为 122V RMS,但峰值电压为 165V。

如果这是一个纯正弦波,122V RMS 会给你一个 172.5V 的峰值