SVG的DSP程序、FPGA程序及主板原理图与PCB设计,辅以其他辅助板的PCB无原理图

张开发
2026/4/19 5:51:18 15 分钟阅读

分享文章

SVG的DSP程序、FPGA程序及主板原理图与PCB设计,辅以其他辅助板的PCB无原理图
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.h2.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 0x927C28335的PWM时基时钟通常为系统时钟150MHz分频后的频率假设分频系数为128则PWM时钟为150MHz/128≈1.171875MHz周期为0.853μs0x9272343个时钟周期对应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:2SVG的PWM通常采用“增减计数模式”CTRMODE2生成对称的PWM波形避免单边调制导致的谐波增大而“增计数模式”CTRMODE0仅用于特殊场景如测试。FREE_SOFT:2仿真时若设置为FREE1即使暂停调试PWM仍继续输出避免SVG因调试暂停导致的电网波动——这是工业级代码的关键细节普通消费级代码通常忽略该配置。EPwm1Regs~EPwm6Regs对应SVG三相全桥的6个IGBTA相上/下、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控制寄存器1ADCTRL1位定义 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:1SVG通常需要采集6个以上通道如Ia/Ib/Ic三相电流、Ua/Ub/Uc三相电压、直流母线电压因此配置SEQCASC1序列器级联模式将SEQ1和SEQ2合并为16通道序列器满足多通道采集需求。ACQPS:4采样窗口大小决定采集精度SVG中电网电压/电流信号频率为50HzADC时钟通常为25MHzACQPS0x0F16个时钟周期对应采样窗口为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位数据大小016位132位 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:5SVG中DMA通常由ADC采集完成触发因此配置PERINTSELDMA_SEQ1INT对应值1即SEQ1采集完成后触发DMA传输——这实现了“ADC采集→DMA传输→CPU处理”的流水线操作CPU无需等待ADC采集可并行执行其他算法。CONTINUOUS:1配置CONTINUOUS1连续模式当DMA传输完成后自动重新初始化地址和计数器实现循环传输——SVG需要连续采集电网数据该配置确保DMA持续搬运ADC结果无需CPU重复初始化。DATASIZE:1ADC结果为16位ADCRESULT为Uint16因此配置DATASIZE016位数据避免数据位宽不匹配导致的错误。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大小1616个通道步长1连续地址 DMACH1BurstConfig(16, 1, 1); // 启动DMA StartDMACH1();这种配置实现了ADC采集完成后DMA自动将16个通道的结果传输到AdcBuf缓冲区CPU在PWM周期中断中直接读取AdcBuf进行滤波和计算大幅提升系统实时性。六、中断模块代码解析系统实时响应的“神经中枢”中断模块是SVG的“神经中枢”负责处理各类实时事件PWM周期、ADC采集、故障输入工程中通过DSP2833xPieCtrl.hPIE控制器、DSP2833xPieVect.h中断向量表、DSP2833x_DefaultIsr.h中断服务函数实现。6.1 PIE控制器寄存器定义DSP2833x_PieCtrl.hC28335的中断控制器采用“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系统初始化时必须设置ENPIE1否则PIE中断无法触发——这是容易忽略的关键步骤普通代码可能因未使能PIE导致中断失效。PIEACK中断处理完成后需清除PIEACK对应位否则后续同组中断无法触发——例如SVG的PWM周期中断组3处理完成后需执行PieCtrlRegs.PIEACK.bit.ACK31清除组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故障保护EPWM1TZINTISRPWM故障中断当SVG检测到过流、过压等故障时触发该中断执行EPwm_Stop()停止PWM输出保护IGBT——这是SVG的核心保护机制中断响应时间需控制在1μs以内C28335的中断响应时间通常为几十ns满足要求。XINT1_ISR外部中断通常连接硬件故障输入如电流传感器过流信号触发后立即执行保护逻辑——相比软件故障检测外部中断响应更快是工业级设备的必备设计。七、代码工程的整体协同与SVG控制逻辑映射7.1 模块协同关系graph TD A[系统初始化] -- A1[InitSysCtrl时钟配置] A -- A2[InitGpioGPIO配置] A -- A3[InitePWMPWM初始化] A -- A4[InitAdcADC初始化] A -- A5[DMAInitializeDMA初始化] A -- A6[InitPieCtrlInitPieVectTable中断初始化] 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.CH1ADC与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芯片在电力电子领域应用的典型范例其设计思想可复用于其他工业控制场景如变频器、逆变器。

更多文章