news 2026/6/23 18:00:23

基于TMS320F28335芯片的BUCK双闭环PI DSP代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于TMS320F28335芯片的BUCK双闭环PI DSP代码

基于TMS320F28335芯片的BUCK双闭环(PI)DSP代码

搞电力电子的老司机们对BUCK电路都不陌生,但要把双闭环PI控制塞进DSP里跑起来,这事儿还真得跟TMS320F28335的寄存器大战三百回合。今天咱们就扒开这个芯片的"内脏",看看怎么用代码实现电压电流双闭环的精准控制。

先说核心架构,电压环做外环稳输出,电流环当内环抗扰动。DSP这边得同时处理ADC采样、PI运算和PWM生成三件套。先甩个中断服务程序的骨架:

interrupt void EPWM1_ISR(void) { //ADC启动 AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //读取当前输出电压 Vout = (AdcResult.ADCRESULT0>>4)*3.0/4096.0; //电压外环PI计算 I_ref = Voltage_PI_Calc(Vref, Vout); //电流内环PI计算 Duty = Current_PI_Calc(I_ref, I_actual); //更新PWM占空比 EPwm1Regs.CMPA.half.CMPA = (Uint16)(Duty * PERIOD); //清除中断标志 EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }

注意那个>>4操作可不是随便写的——F28335的ADC结果寄存器右对齐,有效数据在bit15到bit4,这移位操作比直接除以16更高效。

说到PI算法,别整那些花里胡哨的,工业现场最吃香的还是位置式PI。但得防着积分饱和,这里给个带抗饱和的版本:

float PI_Calc(PI_Struct *pi, float ref, float fb) { float err = ref - fb; pi->integral += err * pi->Ki; //抗饱和处理 if(pi->integral > pi->max) pi->integral = pi->max; else if(pi->integral < pi->min) pi->integral = pi->min; float output = err * pi->Kp + pi->integral; return output > pi->max ? pi->max : (output < pi->min ? pi->min : output); }

重点在结构体里的max/min参数,调试时通过CCS修改变量值实时调整限幅,比重新烧录程序高效多了。实测时可以先让Ki=0纯比例调试,等波形稳定了再慢慢加积分。

PWM配置是门技术活,EPWM模块的时钟分频得算准了。比如系统时钟150MHz,想要100kHz开关频率:

EPwm1Regs.TBPRD = 150000000 / 2 / 100000; //分频系数2 EPwm1Regs.TBPHS.half.TBPHS = 0; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //上下计数模式 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

这里有个坑——死区时间配置寄存器DBRED和DBFED的单位是系统时钟周期,别直接用纳秒数换算。建议封装个函数自动转换:

void ConfigDeadBand(float deadtime_ns) { Uint16 db_val = (deadtime_ns * SYSCLK_MHZ) / 1000; EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm1Regs.DBRED = db_val; EPwm1Regs.DBFED = db_val; }

调试时最实用的技巧:把关键变量映射到GPIO,用示波器同时抓PWM波形和IO口电平,比看CCS的Graph工具直观得多。比如把电流环输出值映射到DAC模块,或者直接用IO口做标记:

GpioDataRegs.GPASET.bit.GPIO0 = 1; //进入中断时拉高 //...中断处理... GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; //退出中断时拉低

最后说个血泪教训:ADC采样窗口时间至少保持到采样保持时间的2倍,否则采回来的电压值会漂。具体配置看这里:

AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF; //采样窗15个周期 AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; //主时钟分频 AdcRegs.ADCTRL3.bit.SMODE_SEL = 1; //同步采样模式

调参是个玄学,但记住黄金法则:先调电流环再调电压环,内环响应速度要比外环快5-10倍。实在搞不定的时候,把PWM占空比直接映射到键盘加减键,用串口命令手动调整,比死磕MATLAB仿真更直接。

代码写到最后,别忘了在EPWM中断里加个看门狗喂狗操作,毕竟实际工况中电网波动能把程序跑飞。完整工程建议用CLA协处理器处理电流环,主CPU处理电压环,这样响应速度能压到5us以内。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 8:23:09

【设计模式|第四篇】适配器模式:让不兼容的接口协同工作

适配器模式详解基本概念现实生活中的例子 核心角色优缺点分析优点缺点 实现方式及选择类适配器对象适配器如何选择 实际应用案例设计建议与其他模式的关系 适配器模式详解 基本概念 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核…

作者头像 李华
网站建设 2026/6/19 5:06:53

asgiref终极指南:高效解决Python异步通信难题

asgiref终极指南&#xff1a;高效解决Python异步通信难题 【免费下载链接】asgiref ASGI specification and utilities 项目地址: https://gitcode.com/gh_mirrors/as/asgiref 在当今高并发的Web应用开发中&#xff0c;你是否经常面临同步代码阻塞异步流程、线程安全问题…

作者头像 李华
网站建设 2026/6/22 17:29:55

医学影像深度学习知识点总结

T1像和T2像的区别 T1像便于显示解剖结构,T2像便于显示病灶部位.FLAIR像便于显示结合水变化情况,人体内有自由水和结合水的分布,结合水的变化情况往往反映了局部组织出现梗塞情况,这种情况下采用FLAIR成像可以将这样的变化显示出来. FLAIR像(液体反转恢复),约等于T2成像 TR,TE,F…

作者头像 李华
网站建设 2026/6/21 15:28:55

从零到一:自动化3D建模的免代码解决方案

从零到一&#xff1a;自动化3D建模的免代码解决方案 【免费下载链接】nerfstudio A collaboration friendly studio for NeRFs 项目地址: https://gitcode.com/GitHub_Trending/ne/nerfstudio 还在为复杂的3D建模软件感到头疼吗&#xff1f;想象一下&#xff0c;你只需要…

作者头像 李华
网站建设 2026/6/22 14:41:45

Kali中生成被控端

操作步骤&#xff1a;生成的被控端提交到www.virustotal.com检测

作者头像 李华
网站建设 2026/6/22 3:57:43

13、Linux 文本编辑与命令操作实用指南

Linux 文本编辑与命令操作实用指南 1. XEmacs:强大的编辑器 XEmacs 是 GNU 超级编辑器 Emacs 的变体,包含在 Caldera OpenLinux 中。在图形环境(如 X (KDE))下使用时,XEmacs 有额外的增强功能,这也是它名字中 “X” 的由来。而在终端中,它与普通的 Emacs 几乎完全相同…

作者头像 李华