3. 计量原理与算法:有功/无功功率计算、电压/电流有效值测量、电能累计算法、误差校准方法
各位同学,欢迎来到第三章。这一章,咱们要啃的可是智能电表最核心的「硬骨头」——计量算法。
说实话,我当年刚入行时,觉得电表嘛,不就是数数脉冲、算算功率?后来真正做项目才发现,这里面的门道深着呢。一个采样点算错,累积下来可能就是几度电的误差。嗯,咱们今天就把这些原理掰开揉碎了讲清楚。
3.1 电压/电流有效值测量
先问个问题:为什么我们不用平均值,非要用有效值?
因为有效值才是真正做功的等效值。你想想看,一个正弦波交流电,它的平均值是0,但显然它能点亮灯泡。有效值就是那个「等效直流值」。
在数字电表里,我们用的是均方根法,也就是RMS算法。公式很简单:
U_rms = sqrt( (1/N) * Σ(u[n]^2) ) // 从 n=0 到 N-1
I_rms = sqrt( (1/N) * Σ(i[n]^2) )
这里N是一个周期内的采样点数。我个人习惯用128点或256点,这样计算精度和速度比较平衡。
3.2 有功功率与无功功率计算
有功功率,就是真正被负载消耗掉的功率。无功功率呢?它不消耗能量,但占用电网容量。这两个概念,做电表的人必须刻在脑子里。
数字域的计算方法如下:
// 有功功率(直接相乘累加)
P = (1/N) * Σ(u[n] * i[n])
// 无功功率(需要移相90度)
Q = (1/N) * Σ(u[n] * i_shifted[n])
这里有个坑——无功功率的计算。为什么要把电流移相90度?因为无功功率的定义就是电压和电流相位差90度时的功率。在纯正弦波下,这没问题。但电网里谐波多啊,谐波下的移相就麻烦了。
3.3 电能累计算法
电能是功率对时间的积分。说白了,就是功率乘以时间,然后累加起来。但具体怎么累加,有两种主流方法。
3.4.1 脉冲计数法
这是最传统的方法。电表芯片每消耗一个固定的小能量单位(比如0.001kWh),就输出一个脉冲。MCU只管数脉冲个数就行。
优点:实现简单,MCU负担轻。
缺点:精度受限于脉冲当量,而且有量化误差。
// 脉冲计数法伪代码
static uint32_t pulse_count = 0;
static float total_energy = 0.0;
void pulse_interrupt_handler() {
pulse_count++;
total_energy = pulse_count * PULSE_ENERGY; // PULSE_ENERGY = 0.001 kWh
}
3.4.2 数字积分法
现在的主流方案。MCU直接读取瞬时功率,然后定时累加。比如每1ms算一次功率,累加到总电能里。
// 数字积分法伪代码
float energy = 0.0;
float power = 0.0;
uint32_t last_time = 0;
void timer_isr() { // 每1ms触发一次
uint32_t now = get_tick();
float dt = (now - last_time) / 1000.0; // 转成秒
energy += power * dt / 3600.0; // 转成kWh
last_time = now;
}
3.5 误差校准方法
校准,是电表出厂前最重要的一步。没有校准的电表,精度可能差5%以上。校准后,国标要求误差在±1%以内,甚至±0.5%。
校准分三步走:
- 零点校准: 输入为0时,ADC读数应该为0。如果有偏移,软件里减掉。
- 增益校准: 输入标准信号(比如220V,5A),调整增益系数,让读数等于标准值。
- 相位校准: 调整电压电流的相位差,让有功功率和无功功率都准确。
// 校准参数结构体
typedef struct {
float gain_u; // 电压增益
float gain_i; // 电流增益
float offset_u; // 电压零点偏移
float offset_i; // 电流零点偏移
float phase_comp; // 相位补偿(角度)
} Calibration_Params;
// 校准后的测量值
float u_cal = (u_raw - offset_u) * gain_u;
float i_cal = (i_raw - offset_i) * gain_i;
3.6 本章小结
这一章的内容,说白了就是电表的「算账」逻辑。有效值算对了,功率才能准;功率准了,电能才能累加对;最后校准一下,才能拿出去卖。
我见过不少新手,算法写得花里胡哨,结果一上标准源就露馅。为什么?因为忽略了实际硬件的不完美——ADC有噪声,互感器有相移,温度会漂移。所以,做计量算法,一定要留好校准接口,别把算法写死了。
下一章,咱们聊聊通信协议。电表算好了数据,怎么告诉别人?嗯,到时候见。