先上硬货!用DSP28335搞移相PWM,这事儿新手千万别慌。咱们直接拿官方例程开刀改代码,手把手看看怎么整出12路带移相的方波信号
dsp程序 dsp28335程序移相程序 程序逻辑清晰注释清楚完整工程文件 有6对方波驱动信号共12路输出开关频率225k 后两对方波移相90度 开发环境为CCS适用的DSP型号为TI公司的TMS320F28335 适合新手学习先说核心思路六个ePWM模块每个模块控制一对互补信号。前四个模块正常输出最后两个玩点花的——移相90度。先看关键配置参数#define PWM_FREQ 225000 //225kHz开关频率 #define DEAD_TIME 100 //死区时间100ns uint16_t tbprd (uint16_t)(150000000 / (2 * PWM_FREQ)); //计算周期值重点来了后两路移相配置//ePWM5配置 EPwm5Regs.TBPRD tbprd; //周期寄存器 EPwm5Regs.TBPHS.half.TBPHS tbprd 2; //移相90度总周期1/4 EPwm5Regs.TBCTL.bit.PHSEN TB_ENABLE; //使能相位加载这里有个骚操作——直接往TBPHS寄存器塞四分之一周期值。因为DSP的相位寄存器单位是时钟周期数90度正好对应总周期的1/4。这种数字移相比模拟电路稳定多了妈妈再也不用担心温漂了dsp程序 dsp28335程序移相程序 程序逻辑清晰注释清楚完整工程文件 有6对方波驱动信号共12路输出开关频率225k 后两对方波移相90度 开发环境为CCS适用的DSP型号为TI公司的TMS320F28335 适合新手学习看下完整的ePWM初始化代码void InitEPwm(void) { //前四个模块标准配置 for(int i1; i4; i){ EPwm_Handle epwm EPWM_init((void *)EPWM_BASE_ADDR[i], sizeof(EPWM_Obj)); EPWM_setTimeBasePeriod(epwm, tbprd); EPWM_setPhaseShift(epwm, 0); //不设移相 EPWM_setDeadBandDelay(epwm, DEAD_TIME); //死区时间 } //后两个模块移相配置 EPwm6Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; //增减计数模式 EPwm6Regs.CMPA.half.CMPA tbprd 1; //占空比50% EPwm6Regs.CMPB tbprd 1; EPwm6Regs.AQCTLA.bit.CAU AQ_SET; //比较匹配时翻转 EPwm6Regs.AQCTLA.bit.CAD AQ_CLEAR; EPwm6Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; //使能死区 }特别提醒死区时间配置不当会导致炸管用官方库里的EPWM_setDeadBandDelay()函数最稳当。实测代码里设置的100ns死区足够多数MOS管使用了。最后上主函数收尾void main(void) { InitSysCtrl(); //系统时钟初始化 InitGpio(); //配置GPIO为ePWM模式 DINT; //关全局中断新手福利不用中断更稳 InitEPwm(); //ePWM配置 for(;;){ asm( NOP); //空循环保平安 } }新手常见坑点GPIO复用功能没配置对记得在CCS的GPIO工具里把对应引脚设为ePWM模式。用示波器抓波形时如果发现没输出先查这个完整工程文件已打包包含所有驱动库和.ccxml下载配置解压即用~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437145.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!