svg的dsp程序 FPGA程序 和主板原理图和pcb,其他辅助板的pcb,辅助板没有原理图
一、代码工程概述与核心定位
本次解析的代码工程来自SVG(静止无功发生器)的DSP控制模块,基于TI TMS320F28335芯片开发,核心功能是实现SVG设备的实时控制——包括电网电压/电流采集、无功电流计算、PWM波形生成、故障保护等关键环节。工程包含119个文件,其中SVG_DSP0109/INCLUDE目录下的24个头文件是核心,定义了芯片寄存器映射、数据类型、函数原型及硬件操作接口,是上层控制算法与底层硬件之间的“桥梁”。
与普通嵌入式代码不同,该工程严格遵循TI C28x系列芯片的编程规范,采用“寄存器结构体+位操作联合体”的硬件抽象设计,同时融入SVG领域的实时控制需求(如高频率PWM输出、同步ADC采集),代码的可读性、可维护性与实时性达到工业级标准。本文将从代码文本本身出发,逐模块解析头文件的实现细节、功能逻辑及在SVG系统中的作用。
二、基础层代码解析:数据类型与FPU加速(C28x_FPU_FastRTS.h)
2.1 代码文本与数据类型定义
该文件是工程的“数据类型基石”,首先通过条件编译避免重复定义,然后定义适配C28x FPU(浮点运算单元)的标准数据类型:
#ifndef C28X_FPU_FAST_RTS_H #define C28X_FPU_FAST_RTS_H #ifdef __cplusplus extern "C" { // 兼容C++编译,确保C链接方式 #endif #ifndef DSP28_DATA_TYPES #define DSP28_DATA_TYPES typedef int int16; // 16位有符号整数,用于普通计数/状态标识 typedef long int32; // 32位有符号整数,用于高精度计数(如定时器) typedef long long int64; // 64位有符号整数,用于大数值运算(如电能累计) typedef unsigned int Uint16; // 16位无符号整数,用于寄存器操作/位掩码 typedef unsigned long Uint32; // 32位无符号整数,用于地址/大寄存器操作 typedef unsigned long long Uint64; // 64位无符号整数,用于超大数值存储 typedef float float32; // 32位浮点数,FPU核心运算类型(SVG控制算法主力) typedef long double float64; // 64位浮点数,用于高精度计算(如PI调节积分项) #endif代码功能解读:
extern "C"是跨语言编译的关键,确保C++文件调用该头文件中的函数时,遵循C语言的函数命名规则(避免名称修饰),这在SVG工程中常用于与上位机C++软件的接口兼容。- 数据类型命名采用“类型+位数”的格式(如
int16),清晰标识数据长度,避免不同编译器下的类型长度歧义——例如int在16位处理器中是16位,在32位处理器中是32位,而int16强制指定16位,确保SVG控制算法中数据计算的一致性(如电流采样值的位宽匹配)。
2.2 FPU快速运算函数原型
文件末尾定义了两个核心数学函数,专门针对C28x FPU优化:
float32 isqrt(float32 X); // 快速平方根运算 void sincos(float32 radian, float32* PtrSin, float32* PtrCos); // 同步正余弦计算代码功能与SVG应用场景:
isqrt:相比标准库sqrt函数,运算速度提升约40%,在SVG中用于实时计算电压/电流幅值(如I = sqrt(Ia² + Ib² + Ic²)),确保每周期(通常200μs以内)内完成幅值计算。sincos:同步计算正弦和余弦值,避免重复调用sin和cos函数导致的冗余运算,核心用于ABC-DQ坐标变换(SVG控制的核心算法)——例如将三相电流Ia/Ib/Ic转换为同步旋转坐标系下的Id/Iq时,需要大量正余弦值,该函数可将运算时间缩短50%。
三、PWM模块代码解析:从寄存器定义到功能封装
PWM模块是SVG的“执行核心”,负责生成驱动IGBT的PWM波形,工程中通过DSP28335PWM.h(功能封装)、DSP2833xEPwm.h(寄存器定义)、DSP2833xEPwmdefines.h(配置宏)三层结构实现。
3.1 DSP28335_PWM.h:功能接口封装
该文件是PWM模块的“用户接口”,隐藏底层寄存器操作,提供简洁的控制函数:
#ifndef _DSP28335_PWM_H_ #define _DSP28335_PWM_H_ #include "DSP2833x_EPwm_defines.h" // 引入PWM配置宏 #define CON_PWM_PERIOD 0x927 // PWM周期值(十进制2343) void InitePWM(void); // PWM初始化 void EPwm_Start(void); // 启动PWM输出 void EPwm_Stop(void); // 停止PWM输出 void EPwm_Sync(void); // 多PWM通道同步 #endif代码细节解读:
CONPWMPERIOD = 0x927:C28335的PWM时基时钟通常为系统时钟(150MHz)分频后的频率,假设分频系数为128,则PWM时钟为150MHz/128≈1.171875MHz,周期为0.853μs;0x927(2343)个时钟周期对应PWM周期约2343×0.853μs≈2ms,即开关频率500Hz——这是中低压SVG的典型开关频率,兼顾开关损耗与控制精度。- 函数命名采用“模块+功能”格式(如
EPwmStart),清晰标识操作对象与功能,便于上层代码调用(如SVG系统启动时调用InitePWM(),故障时调用EPwmStop())。
3.2 DSP2833x_EPwm.h:寄存器结构定义
该文件是PWM模块的“硬件抽象核心”,通过结构体和联合体完整映射C28335的PWM寄存器,支持位操作与整体操作:
// 时基控制寄存器(TBCTL)位定义 struct TBCTL_BITS { Uint16 CTRMODE:2; // 0-1位:计数器模式(0=增计数,1=减计数,2=增减计数) Uint16 PHSEN:1; // 2位:相位加载使能(1=使能,0=禁止) Uint16 PRDLD:1; // 3位:周期加载模式(0=影子加载,1=立即加载) Uint16 SYNCOSEL:2; // 4-5位:同步输出选择 Uint16 SWFSYNC:1; // 6位:软件强制同步 Uint16 HSPCLKDIV:3; // 7-9位:高-speed时钟分频 Uint16 CLKDIV:3; // 10-12位:时基时钟分频 Uint16 PHSDIR:1; // 13位:相位方向 Uint16 FREE_SOFT:2; // 14-15位:仿真模式(0=停止,1=继续运行) }; union TBCTL_REG { Uint16 all; // 整体操作(如赋值整个寄存器) struct TBCTL_BITS bit; // 位操作(如修改计数器模式) }; // PWM寄存器文件结构体 struct EPWM_REGS { union TBCTL_REG TBCTL; // 时基控制 union TBSTS_REG TBSTS; // 时基状态 union TBPHS_HRPWM_GROUP TBPHS; // 相位偏移 Uint16 TBCTR; // 计数器值 Uint16 TBPRD; // 周期寄存器 // ... 省略其他寄存器(比较控制、动作限定、死区控制等) }; // 声明PWM寄存器实例(6个通道,对应SVG三相桥臂的上下桥臂) extern volatile struct EPWM_REGS EPwm1Regs; extern volatile struct EPWM_REGS EPwm2Regs; extern volatile struct EPWM_REGS EPwm3Regs; extern volatile struct EPWM_REGS EPwm4Regs; extern volatile struct EPWM_REGS EPwm5Regs; extern volatile struct EPWM_REGS EPwm6Regs;代码功能与SVG硬件对应:
CTRMODE:2:SVG的PWM通常采用“增减计数模式”(CTRMODE=2),生成对称的PWM波形,避免单边调制导致的谐波增大;而“增计数模式”(CTRMODE=0)仅用于特殊场景(如测试)。FREE_SOFT:2:仿真时若设置为FREE=1,即使暂停调试,PWM仍继续输出,避免SVG因调试暂停导致的电网波动——这是工业级代码的关键细节,普通消费级代码通常忽略该配置。EPwm1Regs~EPwm6Regs:对应SVG三相全桥的6个IGBT(A相上/下、B相上/下、C相上/下),每个寄存器实例控制一个IGBT的PWM输出,确保三相独立控制。
3.3 DSP2833x_EPwm_defines.h:配置宏定义
该文件是PWM模块的“配置字典”,将寄存器位值定义为宏,避免硬编码,提升代码可读性:
// 计数器模式宏 #define TB_COUNT_UP 0x0 // 增计数 #define TB_COUNT_DOWN 0x1 // 减计数 #define TB_COUNT_UPDOWN 0x2 // 增减计数 #define TB_FREEZE 0x3 // 冻结 // 动作限定宏(计数器达到特定值时的输出动作) #define AQ_NO_ACTION 0x0 // 无动作 #define AQ_CLEAR 0x1 // 输出清0 #define AQ_SET 0x2 // 输出置1 #define AQ_TOGGLE 0x3 // 输出翻转 // 死区模式宏 #define DB_DISABLE 0x0 // 禁用死区 #define DBA_ENABLE 0x1 // 仅A通道使能死区 #define DBB_ENABLE 0x2 // 仅B通道使能死区 #define DB_FULL_ENABLE 0x3 // 全通道使能死区代码应用示例:
svg的dsp程序 FPGA程序 和主板原理图和pcb,其他辅助板的pcb,辅助板没有原理图
在InitePWM()函数中,会使用这些宏配置PWM:
// 配置EPwm1为增减计数模式 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 配置计数器达到周期值时,PWM输出清0 EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR; // 使能死区,避免上下桥臂直通 EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;这种“宏定义+位操作”的方式,不仅使代码更易读,还便于后续修改(如更换开关频率时,只需修改TBCOUNTUPDOWN对应的宏值,无需查找寄存器手册)。
四、ADC模块代码解析:数据采集的硬件抽象
ADC模块是SVG的“感知核心”,负责采集电网电压、负载电流、直流母线电压等模拟信号,工程中通过DSP2833x_Adc.h实现完整的ADC寄存器映射与操作接口。
4.1 ADC控制寄存器定义
// ADC控制寄存器1(ADCTRL1)位定义 struct ADCTRL1_BITS { Uint16 rsvd1:4; // 0-3位:保留 Uint16 SEQ_CASC:1; // 4位:序列器级联模式(1=级联,0=独立) Uint16 SEQ_OVRD:1; // 5位:序列器覆盖(1=覆盖,0=正常) Uint16 CONT_RUN:1; // 6位:连续运行(1=连续,0=单次) Uint16 CPS:1; // 7位:ADC核心时钟分频(1=分频,0=不分频) Uint16 ACQ_PS:4; // 8-11位:采样窗口大小(1-16个ADC时钟) Uint16 SUSMOD:2; // 12-13位:仿真挂起模式 Uint16 RESET:1; // 14位:ADC复位(1=复位) Uint16 rsvd2:1; // 15位:保留 }; union ADCTRL1_REG { Uint16 all; struct ADCTRL1_BITS bit; }; // ADC结果寄存器(16个通道,对应16个采集通道) struct ADC_REGS { union ADCTRL1_REG ADCTRL1; // 控制寄存器1 union ADCTRL2_REG ADCTRL2; // 控制寄存器2 union ADCMAXCONV_REG ADCMAXCONV; // 最大转换数 // ... 省略通道选择、状态寄存器等 Uint16 ADCRESULT0; // 通道0结果 Uint16 ADCRESULT1; // 通道1结果 // ... 省略ADCRESULT2~ADCRESULT15 }; // 声明ADC寄存器实例 extern volatile struct ADC_REGS AdcRegs;代码细节与SVG采集需求匹配:
SEQCASC:1:SVG通常需要采集6个以上通道(如Ia/Ib/Ic三相电流、Ua/Ub/Uc三相电压、直流母线电压),因此配置SEQCASC=1(序列器级联模式),将SEQ1和SEQ2合并为16通道序列器,满足多通道采集需求。ACQPS:4:采样窗口大小决定采集精度,SVG中电网电压/电流信号频率为50Hz,ADC时钟通常为25MHz,ACQPS=0x0F(16个时钟周期)对应采样窗口为0.64μs,既能保证采样精度,又不会导致采集周期过长。ADCRESULT0~ADCRESULT15:每个结果寄存器为12位(C28335 ADC为12位精度),存储范围0~4095,对应输入电压0~3.3V(假设参考电压为3.3V)——SVG中通过电流传感器(如霍尔传感器)将大电流转换为0~3.3V的小电压,再通过ADC采集,最终通过公式I = (ADCRESULT - 2048) * 增益计算实际电流(2048为零点偏移)。
4.2 ADC中断与同步配置
// ADC状态寄存器(ADCST)位定义 struct ADCST_BITS { Uint16 INT_SEQ1:1; // 0位:SEQ1中断标志 Uint16 INT_SEQ2:1; // 1位:SEQ2中断标志 Uint16 SEQ1_BSY:1; // 2位:SEQ1忙状态 Uint16 SEQ2_BSY:1; // 3位:SEQ2忙状态 Uint16 INT_SEQ1_CLR:1; // 4位:SEQ1中断清除 Uint16 INT_SEQ2_CLR:1; // 5位:SEQ2中断清除 // ... 省略其他位 };代码功能与SVG实时性匹配:
INTSEQ1:1:当SEQ1采集完成后,该位置1,触发ADC中断(SEQ1INTISR)——SVG中通常将ADC采集与PWM周期同步(如PWM周期中断触发ADC采集),采集完成后通过中断快速处理数据,确保每PWM周期内完成一次数据采集与控制计算,实现闭环控制。SEQ1_BSY:1:用于判断ADC是否正在采集,避免CPU在采集过程中读取结果导致数据错误——这是工业级代码的容错设计,普通代码通常忽略该状态位。
五、DMA模块代码解析:数据传输的“高速公路”
DMA模块是SVG的“数据搬运核心”,负责将ADC采集的结果直接传输到RAM缓冲区,无需CPU干预,提升系统实时性,工程中通过DSP2833xDMA.h和DSP2833xDma_defines.h实现。
5.1 DMA通道寄存器定义
// DMA通道模式寄存器(MODE)位定义 struct MODE_BITS { Uint16 PERINTSEL:5; // 0-4位:外设中断选择(触发DMA的源) Uint16 rsvd1:2; // 5-6位:保留 Uint16 OVRINTE:1; // 7位:溢出中断使能 Uint16 PERINTE:1; // 8位:外设中断使能 Uint16 CHINTMODE:1; // 9位:通道中断模式(0=传输开始触发,1=传输结束触发) Uint16 ONESHOT:1; // 10位:单触发模式(0=单次,1=连续) Uint16 CONTINUOUS:1; // 11位:连续模式(0=停止,1=循环) Uint16 SYNCE:1; // 12位:同步使能 Uint16 SYNCSEL:1; // 13位:同步选择(0=源端,1=目的端) Uint16 DATASIZE:1; // 14位:数据大小(0=16位,1=32位) Uint16 CHINTE:1; // 15位:通道中断使能 }; union MODE_REG { Uint16 all; struct MODE_BITS bit; }; // DMA通道寄存器结构体 struct CH_REGS { union MODE_REG MODE; // 模式寄存器 union CONTROL_REG CONTROL; // 控制寄存器 union BURST_SIZE_REG BURST_SIZE; // Burst大小 // ... 省略地址配置、步长配置等寄存器 Uint32 SRC_BEG_ADDR_SHADOW; // 源地址影子寄存器 Uint32 DST_BEG_ADDR_SHADOW; // 目的地址影子寄存器 }; // DMA寄存器文件 struct DMA_REGS { union DMACTRL_REG DMACTRL; // DMA控制 // ... 省略其他控制寄存器 struct CH_REGS CH1; // 通道1 struct CH_REGS CH2; // 通道2 // ... 省略CH3~CH6 }; // 声明DMA寄存器实例 extern volatile struct DMA_REGS DmaRegs;代码功能与SVG数据传输需求匹配:
PERINTSEL:5:SVG中DMA通常由ADC采集完成触发,因此配置PERINTSEL=DMA_SEQ1INT(对应值1),即SEQ1采集完成后触发DMA传输——这实现了“ADC采集→DMA传输→CPU处理”的流水线操作,CPU无需等待ADC采集,可并行执行其他算法。CONTINUOUS:1:配置CONTINUOUS=1(连续模式),当DMA传输完成后自动重新初始化地址和计数器,实现循环传输——SVG需要连续采集电网数据,该配置确保DMA持续搬运ADC结果,无需CPU重复初始化。DATASIZE:1:ADC结果为16位(ADCRESULT为Uint16),因此配置DATASIZE=0(16位数据),避免数据位宽不匹配导致的错误。
5.2 DMA功能函数原型(DSP2833x_GlobalPrototypes.h)
// 初始化DMA void DMAInitialize(void); // 配置DMA通道1地址(源:ADC结果寄存器,目的:RAM缓冲区) void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); // 配置DMA通道1 Burst参数(Burst大小、源/目的步长) void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); // 启动DMA通道1 void StartDMACH1(void);代码应用示例:
在SVG初始化中,配置DMA通道1搬运ADC结果:
// 定义ADC数据缓冲区(16个通道,每个通道10个数据,用于滤波) Uint16 AdcBuf[16][10]; // 初始化DMA DMAInitialize(); // 配置地址:源=AdcRegs.ADCRESULT0,目的=AdcBuf[0][0] DMACH1AddrConfig(&AdcBuf[0][0], &AdcRegs.ADCRESULT0); // 配置Burst:大小=16(16个通道),步长=1(连续地址) DMACH1BurstConfig(16, 1, 1); // 启动DMA StartDMACH1();这种配置实现了ADC采集完成后,DMA自动将16个通道的结果传输到AdcBuf缓冲区,CPU在PWM周期中断中直接读取AdcBuf进行滤波和计算,大幅提升系统实时性。
六、中断模块代码解析:系统实时响应的“神经中枢”
中断模块是SVG的“神经中枢”,负责处理各类实时事件(PWM周期、ADC采集、故障输入),工程中通过DSP2833xPieCtrl.h(PIE控制器)、DSP2833xPieVect.h(中断向量表)、DSP2833x_DefaultIsr.h(中断服务函数)实现。
6.1 PIE控制器寄存器定义(DSP2833x_PieCtrl.h)
C28335的中断控制器采用“PIE(可编程中断控制器)+ CPU中断”的两级结构,PIE将96个外设中断分为12组,每组8个中断,再映射到CPU的12个中断线:
// PIE控制寄存器(PIECTRL)位定义 struct PIECTRL_BITS { Uint16 ENPIE:1; // 0位:PIE使能(1=使能) Uint16 PIEVECT:15; // 1-15位:中断向量地址 }; union PIECTRL_REG { Uint16 all; struct PIECTRL_BITS bit; }; // PIE中断使能寄存器(PIEIER)位定义(每组8个中断) struct PIEIER_BITS { Uint16 INTx1:1; // 0位:组内中断1 Uint16 INTx2:1; // 1位:组内中断2 // ... 省略INTx3~INTx8 Uint16 rsvd:8; // 8-15位:保留 }; union PIEIER_REG { Uint16 all; struct PIEIER_BITS bit; }; // PIE寄存器文件 struct PIE_CTRL_REGS { union PIECTRL_REG PIECTRL; // PIE控制 union PIEACK_REG PIEACK; // PIE确认 union PIEIER_REG PIEIER1; // 组1中断使能 union PIEIFR_REG PIEIFR1; // 组1中断标志 // ... 省略PIEIER2~PIEIER12、PIEIFR2~PIEIFR12 }; // 声明PIE寄存器实例 extern volatile struct PIE_CTRL_REGS PieCtrlRegs;代码功能与SVG中断优先级设计:
ENPIE:1:系统初始化时必须设置ENPIE=1,否则PIE中断无法触发——这是容易忽略的关键步骤,普通代码可能因未使能PIE导致中断失效。PIEACK:中断处理完成后需清除PIEACK对应位,否则后续同组中断无法触发——例如SVG的PWM周期中断(组3)处理完成后,需执行PieCtrlRegs.PIEACK.bit.ACK3=1,清除组3的确认标志。
6.2 中断向量表(DSP2833x_PieVect.h)
该文件定义了PIE中断向量表的结构,映射中断源与中断服务函数(ISR):
// 定义中断函数指针类型 typedef interrupt void(*PINT)(void); // PIE中断向量表结构体 struct PIE_VECT_TABLE { // ... 省略保留向量 // 组1中断(ADC、定时器0等) PINT SEQ1INT; // ADC SEQ1中断 PINT SEQ2INT; // ADC SEQ2中断 PINT XINT1; // 外部中断1(故障输入) // ... 省略其他组中断 // 组3中断(PWM周期中断) PINT EPWM1_INT; // EPWM1周期中断 PINT EPWM2_INT; // EPWM2周期中断 // ... 省略其他PWM中断 }; // 声明中断向量表实例 extern struct PIE_VECT_TABLE PieVectTable;代码应用与SVG中断映射:
在系统初始化中,将自定义的ISR函数映射到向量表:
// 自定义PWM1周期中断服务函数 interrupt void EPWM1_INT_ISR(void) { // 1. 读取DMA传输的ADC数据 // 2. 执行坐标变换、PI调节等控制算法 // 3. 更新PWM比较值 // 4. 清除中断标志 EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.bit.ACK3 = 1; } // 中断向量表初始化 void InitPieVectTable(void) { // ... 其他向量映射 PieVectTable.EPWM1_INT = EPWM1_INT_ISR; // 将自定义ISR映射到EPWM1_INT向量 }这种“向量表+ISR映射”的方式,使中断管理更清晰,便于后续维护(如更换ISR函数时,只需修改映射关系,无需修改硬件配置)。
6.3 中断服务函数原型(DSP2833x_DefaultIsr.h)
该文件声明了所有默认中断服务函数,涵盖SVG所需的核心中断:
// 组1中断(ADC相关) interrupt void SEQ1INT_ISR(void); // ADC Sequencer 1 ISR interrupt void SEQ2INT_ISR(void); // ADC Sequencer 2 ISR interrupt void TINT0_ISR(void); // Timer 0 ISR(系统定时任务) // 组2中断(PWM故障相关) interrupt void EPWM1_TZINT_ISR(void); // EPWM1故障中断(如过流) interrupt void EPWM2_TZINT_ISR(void); // EPWM2故障中断 // 组3中断(PWM周期相关) interrupt void EPWM1_INT_ISR(void); // EPWM1周期中断 interrupt void EPWM2_INT_ISR(void); // EPWM2周期中断 // 外部中断(故障输入) interrupt void XINT1_ISR(void); // External interrupt 1(过流故障) interrupt void XINT2_ISR(void); // External interrupt 2(过压故障)代码功能与SVG故障保护:
EPWM1TZINTISR:PWM故障中断,当SVG检测到过流、过压等故障时,触发该中断,执行EPwm_Stop()停止PWM输出,保护IGBT——这是SVG的核心保护机制,中断响应时间需控制在1μs以内,C28335的中断响应时间通常为几十ns,满足要求。XINT1_ISR:外部中断,通常连接硬件故障输入(如电流传感器过流信号),触发后立即执行保护逻辑——相比软件故障检测,外部中断响应更快,是工业级设备的必备设计。
七、代码工程的整体协同与SVG控制逻辑映射
7.1 模块协同关系
graph TD A[系统初始化] --> A1[InitSysCtrl:时钟配置] A --> A2[InitGpio:GPIO配置] A --> A3[InitePWM:PWM初始化] A --> A4[InitAdc:ADC初始化] A --> A5[DMAInitialize:DMA初始化] A --> A6[InitPieCtrl+InitPieVectTable:中断初始化] A6 --> B[EnableInterrupts:使能中断] B --> C[EPwm_Start:启动PWM] C --> D[PWM周期中断触发] D --> E[读取DMA传输的ADC数据] E --> F[执行控制算法(坐标变换、PI调节)] F --> G[更新PWM比较值] G --> H[故障检测] H -->|无故障| D H -->|有故障| I[EPwm_Stop:停止PWM]7.2 代码与SVG硬件的映射关系
| 代码模块 | 对应SVG硬件 | 核心功能 |
|---|---|---|
EPwm1Regs~EPwm6Regs | 三相全桥IGBT | 生成PWM波形,控制IGBT开关 |
AdcRegs.ADCRESULT0~15 | 电流/电压传感器 | 采集电网电流、电压信号 |
DmaRegs.CH1 | ADC与RAM | 搬运ADC数据,避免CPU干预 |
PieCtrlRegs | 中断控制器 | 处理PWM周期、故障等中断 |
XINT1_ISR | 故障输入引脚 | 快速响应过流、过压故障 |
八、代码工程的工业级特性总结
- 硬件抽象清晰:采用“结构体+联合体”映射寄存器,支持位操作与整体操作,既便于底层硬件控制,又提升代码可读性——例如
EPwm1Regs.TBCTL.bit.CTRMODE = TBCOUNTUPDOWN,直接修改PWM计数器模式,无需记忆寄存器位地址。 - 实时性优化:通过FPU加速、DMA传输、中断优先级管理,确保SVG控制周期(通常200μs以内)内完成数据采集、算法计算、PWM更新——例如DMA搬运ADC数据减少CPU等待时间,FPU加速坐标变换运算。
- 可靠性设计:包含故障中断、PWM死区控制、寄存器保护(
EALLOW/EDIS)等工业级特性,避免硬件损坏——例如EPWM1TZINTISR快速响应故障,DBCTL配置死区避免IGBT直通。 - 可维护性强:模块化封装、宏定义配置、清晰的函数命名,便于后续升级与移植——例如更换SVG功率等级时,只需修改
CONPWMPERIOD和ADC增益参数,无需修改核心逻辑。
该代码工程不仅是SVG控制的“软件载体”,更是TI C28335芯片在电力电子领域应用的典型范例,其设计思想可复用于其他工业控制场景(如变频器、逆变器)。