从老式日光灯到现代LED:用Python+Arduino复现功率因数补偿实验(附完整代码)
·
用Python+Arduino实现日光灯电路的智能功率因数补偿系统
日光灯作为典型的电感性负载,其功率因数补偿实验一直是模电课程中的经典项目。但传统的手动测量方法不仅效率低下,也难以直观展示动态变化过程。本文将带你用Arduino和Python构建一个 全自动化的功率因数补偿实验平台 ,通过代码控制电容切换、实时采集数据并可视化分析,让这个老实验焕发新生。
1. 系统架构设计
整个系统由硬件控制层和数据采集分析层组成,采用模块化设计思路:
-
硬件控制层 :
- Arduino Uno作为主控制器
- 16路继电器模块控制电容组
- 电流互感器+运算放大器电路
- 自制日光灯实验电路板
-
数据采集分析层 :
- Python 3.9+运行环境
- PySerial库实现串口通信
- Matplotlib实时绘图
- NumPy进行数据分析
提示:继电器模块建议选用光耦隔离型,如SRD-05VDC-SL-C,确保高电压部分与控制电路完全隔离。
系统工作原理如下图所示(文字描述替代图示):
- Arduino循环检测电流传感器信号
- Python发送电容切换指令
- 继电器切换不同电容组合
- 电流数据回传Python
- 实时绘制电流-电容曲线
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. 安全注意事项
-
高压隔离 :
- 使用光耦隔离所有控制信号
- 电流互感器二次侧必须可靠接地
- 实验时佩戴绝缘手套
-
电容安全 :
- 并联放电电阻(500kΩ/2W)
- 每次切换前确保电容完全放电
- 使用耐压450V以上的CBB电容
-
代码安全 :
- 增加软件看门狗
- 设置最大电流保护阈值
- 异常时自动切断继电器
注意:实验过程中如发现任何异常(冒烟、异常声响等),应立即断开电源,使用绝缘工具检查。
这个项目最有趣的部分是当系统找到谐振点时,可以观察到总电流明显下降,而灯管亮度保持不变。通过这个现代化改造,不仅使实验过程更加安全可控,还能直观展示功率因数补偿的动态过程,为传统实验注入了新的活力。
更多推荐


所有评论(0)