1. STM32并网同步控制核心原理剖析
在新能源发电系统中,并网同步控制是确保逆变器输出与电网安全连接的关键技术。作为一名长期从事电力电子开发的工程师,我经常需要处理各种并网同步问题。今天我将分享基于STM32H743的工业级实现方案,这套代码已经在我们多个光伏逆变器项目中稳定运行超过2年。
1.1 SRF-PLL技术基础
同步旋转坐标系锁相环(SRF-PLL)是目前并网控制的主流方案,其核心思想是通过坐标变换将交流信号转换为直流信号进行处理。具体实现流程如下:
- 三相电压采样:通过ADC以10kHz频率采集电网三相电压信号(Ua、Ub、Uc)
- 二阶低通滤波:截止频率设为100Hz,主要滤除5次(250Hz)和7次(350Hz)谐波
- Clark变换:将三相静止坐标系转换为两相静止坐标系(αβ坐标系)
code复制Uα = Ua - 0.5*Ub - 0.5*Uc Uβ = (√3/2)*Ub - (√3/2)*Uc - Park变换:将αβ坐标系转换为随电网频率旋转的dq坐标系
code复制其中θ为估计的电网相位角Ud = Uα*cosθ + Uβ*sinθ Uq = -Uα*sinθ + Uβ*cosθ
关键点:当锁相准确时,q轴分量Uq=0,d轴分量Ud=电网电压幅值。这就是PLL调节的基础。
1.2 锁相环动态调节原理
PI调节器通过Uq误差来修正频率和相位:
code复制频率误差 = Kp*Uq + Ki*∫Uq dt
相位角 θ = ∫(2π*f) dt
在实际工程中,PI参数选择至关重要:
- Kp过大 → 锁相环振荡
- Kp过小 → 动态响应慢
- Ki过大 → 超调严重
- Ki过小 → 稳态误差大
经过多次实测,我们发现对于50Hz电网:
- Kp=2.8
- Ki=25
能在300ms内实现稳定锁相,且相位偏差<1°。
1.3 同步判断逻辑
并网需要满足三个条件:
- 相序正确(A-B-C顺序)
- 相位偏差≤1°
- 频率偏差≤0.5Hz
在代码中通过以下方式实现:
c复制if(phase_seq_flag &&
(fabsf(phase_err) <= 1.0f) &&
(fabsf(freq_err) <= 0.5f))
{
// 满足同步条件
}
2. 硬件系统设计与实现
2.1 STM32H743平台选型
选择STM32H743ZGT6主要基于以下考虑:
- 400MHz主频 + FPU:满足10kHz控制频率下的浮点运算需求
- 3路差分ADC:可直接连接电压传感器
- 丰富定时器:TIM1用于生成精确的100μs中断
- 工业级温度范围:-40℃~85℃
2.2 关键外设配置
ADC配置要点:
- 采样率:10kHz(每个控制周期采样一次)
- 分辨率:12位(实际精度约11位)
- 采样时间:ADC时钟设为30MHz,采样周期=8.5(约0.28μs)
- 触发源:TIM1触发注入组
定时器配置:
c复制htim1.Instance = TIM1;
htim1.Init.Prescaler = 400-1; // 1MHz计数频率
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 100-1; // 100μs中断
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
2.3 硬件连接示意图
code复制电网电压 → 电压传感器 → STM32H743
↑ ↑
│ └── ADC1_IN0/1/2 (Ua,Ub,Uc)
│
└────── 比较器 → GPIO (过零检测)
TIM1_CH1 → 继电器驱动电路
GPIOA1 → 锁定状态LED
3. 软件实现详解
3.1 主控制流程
在10kHz定时中断中执行以下步骤:
c复制void TIM1_UP_IRQHandler(void)
{
// 1. 电压采样与滤波
ADC_Sample();
VoltageFilter(&Ua_raw, &Ua_filter);
VoltageFilter(&Ub_raw, &Ub_filter);
VoltageFilter(&Uc_raw, &Uc_filter);
// 2. 坐标变换
ClarkTransform(Ua_filter, Ub_filter, Uc_filter, &Uα, &Uβ);
ParkTransform(Uα, Uβ, grid_phase, &Ud, &Uq);
// 3. PLL计算
SRF_PLL_Calc();
// 4. 同步判断
GridSyncJudge();
// 5. 并网控制
GridConnectCtrl();
}
3.2 关键算法实现
二阶低通滤波器:
c复制void VoltageFilter(float *u_in, float *u_out)
{
static float u1=0, u2=0;
float wc = 2*3.1415926*100; // 100Hz截止频率
float a = wc * 0.0001f; // 控制周期0.1ms
float b = a/(1+a);
u2 = u1;
u1 = *u_in;
*u_out = b*(*u_out + u1 - u2);
}
相序检测优化:
传统过零检测在电压畸变时容易误判,我们改进为:
c复制void PhaseSequenceDetect(void)
{
// 检测正序过零点
if(Ua_filter>0 && prev_Ua<=0 &&
Ub_filter<0 && prev_Ub>=0) // A相上升沿对应B相下降沿
{
phase_seq_flag = 1;
}
// 检测逆序情况
else if(Ua_filter>0 && prev_Ua<=0 &&
Uc_filter<0 && prev_Uc>=0) // A相上升沿对应C相下降沿
{
phase_seq_flag = 0;
}
prev_Ua = Ua_filter;
prev_Ub = Ub_filter;
prev_Uc = Uc_filter;
}
3.3 中断优先级配置
为确保控制时序精确,需合理设置中断优先级:
code复制TIM1_UP中断:抢占优先级0(最高)
ADC中断:抢占优先级1
其他中断:抢占优先级≥2
4. 调试与优化实战
4.1 调试步骤分解
-
基础验证阶段:
- 用信号发生器输入三相50Hz正弦波
- 测量ADC采样值是否准确
- 检查Clark/Park变换结果
-
PLL调试阶段:
- 初始设置Kp=1.0, Ki=10
- 观察Uq收敛情况
- 逐步增大参数直至临界振荡点
-
动态测试:
- 突然改变输入频率(±2Hz)
- 观察锁定恢复时间
- 测试相序错误处理
4.2 常见问题解决方案
问题1:锁相环振荡
现象:grid_freq在49-51Hz间波动
解决:
- 降低Kp(每次减0.2)
- 检查滤波参数是否合适
- 确认ADC采样无干扰
问题2:锁定时间过长
现象:超过500ms才能锁定
解决:
- 增大Ki(每次加5)
- 检查PI积分限幅是否太小
- 确认电压采样比例正确
问题3:并网冲击电流大
现象:合闸瞬间电流超过1.5倍额定值
解决:
- 增加锁定后延时(300ms→500ms)
- 检查继电器动作时间
- 确认相位偏差在合闸时<0.5°
4.3 实测性能数据
经过优化后系统达到以下指标:
| 测试项目 | 指标要求 | 实测结果 |
|---|---|---|
| 锁定时间 | ≤500ms | 280ms |
| 相位偏差 | ≤1° | 0.3°~0.8° |
| 频率偏差 | ≤0.5Hz | 0.1~0.3Hz |
| 谐波畸变 | ≤3% | 2.1% |
5. 工程应用经验
5.1 参数自适应优化
在实际电网环境中,固定PI参数可能无法适应所有工况。我们增加了参数自整定逻辑:
c复制if(grid_quality_good) { // 电网质量好时提高响应速度
PLL_KP = 3.2f;
PLL_KI = 30.0f;
} else { // 电网波动大时增强稳定性
PLL_KP = 2.0f;
PLL_KI = 15.0f;
}
5.2 抗干扰设计
-
ADC采样优化:
- 采样时刻避开PWM开关噪声
- 添加硬件RC滤波(1kΩ+100nF)
-
软件滤波增强:
c复制// 增加滑动平均滤波 #define FILTER_DEPTH 5 float moving_avg_filter(float new_val) { static float buf[FILTER_DEPTH]; static uint8_t idx = 0; buf[idx++] = new_val; if(idx >= FILTER_DEPTH) idx = 0; float sum = 0; for(int i=0; i<FILTER_DEPTH; i++){ sum += buf[i]; } return sum/FILTER_DEPTH; }
5.3 扩展功能实现
基于该框架可轻松扩展:
- 孤岛检测功能
- 低电压穿越(LVRT)
- 谐波补偿控制
例如增加谐波补偿:
c复制// 在Park变换后添加
void HarmonicCompensation(void)
{
// 提取5次谐波
float theta_5th = grid_phase * 5;
float Uq_5th = -Uα*sinf(theta_5th) + Uβ*cosf(theta_5th);
// 生成补偿量
compensate = PI_Regulator(Uq_5th);
}
这套代码架构已在多个光伏电站项目中验证,最长无故障运行时间超过3年。特别是在电网电压畸变率较高(THD>5%)的地区,相比传统锁相环方案,稳定性提升显著。