C++ 函数的重载
2026/4/28 1:06:25
SVG APF有源滤波器全套系统资料。 包含: 150w电源(原理图 PCB BOM 制版文件) FPGA核心控制板(原理图 PCB BOM 制版文件) IGBT驱动板(原理图 PCB BOM 制版文件) 高速信号采样板(原理图 PCB BOM 制版文件) 母线电容板(原理图 PCB BOM 制版文件) 还有参数计算资料
SVG(静止无功发生器)和APF(有源电力滤波器)是现代电力电子技术在电力系统中的重要应用,用于实现电网的无功补偿和谐波治理。本系统基于TI DSP281x系列处理器和FPGA技术,实现了高性能的SVG/APF控制功能。
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 电压电流采样 │────▶│ DSP控制器 │────▶│ IGBT驱动 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ▲ │ │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 电网系统 │◀────│ 功率变换电路 │◀────│ FPGA协处理 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 保护电路 │ │ 通信接口 │ │ 显示面板 │ └─────────────────┘ └─────────────────┘ └─────────────────┘系统软件采用模块化设计,主要分为以下几个核心模块:
| 模块名称 | 主要功能 | 实现文件 |
|---|---|---|
| 主程序模块 | 系统初始化、主循环控制 | SunPower.c |
| 中断服务模块 | 实时控制算法执行 | ISR.c、main.c |
| 数据采集模块 | 电压电流信号采样 | ISR.c(ADCWORK函数) |
| 核心算法模块 | 坐标变换、PLL、PID、SVPWM | S3S2.c、pll.c、pidreg.c、svgen_dq.c |
| MPPT模块 | 最大功率点跟踪 | SunPower.c(MPPT函数)、ISR.c |
| 保护模块 | 过压、过流、过热等保护 | ISR.c(保护相关函数) |
| 通信模块 | 与上位机通信 | ISR.c(SCI中断) |
| 显示模块 | 状态显示和参数监控 | SunPower.c(DisplayComm函数) |
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 系统初始化 │────▶│ 主循环监控 │────▶│ 中断服务程序 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 硬件初始化 │ │ 状态显示 │ │ 数据采集 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 坐标变换 │◀────│ 核心算法计算 │────▶│ 保护功能检查 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ PLL锁相环 │ │ MPPT控制 │ │ PWM波形生成 │ └─────────────────┘ └─────────────────┘ └─────────────────┘电网电压电流 → ADC采样 → 数字滤波 → 坐标变换(3S/2S) → PLL锁相 → 坐标变换(2S/2R) → PID控制计算 → 坐标变换(2R/2S) → SVPWM生成 → IGBT驱动 → 功率变换 → 电网补偿系统主要包含以下中断服务程序:
| 中断名称 | 触发条件 | 主要功能 | 实现文件 |
|---|---|---|---|
| evatimer1isr | PWM定时器1溢出 | 核心控制算法执行 | ISR.c |
| evbtimer3isr | PWM定时器3溢出 | 辅助控制算法执行 | ISR.c |
| wakeint | 唤醒中断 | 系统唤醒处理 | ISR.c |
| evapdpintisr | 功率驱动保护 | 过流保护处理 | ISR.c |
| sciaTxFifoIsr | SCI发送FIFO中断 | 数据发送处理 | ISR.c |
| sciaRxFifoIsr | SCI接收FIFO中断 | 数据接收处理 | ISR.c |
| pwmtimer0isr | PWM定时器0中断 | 核心控制算法执行 | main.c |
程序入口位于main.c文件,主要完成系统初始化和主循环的执行。
void main(void) { // 系统初始化 InitSysCtrl(); // 系统控制初始化 InitGpio(); // GPIO初始化 InitPieCtrl(); // PIE控制器初始化 InitPieVectTable(); // 中断向量表初始化 InitAdc(); // ADC初始化 InitECan(); // CAN初始化 InitSci(); // SCI初始化 InitTimer0(); // 定时器0初始化 InitEPwm(); // PWM初始化 // 软件初始化 InitSoft(); // 软件参数初始化 // 开中断 EnableInterrupts(); // 全局中断使能 // 主循环 while(1) { // 主循环处理 MainLoop(); // 主循环函数 } }主要中断服务程序位于ISR.c文件,包括定时器中断、ADC中断、PWM中断等。
// PWM定时器0中断服务程序 void interrupt pwm_timer0_isr(void) { // 清除中断标志 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // ADC采样 ADCWORK(); // 坐标变换 S3_S2_calc(&Ug); // 三相到两相静止坐标变换 S3_S2_calc(&Ig); // 锁相环计算 pll_reg_calc(&pll); // 计算电网相位 // 计算正弦余弦值 sine = _IQsin(_IQ(pll.theta)); cose = _IQcos(_IQ(pll.theta)); // 静止到旋转坐标变换 S2_R2_calc(&Ur); // 两相静止到两相旋转坐标变换 S2_R2_calc(&Ir); // PID控制计算 pid_reg_calc(&Vdc); // 直流母线电压控制 pid_reg_calc(&Id); // d轴电流控制 pid_reg_calc(&Iq); // q轴电流控制 // 计算参考电压 Ugd = Ugd_calc(Id.Out, Ur.Ds, Iq_redeem); Ugq = Ugq_calc(Iq.Out, Id_redeem); // 旋转到静止坐标变换 R2_S2_calc(&Ugr); // 两相旋转到两相静止坐标变换 // SVPWM计算 svgendq_calc(&svpwm); // 计算SVPWM波形 }数据采集模块位于ADresult.c文件,实现电压电流信号的采样和转换。
void ADCWORK(void) { // 启动ADC采样 AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // 等待采样完成 while(AdcRegs.ADCST.bit.INT_SEQ1 == 0); // 读取采样结果 result.Uga = AdcRegs.ADCRESULT0 >> 4; result.Ugb = AdcRegs.ADCRESULT1 >> 4; result.Ugc = AdcRegs.ADCRESULT2 >> 4; result.Iga = AdcRegs.ADCRESULT3 >> 4; result.Igb = AdcRegs.ADCRESULT4 >> 4; result.Igc = AdcRegs.ADCRESULT5 >> 4; result.Vdc = AdcRegs.ADCRESULT6 >> 4; // 清除中断标志 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; }坐标变换模块位于S3S2.c和S2R2.c文件,实现三相到两相静止坐标变换和静止到旋转坐标变换。
// 三相到两相静止坐标变换 void S3_S2_calc(ABC *p) { p->alfa = _IQmpy(_IQ(0.6666666667), p->a) - _IQmpy(_IQ(0.3333333333), p->b) - _IQmpy(_IQ(0.3333333333), p->c); p->beta = _IQmpy(_IQ(0.5773502692), p->b) - _IQmpy(_IQ(0.5773502692), p->c); } // 两相静止到两相旋转坐标变换 void S2_R2_calc(ALBE *p) { p->Ds = _IQmpy(p->alfa, cose) + _IQmpy(p->beta, sine); p->Qs = -_IQmpy(p->alfa, sine) + _IQmpy(p->beta, cose); }锁相环模块位于pll.c文件,实现电网相位的检测和同步。
// 锁相环计算 void pll_reg_calc(PLLREG *p) { // 计算相位误差 p->Err = _IQmpy(p->Ualfa, sine) - _IQmpy(p->Ubeta, cose); // PID控制 p->Up = _IQmpy(p->Kp, p->Err); p->Ui += _IQmpy(p->Ki, p->Err); p->Out = p->Up + p->Ui; // 相位更新 p->theta += p->Out; // 相位限制 if(p->theta >= _IQ(2 * PI)) p->theta -= _IQ(2 * PI); else if(p->theta < 0) p->theta += _IQ(2 * PI); }PID控制模块位于pid_reg.c文件,实现电压电流的闭环控制。
// PID控制器计算 void pid_reg_calc(PIDREG *p) { // 计算偏差 p->Err = p->Ref - p->Tf; // 比例项 p->Up = _IQmpy(p->Kp, p->Err); // 积分项 p->Ui += _IQmpy(p->Ki, p->Err); // 积分限幅 if(p->Ui > p->UiMax) p->Ui = p->UiMax; else if(p->Ui < p->UiMin) p->Ui = p->UiMin; // 微分项 p->Ud = _IQmpy(p->Kd, p->Err - p->Err1); // 输出计算 p->Out = p->Up + p->Ui + p->Ud; // 输出限幅 if(p->Out > p->OutMax) p->Out = p->OutMax; else if(p->Out < p->OutMin) p->Out = p->OutMin; // 保存偏差 p->Err1 = p->Err; }SVPWM模块位于svgen_dq.c文件,实现空间矢量脉宽调制。
// SVPWM计算 void svgendq_calc(SVGENDQ *p) { // 计算扇区 Uint16 Sector; _iq Va, Vb, Vc; // 计算三相参考电压 Va = p->Ualpha; Vb = _IQmpy(_IQ(-0.5), p->Ualpha) + _IQmpy(_IQ(0.8660254), p->Ubeta); Vc = _IQmpy(_IQ(-0.5), p->Ualpha) - _IQmpy(_IQ(0.8660254), p->Ubeta); // 计算扇区 if(Va > 0) Sector = 1; else Sector = 0; if(Vb > 0) Sector |= 2; if(Vc > 0) Sector |= 4; // 计算占空比 switch(Sector) { case 1: // Sector 1 // 计算占空比 break; case 3: // Sector 2 // 计算占空比 break; // 其他扇区处理 // ... } // 设置PWM寄存器 // ... }公式:
Uα = 2/3 * Ua - 1/3 * Ub - 1/3 * Uc Uβ = 0 * Ua + √3/3 * Ub - √3/3 * Uc实现:
void S3_S2_calc(ABC *p) { p->alfa = _IQmpy(_IQ(0.6666666667), p->a) - _IQmpy(_IQ(0.3333333333), p->b) - _IQmpy(_IQ(0.3333333333), p->c); p->beta = _IQmpy(_IQ(0.5773502692), p->b) - _IQmpy(_IQ(0.5773502692), p->c); }公式:
Ud = Uα * cosθ + Uβ * sinθ Uq = -Uα * sinθ + Uβ * cosθ实现:
void S2_R2_calc(ALBE *p) { p->Ds = _IQmpy(p->alfa, cose) + _IQmpy(p->beta, sine); p->Qs = -_IQmpy(p->alfa, sine) + _IQmpy(p->beta, cose); }void pll_reg_calc(PLLREG *p) { // 计算相位误差 p->Err = _IQmpy(p->Ualfa, sine) - _IQmpy(p->Ubeta, cose); // PID控制 p->Up = _IQmpy(p->Kp, p->Err); p->Ui += _IQmpy(p->Ki, p->Err); p->Out = p->Up + p->Ui; // 相位更新 p->theta += p->Out; // 相位限制 if(p->theta >= _IQ(2 * PI)) p->theta -= _IQ(2 * PI); else if(p->theta < 0) p->theta += _IQ(2 * PI); }公式:
u(k) = Kp * e(k) + Ki * Σe(i) * T + Kd * (e(k) - e(k-1)) / T实现:
void pid_reg_calc(PIDREG *p) { // 计算偏差 p->Err = p->Ref - p->Tf; // 比例项 p->Up = _IQmpy(p->Kp, p->Err); // 积分项 p->Ui += _IQmpy(p->Ki, p->Err); // 积分限幅 if(p->Ui > p->UiMax) p->Ui = p->UiMax; else if(p->Ui < p->UiMin) p->Ui = p->UiMin; // 微分项 p->Ud = _IQmpy(p->Kd, p->Err - p->Err1); // 输出计算 p->Out = p->Up + p->Ui + p->Ud; // 输出限幅 if(p->Out > p->OutMax) p->Out = p->OutMax; else if(p->Out < p->OutMin) p->Out = p->OutMin; // 保存偏差 p->Err1 = p->Err; }void svgendq_calc(SVGENDQ *p) { // 计算扇区 Uint16 Sector; _iq Va, Vb, Vc; // 计算三相参考电压 Va = p->Ualpha; Vb = _IQmpy(_IQ(-0.5), p->Ualpha) + _IQmpy(_IQ(0.8660254), p->Ubeta); Vc = _IQmpy(_IQ(-0.5), p->Ualpha) - _IQmpy(_IQ(0.8660254), p->Ubeta); // 计算扇区 if(Va > 0) Sector = 1; else Sector = 0; if(Vb > 0) Sector |= 2; if(Vc > 0) Sector |= 4; // 计算占空比 switch(Sector) { case 1: // Sector 1 p->Ta = _IQ(0.5) + Va + Vb; p->Tb = _IQ(0.5) + Vb; p->Tc = _IQ(0.5); break; case 3: // Sector 2 p->Ta = _IQ(0.5) + Va; p->Tb = _IQ(0.5) + Va + Vb; p->Tc = _IQ(0.5); break; // 其他扇区处理 // ... } // 设置PWM寄存器 EVA影子寄存器更新 }| 参数名称 | 参数值 | 说明 |
|---|---|---|
| 电网电压 | 380V | 三相线电压 |
| 电网频率 | 50Hz | 电网工作频率 |
| 采样电阻 | 0.01Ω | 电流采样电阻 |
| 采样变比 | 2000:1 | 电压采样变比 |
| 开关频率 | 20kHz | IGBT开关频率 |
| 直流母线电压 | 700V | 直流母线参考电压 |
| 参数名称 | 参数值 | 说明 |
|---|---|---|
| 锁相环Kp | 0.006 | 比例系数 |
| 锁相环Ki | 0.01 | 积分系数 |
| 电压环Kp | 0.1 | 比例系数 |
| 电压环Ki | 0.01 | 积分系数 |
| 电流环Kp | 0.5 | 比例系数 |
| 电流环Ki | 0.1 | 积分系数 |
| 滤波系数 | 0.1 | 数字滤波系数 |
| 死区时间 | 0.000001s | IGBT死区时间 |
| 故障现象 | 可能原因 | 处理方法 |
|---|---|---|
| 系统无法启动 | 电源故障 | 检查电源连接和电压 |
| 无输出电流 | 驱动故障 | 检查IGBT驱动电路 |
| 补偿效果差 | 参数配置错误 | 重新配置系统参数 |
| 过压保护 | 电网电压波动 | 检查电网质量或调整保护参数 |
| 过流保护 | 负载异常 | 检查负载或调整保护参数 |
| 通信故障 | 通信线路故障 | 检查通信线路和接口 |
系统支持以下功能扩展:
| 术语 | 英文全称 | 中文解释 |
|---|---|---|
| SVG | Static Var Generator | 静止无功发生器 |
| APF | Active Power Filter | 有源电力滤波器 |
| DSP | Digital Signal Processor | 数字信号处理器 |
| FPGA | Field Programmable Gate Array | 现场可编程门阵列 |
| IGBT | Insulated Gate Bipolar Transistor | 绝缘栅双极型晶体管 |
| PWM | Pulse Width Modulation | 脉宽调制 |
| SVPWM | Space Vector Pulse Width Modulation | 空间矢量脉宽调制 |
| PID | Proportional Integral Derivative | 比例积分微分 |
| PLL | Phase Locked Loop | 锁相环 |
| THD | Total Harmonic Distortion | 总谐波畸变率 |
| IP | Ingress Protection | 防护等级 |
| 版本号 | 日期 | 变更内容 |
|---|---|---|
| 1.0 | 2010-09-01 | 初始版本 |
| 1.1 | 2010-09-10 | 优化PID参数 |
| 1.2 | 2010-09-15 | 改进MPPT算法 |
| 1.3 | 2010-09-17 | 完善保护功能 |
| 1.4 | 2010-09-18 | 优化滤波参数 |
| 1.4.1 | 2010-09-20 | 按键防抖优化 |
| 1.4.2 | 2010-09-25 | MPPT算法改进 |
| 1.4.3 | 2010-10-01 | 按键检测优化 |
| 1.4.4 | 2010-10-05 | 增加按键使能判断 |
软件说明书编写完成
编写日期:2025-12-15
编写人:[自动生成]