1. 单相逆变并网系统概述
单相逆变并网技术是新能源发电系统中的关键环节,它将直流电能转换为与电网同步的交流电能。这套系统主要由三个核心技术模块构成:锁相环(PLL)实现电网同步,DQ变换完成坐标系转换,以及双闭环控制确保系统稳定运行。
在实际工程中,我们通常使用STM32系列MCU作为控制核心。以STM32F407为例,其内置的硬件FPU和PWM定时器特别适合这种实时性要求高的电力电子控制应用。系统工作时,首先通过ADC采样电网电压,经锁相环提取电网相位信息,再通过DQ变换将交流量转换为直流量进行控制,最后通过PWM驱动逆变桥输出。
关键提示:整个系统的控制周期通常设计在50-100μs之间,这对代码效率提出了极高要求。务必使用硬件FPU并优化三角函数运算。
2. 硬件平台搭建要点
2.1 STM32最小系统配置
推荐使用STM32F4系列芯片,配置时钟为168MHz以获取足够处理能力:
c复制void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
}
2.2 关键外设初始化
ADC配置需要注意采样保持时间:
c复制void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = ENABLE;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
PWM定时器配置要点:
c复制void MX_TIM1_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
htim1.Init.Period = 1599; // 10kHz PWM @ 16MHz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
HAL_TIM_PWM_Init(&htim1);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 800;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 54; // 约2us
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
sBreakDeadTimeConfig.Break2Filter = 0;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
}
3. 锁相环实现详解
3.1 SRF-PLL原理分析
同步旋转坐标系锁相环(SRF-PLL)通过将电网电压转换到旋转坐标系下,提取q轴分量作为相位误差信号。与传统过零检测法相比,SRF-PLL具有更好的抗干扰能力。
实现流程:
- 采样电网电压vα
- 生成虚拟β分量:vβ = -vα(延迟90°)
- Park变换到dq坐标系
- q轴分量作为误差信号输入PI调节器
- 调节器输出频率积分得到相位角
3.2 优化实现代码
采用单相虚拟β生成法,减少计算量:
c复制typedef struct {
float theta; // 输出相位
float freq; // 输出频率
float integ; // 积分项
float kp; // 比例系数
float ki; // 积分系数
} PLL_TypeDef;
void PLL_Update(PLL_TypeDef *pll, float v_alpha) {
static float v_beta_prev[2] = {0};
// 虚拟β生成(1/4周期延迟)
float v_beta = -0.5f*(v_beta_prev[0] + v_beta_prev[1]);
v_beta_prev[1] = v_beta_prev[0];
v_beta_prev[0] = v_alpha;
// Park变换
float sin_theta = sinf(pll->theta);
float cos_theta = cosf(pll->theta);
float vq = -v_alpha * sin_theta + v_beta * cos_theta;
// PI调节
float freq_delta = pll->kp * vq + pll->ki * pll->integ;
pll->integ += vq;
// 频率限制
freq_delta = fmaxf(fminf(freq_delta, 5.0f), -5.0f); // ±5Hz限幅
pll->freq = 50.0f + freq_delta;
// 相位更新
pll->theta += 2 * PI * pll->freq * CONTROL_PERIOD;
pll->theta = fmodf(pll->theta, 2*PI);
}
调试技巧:初始调试时可先固定theta=0,观察vq是否随电网相位变化,验证Park变换正确性。
4. DQ变换实现与优化
4.1 单相系统DQ变换特点
单相系统需要构造虚拟正交分量才能应用DQ变换。常用方法有:
- 1/4周期延迟法
- 希尔伯特变换法
- 基于PLL的正交信号生成法
4.2 硬件优化实现
利用STM32硬件FPU和三角函数加速单元:
c复制typedef struct {
float d;
float q;
} DQ_Frame;
DQ_Frame ClarkePark_Transform(float alpha, float beta, float theta) {
DQ_Frame output;
float sin_theta, cos_theta;
// 使用硬件FPU加速计算
arm_sin_cos_f32(theta * 180.0f/PI, &sin_theta, &cos_theta);
output.d = alpha * cos_theta + beta * sin_theta;
output.q = -alpha * sin_theta + beta * cos_theta;
return output;
}
// 反变换
void InvClarkePark_Transform(DQ_Frame input, float theta, float *alpha, float *beta) {
float sin_theta, cos_theta;
arm_sin_cos_f32(theta * 180.0f/PI, &sin_theta, &cos_theta);
*alpha = input.d * cos_theta - input.q * sin_theta;
*beta = input.d * sin_theta + input.q * cos_theta;
}
实测性能对比:
| 实现方式 | 执行时间(us) |
|---|---|
| 软件浮点 | 45.2 |
| 硬件FPU | 12.6 |
| 查表法 | 8.4 |
| 多项式近似 | 5.2 |
5. 双闭环控制系统设计
5.1 电流环设计要点
电流内环需要快速响应,带宽通常设计在1-2kHz:
c复制typedef struct {
float Kp;
float Ki;
float max_output;
float integ;
float integ_limit;
} PI_Controller;
void PI_Init(PI_Controller *pi, float kp, float ki, float max_out) {
pi->Kp = kp;
pi->Ki = ki;
pi->max_output = max_out;
pi->integ = 0;
pi->integ_limit = max_out / ki * 0.8f; // 留20%余量
}
float PI_Update(PI_Controller *pi, float error) {
pi->integ += error * CONTROL_PERIOD;
// 抗积分饱和
if(pi->integ > pi->integ_limit) pi->integ = pi->integ_limit;
else if(pi->integ < -pi->integ_limit) pi->integ = -pi->integ_limit;
float output = pi->Kp * error + pi->Ki * pi->integ;
return fmaxf(fminf(output, pi->max_output), -pi->max_output);
}
5.2 电压环设计要点
电压外环带宽通常为电流环的1/10左右:
c复制// 电压环PI参数示例
PI_Controller voltage_loop;
PI_Init(&voltage_loop, 0.5f, 50.0f, 5.0f);
// 电流环PI参数示例
PI_Controller current_loop;
PI_Init(¤t_loop, 5.0f, 500.0f, 10.0f);
5.3 系统级联控制实现
c复制void GridTie_Control(void) {
// 读取采样值
float v_grid = ADC_GetGridVoltage();
float i_inv = ADC_GetInverterCurrent();
float v_dc = ADC_GetDcVoltage();
// 锁相环更新
PLL_Update(&pll, v_grid);
// DQ变换
DQ_Frame i_dq = ClarkePark_Transform(i_inv, 0, pll.theta);
// 电压环计算
float vdc_error = VDC_REF - v_dc;
float i_ref_d = PI_Update(&voltage_loop, vdc_error);
// 电流环计算
float i_error_d = i_ref_d - i_dq.d;
float i_error_q = 0 - i_dq.q; // q轴通常控制为0
float v_ref_d = PI_Update(¤t_loop_d, i_error_d);
float v_ref_q = PI_Update(¤t_loop_q, i_error_q);
// 反DQ变换
float v_alpha, v_beta;
InvClarkePark_Transform((DQ_Frame){v_ref_d, v_ref_q}, pll.theta, &v_alpha, &v_beta);
// PWM生成
PWM_SetDuty(v_alpha / V_DC_BUS * PWM_MAX_DUTY);
}
6. 关键调试技巧与问题排查
6.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电流波形畸变 | 锁相不同步 | 检查PLL参数,降低带宽 |
| 系统振荡 | PI参数不当 | 先调P再调I,降低增益 |
| 直流偏置 | ADC零点漂移 | 增加软件校准 |
| 并网失败 | 相位偏差大 | 检查PLL锁定状态 |
| MOSFET发热 | 死区不足 | 增大死区时间 |
6.2 实测波形分析
正常工作时各点波形特征:
- 电网电压:标准正弦波,THD<3%
- 并网电流:与电压同相位,THD<5%
- PWM波形:中央对齐,死区清晰可见
6.3 安全注意事项
- 上电前必须用示波器确认PWM死区
- 调试时先低压供电测试
- 电流采样电阻功率要足够
- 接地要可靠,避免共模干扰
- 保留足够的软件保护机制
7. 性能优化进阶
7.1 计算加速技巧
- 使用STM32硬件CRC单元加速校验计算
- 将三角函数表存入CCM RAM加速访问
- 使用DMA双缓冲模式实现无阻塞ADC采样
- 关键代码用汇编优化
7.2 动态参数调整
根据工作状态自动调节控制参数:
c复制void Adaptive_Parameter_Tuning(void) {
// 根据功率等级调整电流环带宽
float power_level = fabsf(i_dq.d) / I_MAX;
current_loop.Kp = 5.0f + 10.0f * power_level;
current_loop.Ki = 500.0f + 1000.0f * power_level;
// 电网电压跌落时增强鲁棒性
if(v_grid < 0.9f * V_GRID_NOMINAL) {
pll.kp *= 0.8f;
pll.ki *= 0.5f;
}
}
7.3 抗干扰设计
- 增加软件滤波算法
- 实现电网电压前馈补偿
- 加入谐波补偿环节
- 设计抗饱和机制
通过以上优化,系统在实测中可实现:
- 并网电流THD < 3%
- 功率因数 > 0.99
- 动态响应时间 < 20ms
- 最大效率 > 97%