点击链接下载设计资料:https://download.csdn.net/download/m0_51061483/92081455
- 系统概述
2.1 设计背景与工程意义
在交流电网中,许多负载(如异步电机、变压器、感应加热、焊机、照明镇流器等)都具有明显的电感性特征,会吸收大量无功功率。无功功率虽然不直接做有用功,却会导致电流增大、线路与变压器损耗上升、供电容量被占用、电压波动增大,并使功率因数降低。功率因数低不仅降低供电系统的利用效率,还可能引起电力公司无功罚款或容量限制,因此在工业用电场景中进行无功补偿和功率因数校正具有重要的经济价值与工程价值。
无功补偿最常用的方法是并联电容器组,通过提供容性无功功率抵消负载的感性无功功率,使系统总无功趋近于零,从而提升功率因数。传统的固定电容补偿无法适应负载变化,会出现欠补偿或过补偿(过补偿会产生容性无功,导致电压升高甚至谐振风险)。因此现代系统普遍采用“自动投切电容组”的动态补偿方式,根据实时电参量计算功率因数与无功功率,并通过控制器实现分级投切,使功率因数保持在目标范围内。
本设计以单片机为核心,构建一套功率因数校正与无功补偿系统。系统通过电压、电流采样模块实时获取电网信号,在线计算有功功率、无功功率、视在功率、功率因数等关键指标,并根据设定的目标功率因数和控制策略,自动选择并投切电容阵列。同时系统支持手动/自动双模式,提供人机交互界面显示与参数设定,具备数据存储与历史记录能力,并可在仿真环境中建立电路模型验证补偿效果与稳定性,从而形成一套具有工程实用价值的闭环无功补偿控制系统。
2.2 系统总体目标
系统要实现的总体目标包括:
1)长期稳定采集电压、电流并进行电参量测量;
2)实时计算无功功率与功率因数,为补偿决策提供依据;
3)根据目标功率因数自动投切电容组,实现动态补偿;
4)支持手动/自动双模式,满足调试与运行需求;
5)显示电压、电流、功率因数、补偿需求与投切状态,支持参数设定;
6)存储关键数据,实现历史记录与运行优化;
7)完成仿真验证,评估补偿效果、稳定性和抗扰动能力。
2.3 功率因数与无功补偿基础概念简述
在正弦稳态条件下:
- 有功功率:P = U·I·cosφ(单位 W)
- 无功功率:Q = U·I·sinφ(单位 var)
- 视在功率:S = U·I(单位 VA)
- 功率因数:PF = P / S = cosφ
其中 φ 为电压与电流的相位差。当负载呈感性时,电流滞后电压,cosφ 变小。并联电容提供容性电流,使总电流的相位差减小,从而使 PF 提高。
若系统从 PF1 提升到 PF2,则所需补偿无功功率约为:
Q_c = P·(tanφ1 − tanφ2)
其中 φ1 = arccos(PF1),φ2 = arccos(PF2)。
该公式在控制系统中非常关键,可用于计算“理论所需补偿量”,再映射到电容分级投切。
- 系统功能设计
3.1 电参量测量功能(电压、电流实时采集)
系统通过电压采样与电流采样模块对电网信号进行隔离与缩放,将交流电压、电流转换为单片机可采集的安全信号,经过 ADC 采样后进行数字处理。测量指标通常包括:
- 电压有效值 U_rms
- 电流有效值 I_rms
- 频率 f(可选)
- 波形畸变率 THD(可选扩展)
为了长期稳定监测,采样系统必须具备:
3.2 无功功率与功率因数检测功能
系统通过采样得到的电压与电流离散序列,计算瞬时功率 p[n] = u[n]·i[n],再通过周期平均得到有功功率 P。同时可通过相位差计算或正交分量法估算无功功率 Q,最终得到功率因数 PF。
常用算法包括:
- 基于相位差 φ 的计算:PF = cosφ
- 基于功率定义:PF = P / (U_rms·I_rms)
无功功率可由:Q = √(S² − P²)(正弦条件下)
或采用正交信号法直接计算 Q。
系统应结合现场工况,考虑畸变波形情况下 PF 的定义(可用位移因数与真功率因数区分),但在常规三相/单相补偿场景中,上述方法已可满足工程需求。
3.3 电容组自动投切功能(闭环补偿)
系统配置一组分级电容阵列,例如 1kvar、2kvar、4kvar、8kvar……形成二进制组合或等阶组合,可实现灵活补偿。单片机根据:
- 当前 P、Q、PF
- 目标功率因数 PF_target
计算所需补偿无功 Q_c,并选择合适的电容组合进行投切,使 PF 逼近目标值并保持稳定。
投切策略必须考虑:
- 目标区间与死区(避免频繁投切)
- 投切延时(接触器机械响应时间)
- 电容放电时间(防止重投冲击)
- 投切顺序(避免大电流涌入)
- 过补偿保护(防止 PF 超过 1 产生容性无功)
3.4 手动/自动双模式功能
系统提供两种运行模式:
- 自动模式:闭环控制,根据 PF_target 自动投切。
- 手动模式:用户通过按键或界面选择投切某一组或某几组电容,用于调试、维护或特殊运行策略。
手动模式下系统仍可监测 PF 并提示当前无功状态,但不进行自动投切(或只进行安全限制,如禁止过补偿)。
3.5 人机交互显示与参数设定功能
系统需提供友好界面显示:
- 电压 U_rms
- 电流 I_rms
- 有功功率 P
- 无功功率 Q
- 功率因数 PF
- 目标功率因数 PF_target
- 计算所需补偿无功 Q_c
- 实际投切电容总无功 Q_cap_on(或等效电容值)
- 当前模式(AUTO/MANUAL)
- 投切状态(各级电容 ON/OFF)
同时支持设定:
- PF_target(如 0.95、0.98)
- 投切死区(如 ±0.01)
- 最小投切时间间隔(如 10s)
- 报警阈值(过压、过流、PF 异常)
显示可采用 LCD1602、LCD12864 或 TFT 彩屏;若需要更丰富界面与历史曲线,可扩展为串口上位机或触摸屏。
3.6 数据存储与记录功能
系统将关键运行参数与状态存储在 EEPROM/Flash 或外部存储器中,实现:
- 目标 PF 与阈值长期保存
- 投切次数统计(用于寿命管理)
- 运行日志(时间戳 + PF + 投切状态)
- 异常事件记录(过压、过流、投切失败)
这些数据可用于后期整定优化:例如调整电容级数配置、投切延时、死区大小等。
3.7 可靠性仿真与验证功能
由于无功补偿涉及电网、负载、电容器、接触器等多物理因素,仿真验证非常重要。通过建立电路模型,可评估:
- 补偿前后的 PF 变化
- 投切阶跃对电压、电流冲击
- 欠补偿/过补偿行为
- 控制策略稳定性(是否频繁投切)
- 在负载变化时的动态响应
常用仿真工具包括 MATLAB/Simulink、PSIM、Multisim、PSpice 等。仿真可在设计阶段提前发现风险并优化参数。
- 系统电路设计
4.1 硬件总体结构与模块划分
本系统硬件电路可分为以下模块:
1)单片机主控模块
2)电压采样与隔离模块
3)电流采样与隔离模块
4)信号调理与 ADC 采样模块
5)电容组投切执行模块(接触器/固态继电器/晶闸管)
6)驱动与隔离模块(光耦、驱动芯片)
7)人机交互模块(显示、按键、指示灯)
8)数据存储模块
9)电源模块(强电/弱电隔离、稳压、滤波)
10)保护与抗干扰模块(浪涌、过压、过流、EMI)
在工程实现中,强电部分(电容组与接触器)与弱电控制部分必须严格隔离,并合理布局,确保安全性与抗干扰能力。
4.2 单片机主控模块
4.2.1 主控芯片功能需求
单片机需要完成实时采样与计算、执行控制与人机交互,因此建议具备:
- 多通道 ADC(同时采集电压、电流)或外置高精度 ADC 接口
- 定时器资源(采样定时、零交叉检测、投切延时)
- 通信接口(I2C/SPI/UART,用于显示、存储、上位机)
- 足够 Flash/RAM(存储算法与日志)
- 看门狗(提高可靠性)
若系统需要更高精度与更强运算能力,可选用带 DSP 指令的 MCU 或直接使用专用计量芯片 + MCU 控制的组合结构。
4.2.2 时钟与复位电路
4.2.3 调试接口与通信扩展
建议预留:
4.3 电压采样与隔离模块
4.3.1 电压采样需求与安全要求
电网电压为 220V/380V 交流高压,必须隔离与降压。电压采样需实现:
- 安全隔离(保证弱电系统安全)
- 足够精度与线性
- 抗浪涌能力(电网尖峰)
4.3.2 常见实现方案
1)电压互感器(PT)
- 隔离好、抗干扰强
- 输出为低压交流信号
- 成本较高但工业可靠性强
- 电路简单
- 但对绝缘、爬电距离要求高
- 需要高压电阻与隔离方案
适合成本敏感但必须严格按安规设计的场景。
实际工程中推荐 PT 方案,安全性更高。
4.3.3 信号幅度缩放与偏置
单片机 ADC 通常采样 0~3.3V 或 0~5V 的单极性电压。电压采样输出为交流信号,需:
- 缩放到 ADC 可接受范围
- 叠加直流偏置(例如 1.65V)使波形居中
- 增加 RC 滤波与过压钳位(保护 ADC)
4.4 电流采样与隔离模块
4.4.1 电流采样方式选择
电流采样常用方案:
1)电流互感器(CT)
- 隔离好、适合交流测量
- 输出电流信号需负载电阻转换为电压
- 广泛用于计量与保护
2)霍尔电流传感器
- 可测直流与交流
- 线性好,隔离强
- 成本较高
3)分流电阻(Shunt)
- 精度高、成本低
- 无隔离,必须配隔离放大器
- 强电系统风险较高
对于无功补偿系统,推荐 CT 或霍尔方案。
4.4.2 CT 负载电阻与保护
CT 输出必须接负载电阻(burden resistor)转换为电压,并注意:
- CT 空载会产生高电压,必须防止开路
- 在负载电阻两端可加 TVS 或钳位电路保护
- 选取合适电阻使满量程电流对应 ADC 满量程
4.4.3 电流信号偏置与滤波
与电压一样,电流采样信号为交流,需要:
- 偏置到 ADC 中点
- RC 滤波抑制高频噪声
- 保护钳位防止过流尖峰损坏 ADC
4.5 信号调理与 ADC 采样模块
4.5.1 抗混叠滤波与采样频率
为了准确计算 PF 与 Q,需要较好的波形采样。建议:
- 采样频率至少为基波频率的 64 倍(50Hz → 3.2kHz)
- 工程常用 4kHz、6.4kHz、8kHz 等
输入端加低通滤波,截止频率略高于基波(例如 500Hz~1kHz),防止高频噪声混叠。
4.5.2 ADC 精度与同步采样
若电压、电流不同步采样会引入相位误差,影响 PF。常见方案:
- MCU 具有双通道同步采样 ADC
- 或使用外部同步采样 ADC(性能更好)
- 或通过采样顺序与延时补偿修正相位误差
精度方面建议至少 12bit,若对计量精度要求更高可用 16bit ADC 或专用计量芯片(如 ADE 系列)实现更高精度测量。
4.5.3 零点漂移与校准
偏置电路与放大器存在漂移,会导致 RMS 与功率计算偏差。系统应提供:
- 零点校准(无输入时采集偏置值并扣除)
- 增益校准(通过已知电压/电流标定系数)
- 温漂补偿(可选)
校准参数可存储在 EEPROM 中长期使用。
4.6 电容组投切执行模块
4.6.1 电容组结构与分级设计
电容组通常为并联电容器阵列,可按无功容量分级:
- 例如 1kvar、2kvar、4kvar、8kvar、16kvar……
形成二进制组合可覆盖更宽范围;也可采用等阶组合降低控制复杂度。
电容器必须选用适用于交流并联补偿的电力电容器,并考虑: - 额定电压
- 无功容量
- 放电电阻
- 温升与寿命
- 防爆与保护(熔断器/断路器)
4.6.2 投切方式:接触器 vs 固态开关
1)交流接触器投切
- 成本较低,成熟可靠
- 机械寿命有限,频繁投切会磨损
- 投切会产生涌流,需要串联电抗或预充电措施
适合一般工厂补偿场景。
2)固态继电器(SSR)或晶闸管投切(TSC)
- 响应快、无机械磨损
- 成本较高
- 需要散热与 EMI 处理
适合频繁变化的负载场景。
本设计可采用接触器作为基础方案,同时在控制策略中限制投切频率,以延长寿命。
4.6.3 电容投切的关键注意事项
4.7 驱动与隔离模块(光耦/驱动芯片)
4.7.1 为什么必须隔离
控制端是弱电单片机,执行端为强电接触器线圈或固态开关。必须使用隔离模块:
- 防止强电浪涌进入 MCU 导致损坏
- 降低电磁干扰对测量精度的影响
- 提高系统安全等级
4.7.2 常见驱动结构
- MCU GPIO → 光耦 → 三极管/MOSFET → 接触器线圈
- 加续流二极管(直流线圈)或 RC 吸收(交流线圈)
- 若使用 SSR/晶闸管,可用光耦驱动器(如 MOC 系列)
驱动电路必须考虑线圈电流与功耗,并合理设计供电与散热。
4.8 人机交互模块(显示、按键、指示灯)
4.8.1 显示模块选择
可选:
- LCD1602:显示基本参数
- LCD12864:显示更多信息与菜单
- TFT:显示曲线、历史记录与丰富界面
由于本系统显示参数较多,推荐 LCD12864 或 TFT;若成本限制,LCD1602 也可通过分页显示实现。
4.8.2 按键与菜单设计
按键用于:
- 模式切换(AUTO/MANUAL)
- 投切控制(手动投切某级电容)
- 目标 PF 设定
- 阈值与参数设定
按键扫描应采用软件去抖,工业环境中建议使用硬件上拉 + RC 抗干扰。
4.8.3 指示灯与报警提示
建议配置:
- 运行灯 RUN
- 自动模式灯 AUTO
- 手动模式灯 MANUAL
- 补偿动作灯 COMP
- 故障灯 FAULT
在异常情况下可配蜂鸣器提示,提高可维护性。
4.9 数据存储模块
4.9.1 存储内容
- PF_target、死区、投切间隔等配置参数
- 投切状态与累计投切次数
- 日志记录(时间戳+PF+Q+投切组合)
- 异常事件记录
4.9.2 存储器选择
- 外置 I2C EEPROM(如 24Cxx)
- MCU 内部 EEPROM 或 Flash 模拟 EEPROM
- 若需大量日志,可扩展 SPI Flash 或 SD 卡
在工业补偿系统中,配置参数 EEPROM 足够,日志可选择性存储(例如每 10 分钟记录一次,减少写入次数)。
4.9.3 写入策略与寿命保护
- 仅在参数变化且用户确认时写入配置
- 日志采用循环覆盖(Ring Buffer)
- 写入前校验与写入后校验,防止掉电损坏
- 记录投切次数可用于维护预警(接触器寿命管理)
4.10 电源与保护模块(强电/弱电隔离)
4.10.1 电源结构
系统通常从电网取电,需转换为:
- 弱电控制电源:5V/3.3V(MCU、显示、传感器)
- 执行电源:12V/24V(接触器线圈)
建议采用隔离电源模块(AC-DC 隔离电源),并在输入端配置: - 熔断器
- 浪涌保护器(MOV)
- EMI 滤波器
提高抗扰动能力。
4.10.2 保护电路
- 过压保护:采样检测到 U 超限则停止投切并报警
- 过流保护:I 超限时禁止投切,避免事故扩大
- 过温保护:电容柜或控制板温度过高时报警
- 接触器吸合检测(可选):若投切失败则记录故障
- 软硬件看门狗:防止控制失效
4.10.3 布局与安规要求
强弱电之间保持足够爬电距离与电气间隙,信号隔离器件与继电器驱动部分要合理分区布线。电流采样、ADC 参考与模拟地要远离继电器线圈与电容投切走线,减少噪声耦合,保证测量准确性。
- 程序设计
5.1 软件总体架构
5.1.1 系统软件模块划分
1)系统初始化模块
2)采样与数据采集模块(电压/电流 ADC 或计量芯片读取)
3)数字信号处理模块(RMS、P、Q、S、PF 计算)
4)补偿需求计算模块(根据 PF_target 求 Q_c)
5)电容组选择与投切控制模块(策略、死区、延时、保护)
6)手动模式控制模块
7)人机交互与显示模块(菜单、参数设定)
8)数据存储与日志模块
9)故障检测与报警模块
10)系统调度与状态机模块(定时器节拍)
5.1.2 调度策略与实时性要求
- 采样任务:高优先级,固定采样频率(如 6.4kHz)
- 功率计算:可每 1 个电网周期更新一次(20ms)或每 10 个周期更新一次(200ms)
- 投切决策:低频执行(例如 1s 评估一次),并加入最小投切间隔
- 显示刷新:200ms~500ms
- 按键扫描:10ms
这样既保证测量实时准确,又避免频繁投切造成机械损耗。
5.1.3 状态机设计思想
系统运行状态可设计为:
- INIT:初始化与自检
- RUN_AUTO:自动补偿运行
- RUN_MANUAL:手动运行
- FAULT:故障状态(停止投切,保持监测与报警)
投切过程也可使用子状态机:WAIT → PRECHECK → SWITCH_ON/OFF → CONFIRM → COOLDOWN。
5.2 电参量采样与 RMS 计算模块
5.2.1 采样数据获取
系统以定时器触发 ADC,在固定采样率下采集电压与电流,得到离散序列 u[n]、i[n]。采样时要扣除偏置:
u_ac[n] = u[n] − u_offset
i_ac[n] = i[n] − i_offset
偏置可通过开机校准或运行中低通估计获得。
5.2.2 有效值计算(RMS)
在一个窗口(通常为整周期 N 点)内计算:
U_rms = sqrt( (1/N) Σ u_ac[n]^2 )
I_rms = sqrt( (1/N) Σ i_ac[n]^2 )
窗口可取 1 周期或多周期平均以提高稳定性。
5.2.3 频率与零交叉检测(可选)
通过检测电压波形零交叉,可估算频率并用于:
- 精确同步采样窗口
- 投切零交叉控制
- 避免频率变化导致计算误差
5.3 有功功率 P 与视在功率 S 计算模块
5.3.1 瞬时功率与平均
瞬时功率:p[n] = u_ac[n]·i_ac[n]
有功功率:P = (1/N) Σ p[n]
视在功率:S = U_rms·I_rms
5.3.2 功率因数 PF 计算
PF = P / S
若 S 接近 0(电流很小)应避免除零,直接认为 PF 无效或置为 1 并禁止投切。
5.4 无功功率 Q 计算模块
5.4.1 基于功率关系计算 Q
在正弦条件下可用:
Q = sqrt(S^2 − P^2)
并根据相位方向判断符号(感性为 +Q,容性为 −Q)。符号可通过相位差或电压超前/滞后判断。
5.4.2 正交分量法(可选更鲁棒)
构造电压的正交信号 u_q[n](电压延迟 90°),则:
Q ≈ (1/N) Σ u_q[n]·i_ac[n]
这种方法对畸变波形更鲁棒,但实现需要数字移相滤波或 Hilbert 变换近似,软件复杂度更高。
在课程设计或一般补偿柜应用中,采用 √(S²−P²) 并结合方向判断即可满足需求。
5.5 补偿需求计算模块(Q_c 与目标 PF)
5.5.1 计算所需补偿无功
设目标功率因数 PF_target,当前 PF_now,已知有功功率 P,则:
φ_now = arccos(PF_now)
φ_tar = arccos(PF_target)
Q_need = P·(tanφ_now − tanφ_tar)
若 Q_need < 0,说明已接近或超过目标(可能过补偿),此时应退投电容或保持不动。
5.5.2 死区与稳定控制
为了避免频繁投切,应设置:
- PF 死区:PF_target ± ΔPF
例如目标 0.98,死区 ±0.01,则 PF 在 0.97~0.99 之间不动作。 - Q 死区:|Q_need| < Q_dead 也不动作
双死区策略能大幅提升稳定性,降低接触器磨损。
5.6 电容组选择与投切决策模块
5.6.1 电容级数与等效无功容量
假设系统有 M 级电容,每级容量 Qc[i](kvar),当前投切状态 state[i](0/1),则当前已投无功:
Q_on = Σ state[i]·Qc[i]
目标是使:
Q_on ≈ Q_need
但要避免过补偿,通常要求:
Q_on ≤ Q_need + margin
并通过最小误差或贪心算法选取组合。
5.6.2 组合选择算法(工程常用)
常见方法:
- 贪心法(从大到小):优先投切大容量,使误差尽快缩小,再用小容量微调。
- 二进制组合:若电容按 1、2、4、8…配置,选择等价于二进制分解,简单高效。
- 最小误差搜索:遍历所有组合寻找最接近 Q_need 的组合,适合级数较少(≤8 级)场景。
系统设计中为了降低复杂度,推荐采用“二进制分级 + 贪心”结合。
5.6.3 投切控制约束
投切必须遵守:
- 最小投切间隔(如 10s)
- 单次动作最多投/退 1 级或 2 级(避免电流突变)
- 投切时必须检查电压、电流是否在安全范围
- 电容退投后需等待放电时间再允许重投
这些约束决定了控制策略必须有“动作队列”或“冷却计时器”。
5.7 手动模式控制模块
5.7.1 手动投切逻辑
手动模式下,用户通过按键选择某级电容:
- 按
UP/DOWN选择电容级 - 按
ON/OFF投切
系统执行投切时仍应检查: - 放电时间
- 电压/电流安全
- 防止过补偿
若用户指令不安全,系统应拒绝并提示原因。
5.7.2 手动调试辅助信息
手动模式下显示界面可重点显示:
- 当前 PF、Q、Q_need
- 当前投切组合与 Q_on
- 用户正在操作的电容级与容量
这样便于现场调试与整定。
5.8 人机交互与显示模块
5.8.1 界面内容与分页设计
界面可分为:
- 主界面:U、I、PF、模式、Q_need、Q_on
- 详细界面:P、Q、S、频率
- 电容界面:各级电容状态
- 设置界面:PF_target、死区、投切间隔
- 日志界面:历史 PF 与投切记录(可选)
5.8.2 按键扫描与菜单状态机
按键扫描 10ms 进行去抖,并实现短按/长按加速调整。菜单状态机避免复杂 if-else,提高可维护性。
5.9 数据存储与日志模块
5.9.1 日志格式与存储策略
日志可采用结构体:
- 时间戳(或累计运行秒数)
- U、I、PF、Q_need、Q_on
- 投切位图(bitmask)
- 故障码
存储采用循环队列写入,避免 Flash 寿命问题。配置参数只在修改时写入。
5.9.2 历史查询与优化意义
通过历史数据可分析:
- 负载变化规律
- 电容级数是否合理(是否经常满投或满退)
- 投切频率是否过高(是否需要扩大死区或延长间隔)
- PF 是否长期达标
从而优化整定,使系统更经济可靠。
5.10 故障检测与保护模块
5.10.1 常见故障类型
- 过压、欠压
- 过流
- PF 异常(接近 0 或波动过大)
- 采样故障(传感器断线、ADC 饱和)
- 投切失败(接触器未吸合或粘连)
- 电容故障(熔断、容量衰减)
5.10.2 保护策略
- 故障时立即停止自动投切,保留监测
- 记录故障日志并提示
- 对严重故障可断开所有电容并锁定
- 通过按键或远程命令复位故障状态
- 程序示例代码(核心算法与控制框架示例)
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include <string.h>
/* =========================
参数定义
========================= */
#define CAP_LEVELS 6
typedef struct {
float pf_target; // 目标功率因数
float pf_deadband; // PF死区
float min_switch_interval_s; // 最小投切间隔(s)
float discharge_time_s; // 放电时间(s)
} cfg_t;
typedef struct {
float urms;
float irms;
float p; // 有功功率(W)
float s; // 视在功率(VA)
float q; // 无功功率(var)
float pf; // 功率因数
} meas_t;
typedef struct {
bool auto_mode;
uint32_t sec_tick; // 系统秒计数
uint32_t last_switch_sec;
uint32_t last_off_sec[CAP_LEVELS]; // 每级退投时间,用于放电判断
uint8_t cap_state; // 投切位图(1=ON)
} state_t;
/* =========================
电容级配置(单位:kvar)
例:二进制分级 1,2,4,8,16,32 kvar
========================= */
static const float CAP_KVAR[CAP_LEVELS] = {1,2,4,8,16,32};
static cfg_t g_cfg = {
.pf_target = 0.98f,
.pf_deadband = 0.01f,
.min_switch_interval_s = 10.0f,
.discharge_time_s = 15.0f
};
static state_t g_st = {
.auto_mode = true,
.sec_tick = 0,
.last_switch_sec = 0,
.cap_state = 0
};
/* =========================
计算所需补偿无功(kvar)
Q_need = P*(tanφ_now - tanφ_tar)
P单位W -> kvar 需要除1000
========================= */
static float Calc_Qneed_kvar(float p_w, float pf_now, float pf_tar)
{
if (pf_now <= 0.01f) return 0.0f; // 避免异常
if (pf_tar > 0.999f) pf_tar = 0.999f;
float phi_now = acosf(pf_now);
float phi_tar = acosf(pf_tar);
float q_need_var = p_w * (tanf(phi_now) - tanf(phi_tar));
return q_need_var / 1000.0f; // kvar
}
/* =========================
当前已投电容无功(kvar)
========================= */
static float Calc_Qon_kvar(uint8_t cap_state)
{
float sum = 0.0f;
for (int i = 0; i < CAP_LEVELS; i++) {
if (cap_state & (1 << i)) sum += CAP_KVAR[i];
}
return sum;
}
/* =========================
贪心选择目标投切组合,使 Q_on 接近 Q_need
不允许明显过补偿(可加margin)
========================= */
static uint8_t Select_CapState(float q_need_kvar)
{
if (q_need_kvar <= 0.0f) return 0;
float remain = q_need_kvar;
uint8_t state = 0;
// 从大到小贪心
for (int i = CAP_LEVELS - 1; i >= 0; i--) {
if (CAP_KVAR[i] <= remain + 0.2f) { // margin 0.2kvar
state |= (1 << i);
remain -= CAP_KVAR[i];
}
}
return state;
}
/* =========================
放电时间检查:若该级刚退投且未到放电时间,不允许重投
========================= */
static bool Can_SwitchOn_Level(int level)
{
uint32_t off_sec = g_st.last_off_sec[level];
if (off_sec == 0) return true; // 从未退投
uint32_t dt = g_st.sec_tick - off_sec;
return (dt >= (uint32_t)g_cfg.discharge_time_s);
}
/* =========================
执行投切(硬件接口由用户实现)
========================= */
extern void HW_Cap_Switch(int level, bool on);
static void Apply_CapState(uint8_t target)
{
// 限制投切频率
if ((g_st.sec_tick - g_st.last_switch_sec) < (uint32_t)g_cfg.min_switch_interval_s) {
return;
}
// 单次动作限制:最多改变1级(避免冲击)
uint8_t diff = g_st.cap_state ^ target;
if (diff == 0) return;
for (int i = 0; i < CAP_LEVELS; i++) {
if (diff & (1 << i)) {
bool to_on = (target & (1 << i)) ? true : false;
if (to_on) {
if (!Can_SwitchOn_Level(i)) continue; // 放电未完成
HW_Cap_Switch(i, true);
g_st.cap_state |= (1 << i);
} else {
HW_Cap_Switch(i, false);
g_st.cap_state &= ~(1 << i);
g_st.last_off_sec[i] = g_st.sec_tick;
}
g_st.last_switch_sec = g_st.sec_tick;
break; // 只切换1级
}
}
}
/* =========================
自动模式主控制函数(每1秒调用一次)
========================= */
static void Auto_Control_1s(const meas_t *m)
{
if (!g_st.auto_mode) return;
// PF死区判断
float pf_low = g_cfg.pf_target - g_cfg.pf_deadband;
float pf_high = g_cfg.pf_target + g_cfg.pf_deadband;
// 若PF已在目标区间且无明显无功需求,可保持
if (m->pf >= pf_low && m->pf <= pf_high) {
return;
}
// 计算补偿需求
float q_need_kvar = Calc_Qneed_kvar(m->p, m->pf, g_cfg.pf_target);
uint8_t target_state = Select_CapState(q_need_kvar);
// 应用目标状态
Apply_CapState(target_state);
}
/* =========================
电参量计算示例(基于采样窗口)
实际工程中采样来自ADC中断缓冲
========================= */
#define N_SAMPLES 256
typedef struct {
float u[N_SAMPLES];
float i[N_SAMPLES];
} sample_buf_t;
static void Calc_Meas_FromSamples(const sample_buf_t *sb, meas_t *out)
{
float sum_u2 = 0.0f, sum_i2 = 0.0f, sum_p = 0.0f;
for (int n = 0; n < N_SAMPLES; n++) {
float u = sb->u[n];
float i = sb->i[n];
sum_u2 += u * u;
sum_i2 += i * i;
sum_p += u * i;
}
float urms = sqrtf(sum_u2 / N_SAMPLES);
float irms = sqrtf(sum_i2 / N_SAMPLES);
float p = sum_p / N_SAMPLES;
float s = urms * irms;
float pf = (s > 1e-3f) ? (p / s) : 1.0f;
// Q 在正弦假设下用 sqrt(S^2 - P^2)
float q = 0.0f;
float t = s*s - p*p;
if (t > 0.0f) q = sqrtf(t);
out->urms = urms;
out->irms = irms;
out->p = p;
out->s = s;
out->pf = pf;
out->q = q;
}
/* =========================
主循环与任务调度示意
========================= */
extern volatile bool flag_10ms;
extern volatile bool flag_200ms;
extern volatile bool flag_1s;
static meas_t g_meas;
static void Task_UI_10ms(void);
static void Task_Display_200ms(void);
static void Task_Store_1s(const meas_t *m);
int main(void)
{
// 初始化硬件:ADC、GPIO、显示、存储、驱动、定时器、看门狗等
sample_buf_t sb; // 实际工程应为ADC缓冲区
while (1) {
if (flag_10ms) {
flag_10ms = false;
Task_UI_10ms(); // 按键扫描、菜单处理
}
if (flag_200ms) {
flag_200ms = false;
// 从采样缓冲计算电参量(示意)
Calc_Meas_FromSamples(&sb, &g_meas);
Task_Display_200ms();
}
if (flag_1s) {
flag_1s = false;
g_st.sec_tick++;
Auto_Control_1s(&g_meas);
Task_Store_1s(&g_meas);
}
// 喂狗、低功耗等
}
}
- 系统仿真建模与验证说明(可靠性仿真)
7.1 仿真建模的必要性
无功补偿系统涉及强电元件与动态控制,直接上电实验存在安全风险与成本压力。仿真可在低风险条件下验证:
- 电容投切后无功变化是否符合预期
- PF 是否能稳定收敛到目标值
- 投切阶跃是否引起过冲或振荡
- 控制参数(死区、投切间隔、级数)是否合理
- 负载变化时系统动态响应速度与稳定性
7.2 电路模型构成
典型仿真模型包括:
- 电源:单相或三相交流源
- 负载:R-L 负载或电机等效模型(可设置可变负载)
- 补偿电容组:并联电容阵列(带放电电阻)
- 开关:接触器模型或理想开关 + 延时
- 测量模块:电压/电流测量块,输出到控制器
- 控制器:单片机算法的离散控制模型(可用 Simulink Stateflow)
7.3 关键仿真场景与指标
- 场景 1:负载恒定,从 PF=0.75 提升到 0.98,观察 PF、Q、I 的变化曲线
- 场景 2:负载阶跃变化(轻载→重载→轻载),观察投切响应与稳定性
- 场景 3:投切延时与死区不同组合,观察是否频繁投切
- 场景 4:过补偿测试,检查控制器是否能及时退投并保持 PF 不超过上限
- 指标:PF 误差、投切次数、响应时间、电流峰值、稳态波动幅度
7.4 仿真结果对工程整定的指导意义
通过仿真可提前确定:
- 电容级数与容量分配是否合理
- 最小投切间隔与放电时间的推荐值
- 死区大小与控制稳定性的关系
- 在负载剧烈波动场景是否需要采用晶闸管快速补偿(TSC)
仿真结论可作为硬件选型、控制策略与参数整定的重要依据。
- 工程可靠性与实现要点分析
8.1 投切频繁问题的根源与解决办法
频繁投切会导致接触器寿命缩短、电容冲击增大、系统振荡。根源包括:
- PF 计算抖动(测量噪声)
- 死区过小
- 投切步长过大/级数不合理
- 负载变化频繁且幅度大
解决办法: - 多周期平均减少 PF 抖动
- 合理设置死区与最小投切间隔
- 优化电容级数(更细分)
- 限制单次投切级数,逐级逼近目标
8.2 过补偿风险与保护策略
过补偿会导致 PF > 1(系统呈容性),可能引发电压升高与谐振风险。保护策略:
- 设置 PF 上限(如 0.99)超过则禁止继续投入
- 检测 Q 的符号,出现容性无功则退投
- 在含谐波环境加入电抗器(防谐振)
8.3 测量精度对控制效果的影响
PF 与 Q 计算误差会直接导致投切错误。提高测量精度的关键措施:
- 电压、电流同步采样减少相位误差
- 优化模拟前端滤波与偏置
- 采用高精度 ADC 或计量芯片
- 校准与温漂补偿
- 软件平均与异常值剔除
8.4 电容柜工程安全与维护性
电容柜属于高压设备,必须:
- 具备完善的放电、熔断保护
- 投切元件具有足够容量
- 控制板与强电隔离
- 提供维护接口(日志、投切次数、故障记录)
- 具备故障锁定与人工复位机制
这决定了系统不仅要“能补偿”,更要“安全、稳定、可维护”。
- 总结
基于单片机的功率因数校正与无功补偿系统通过实时采集电网电压与电流,在线计算有功功率、无功功率与功率因数,并根据目标功率因数自动投切电容组,实现动态无功补偿与功率因数校正。系统支持手动与自动双模式,便于现场调试与稳定运行;通过友好的人机交互界面实时显示关键电参量、补偿需求与投切状态,并支持阈值与目标功率因数设定;通过数据存储与历史记录功能,为运行优化与整定提供依据;通过仿真建模与验证,可评估补偿效果、稳定性与抗扰动性能,从而在设计阶段减少风险并提升工程可靠性。整体方案结构模块化、可扩展性强,适用于工厂配电无功补偿柜、楼宇电能质量管理以及教学科研的功率因数校正与补偿控制系统开发。
1303