用Python+Arduino实现日光灯电路的智能功率因数补偿系统

日光灯作为典型的电感性负载,其功率因数补偿实验一直是模电课程中的经典项目。但传统的手动测量方法不仅效率低下,也难以直观展示动态变化过程。本文将带你用Arduino和Python构建一个 全自动化的功率因数补偿实验平台 ,通过代码控制电容切换、实时采集数据并可视化分析,让这个老实验焕发新生。

1. 系统架构设计

整个系统由硬件控制层和数据采集分析层组成,采用模块化设计思路:

  • 硬件控制层

    • Arduino Uno作为主控制器
    • 16路继电器模块控制电容组
    • 电流互感器+运算放大器电路
    • 自制日光灯实验电路板
  • 数据采集分析层

    • Python 3.9+运行环境
    • PySerial库实现串口通信
    • Matplotlib实时绘图
    • NumPy进行数据分析

提示:继电器模块建议选用光耦隔离型,如SRD-05VDC-SL-C,确保高电压部分与控制电路完全隔离。

系统工作原理如下图所示(文字描述替代图示):

  1. Arduino循环检测电流传感器信号
  2. Python发送电容切换指令
  3. 继电器切换不同电容组合
  4. 电流数据回传Python
  5. 实时绘制电流-电容曲线

2. 硬件搭建详解

2.1 日光灯电路改造

传统日光灯电路需要做以下改造:

220V AC ----[Switch]----[Fuse]----[镇流器]----[灯管]----|
                       |                             |
                       +----[电流传感器]----[电容组]----+

关键改造点:

  • 在总回路串联电流互感器(如TA12-100)
  • 并联的电容组改用继电器控制
  • 增加过零检测电路用于相位测量

2.2 电容组设计

采用8位二进制组合方式,通过不同电容并联实现256级可调:

位序 电容值(μF) 继电器引脚
D0 1 IN1
D1 2.2 IN2
D2 4.7 IN3
D3 10 IN4
D4 22 IN5
D5 47 IN6
D6 100 IN7
D7 220 IN8

这种设计既保证了调节精度(最小步进1μF),又能覆盖大范围(最大组合值402.9μF)。

3. 核心代码实现

3.1 Arduino控制程序

const int relayPins[] = {2,3,4,5,6,7,8,9};
const float caps[] = {1.0,2.2,4.7,10,22,47,100,220};

void setCapacitance(float target) {
  byte pattern = 0;
  float sum = 0;
  
  // 二进制搜索最优组合
  for(int i=7; i>=0; i--) {
    if(sum + caps[i] <= target) {
      pattern |= (1 << i);
      sum += caps[i];
    }
  }
  
  // 设置继电器状态
  for(int i=0; i<8; i++) {
    digitalWrite(relayPins[i], (pattern>>i) & 0x01);
  }
}

void setup() {
  Serial.begin(115200);
  for(int i=0; i<8; i++) {
    pinMode(relayPins[i], OUTPUT);
    digitalWrite(relayPins[i], LOW);
  }
}

void loop() {
  if(Serial.available()) {
    float target = Serial.parseFloat();
    setCapacitance(target);
    
    // 回传实际设置值
    Serial.print("CAP_SET:");
    Serial.println(getCurrentCapacitance());
  }
  
  // 电流测量代码...
}

3.2 Python控制端

import serial
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

ser = serial.Serial('COM3', 115200, timeout=1)
fig, ax = plt.subplots()
x_data, y_data = [], []
line, = ax.plot([], [], 'r-')

def init():
    ax.set_xlim(0, 400)
    ax.set_ylim(0, 500)
    return line,

def update(frame):
    for cap in range(0, 400, 5):
        ser.write(f"{cap}\n".encode())
        response = ser.readline().decode().strip()
        if response.startswith("CAP_SET:"):
            actual_cap = float(response.split(':')[1])
            current = float(ser.readline().decode().strip())
            
            x_data.append(actual_cap)
            y_data.append(current)
            line.set_data(x_data, y_data)
    return line,

ani = FuncAnimation(fig, update, init_func=init, blit=True)
plt.xlabel('Capacitance (μF)')
plt.ylabel('Current (mA)')
plt.title('Current vs Capacitance')
plt.grid()
plt.show()

4. 高级功能扩展

4.1 自动谐振点搜索算法

在基础功能上,我们可以实现更智能的搜索算法:

def find_resonance():
    # 初始粗搜索
    steps = [50, 20, 5, 1]
    min_current = float('inf')
    best_cap = 0
    
    for step in steps:
        for cap in range(max(0, best_cap-2*step), best_cap+2*step, step):
            ser.write(f"{cap}\n".encode())
            current = float(ser.readline().decode().strip())
            
            if current < min_current:
                min_current = current
                best_cap = cap
                
    return best_cap, min_current

4.2 功率因数实时计算

通过增加电压检测电路,可以实时计算功率因数:

def calculate_pf(U, I, P):
    S = U * I  # 视在功率
    return P / S  # 功率因数

# 在update函数中添加:
voltage = 220  # 实际应从传感器读取
power = get_power()  # 通过功率传感器获取
pf = calculate_pf(voltage, current, power)

5. 安全注意事项

  1. 高压隔离

    • 使用光耦隔离所有控制信号
    • 电流互感器二次侧必须可靠接地
    • 实验时佩戴绝缘手套
  2. 电容安全

    • 并联放电电阻(500kΩ/2W)
    • 每次切换前确保电容完全放电
    • 使用耐压450V以上的CBB电容
  3. 代码安全

    • 增加软件看门狗
    • 设置最大电流保护阈值
    • 异常时自动切断继电器

注意:实验过程中如发现任何异常(冒烟、异常声响等),应立即断开电源,使用绝缘工具检查。

这个项目最有趣的部分是当系统找到谐振点时,可以观察到总电流明显下降,而灯管亮度保持不变。通过这个现代化改造,不仅使实验过程更加安全可控,还能直观展示功率因数补偿的动态过程,为传统实验注入了新的活力。

更多推荐