DSP28335 ePWM模块实战:从基础波形到高级功能配置
1. DSP28335 ePWM模块基础配置实战第一次接触DSP28335的ePWM模块时我被它强大的功能震撼到了。这个模块不仅能生成基本的PWM波形还能实现死区控制、斩波调制等高级功能特别适合电机驱动和数字电源开发。下面我就从最基础的PWM波形生成开始带大家一步步掌握这个模块的使用技巧。要配置ePWM模块首先需要了解它的基本结构。每个ePWM模块包含7个子模块时基模块(TB)、计数比较模块(CC)、动作模块(AQ)、死区模块(DB)、斩波模块(PC)、错误联防模块(TZ)和事件触发模块(ET)。这些模块协同工作才能输出我们想要的PWM波形。先来看一个最简单的配置示例// 初始化GPIO EALLOW; SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK 1; InitEPwm6Gpio(); // 假设我们要使用ePWM6 EDIS; // 配置时基模块 EPwm6Regs.TBPRD 10000; // 设置周期值 EPwm6Regs.TBPHS.half.TBPHS 0; // 相位设为0 EPwm6Regs.TBCTR 0; // 计数器清零 // 设置计数模式 EPwm6Regs.TBCTL.bit.CTRMODE TB_COUNT_UP; // 向上计数 EPwm6Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm6Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟预分频 EPwm6Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟预分频 // 配置比较模块 EPwm6Regs.CMPA.half.CMPA 5000; // 设置比较值A EPwm6Regs.CMPB 7500; // 设置比较值B // 配置动作模块 EPwm6Regs.AQCTLA.bit.ZRO AQ_SET; // 计数器为0时置高 EPwm6Regs.AQCTLA.bit.CAU AQ_CLEAR; // 计数器等于CMPA时置低 EPwm6Regs.AQCTLB.bit.ZRO AQ_SET; // 计数器为0时置高 EPwm6Regs.AQCTLB.bit.CBU AQ_CLEAR; // 计数器等于CMPB时置低这段代码配置了一个简单的PWM波形占空比分别为50%(ePWM6A)和25%(ePWM6B)。实际使用时我们需要根据具体需求调整这些参数。比如要改变PWM频率可以修改TBPRD的值要调整占空比则修改CMPA和CMPB的值。2. 死区时间配置与桥臂保护在电机驱动和电源应用中死区时间是必须考虑的关键参数。我曾在项目初期忽略了这一点结果导致MOSFET桥臂直通烧毁了好几个功率管。这个惨痛教训让我深刻认识到死区配置的重要性。死区模块(DB)的主要作用是防止同一桥臂的上下两个开关管同时导通。当PWM信号从高电平切换到低电平时由于器件存在关断延时如果不插入死区时间就可能出现短暂的同时导通现象造成电源短路。DSP28335的死区模块提供了多种配置方式// 死区模式定义 #define DB_IN_A 0 // 两路都输入A信号 #define DB_IN_A_UP_B_DOWN 2 // 上升沿用A下降沿用B #define DB_IN_B_UP_A_DOWN 1 // 上升沿用B下降沿用A #define DB_IN_B 3 // 两路都输入B信号 // 死区极性定义 #define DB_SEL_0 0 // 不翻转 #define DB_SEL_A_F 1 // A路翻转 #define DB_SEL_B_F 2 // B路翻转 #define DB_SEL_A_B_F 3 // 两路都翻转 // 死区输出模式定义 #define DB_OUT_0 0 // 无延时 #define DB_Y_DOWN 1 // 下降沿延时 #define DB_Y_UP 2 // 上升沿延时 #define DB_Y_UP_DOWN 3 // 双边沿都延时 // 实际配置示例 EPwm6Regs.DBCTL.bit.IN_MODE DB_IN_A_UP_B_DOWN; EPwm6Regs.DBCTL.bit.POLSEL DB_SEL_B_F; EPwm6Regs.DBCTL.bit.OUT_MODE DB_Y_UP_DOWN; EPwm6Regs.DBRED 750; // 上升沿延时750个TBCLK周期 EPwm6Regs.DBFED 750; // 下降沿延时750个TBCLK周期这段代码配置了一个典型的互补PWM输出带有双边沿延时。DBRED和DBFED分别控制上升沿和下降沿的延时时间单位是TBCLK周期。实际项目中这个值需要根据功率器件的开关特性来确定一般建议通过示波器实测调整。3. 高级功能PWM斩波与错误保护PWM斩波功能(PC模块)在驱动某些特殊功率器件时非常有用。比如IGBT的门极驱动通常需要一个大电流的初始脉冲来快速开通然后用一系列小电流脉冲来维持导通状态。这个功能可以通过斩波模块实现。// 斩波模块配置 #define PC_FREQ_DIV1 1 // 载波分频系数 #define PC_DUTY_50 4 // 占空比50% #define PC_OSHTWTH 16 // 首脉冲宽度 EPwm6Regs.PCCTL.bit.CHPFREQ PC_FREQ_DIV1; EPwm6Regs.PCCTL.bit.CHPDUTY PC_DUTY_50; EPwm6Regs.PCCTL.bit.OSHTWTH PC_OSHTWTH; EPwm6Regs.PCCTL.bit.CHPEN 1; // 使能斩波功能错误联防模块(TZ)是系统安全的最后一道防线。当检测到过流、过压等故障时它能立即关闭PWM输出保护功率器件不受损坏。配置TZ模块时我们需要考虑故障恢复策略// 错误联防配置 EPwm6Regs.TZSEL.bit.OSHT2 1; // 使用TZ2引脚作为单次触发源 EPwm6Regs.TZCTL.bit.TZA Force_Low; // 故障时强制输出低 EPwm6Regs.TZCTL.bit.TZB Force_Low; EPwm6Regs.TZEINT.bit.OST 1; // 使能单次触发中断 // 中断服务程序 interrupt void PMW_TZ_ISR(void) { while(EPwm6Regs.TZFLG.bit.OST 1) { if(故障已清除) { EALLOW; EPwm6Regs.TZCLR.bit.OST 1; // 清除故障标志 EDIS; } } EPwm6Regs.TZCLR.bit.INT 1; PieCtrlRegs.PIEACK.bit.ACK6 1; }4. 事件触发与ADC同步在闭环控制系统中PWM和ADC的同步至关重要。ePWM的事件触发模块(ET)可以在特定时刻产生SOC信号触发ADC采样。比如在电机控制中我们通常希望在PWM周期的中点进行电流采样这时可以这样配置// 配置SOC触发 EPwm6Regs.ETSEL.bit.SOCASEL SOC_SEL_CAU; // CMPA匹配时触发 EPwm6Regs.ETSEL.bit.SOCAEN 1; // 使能SOCA EPwm6Regs.ETPS.bit.SOCAPRD SOC_PRD_1; // 每次匹配都触发 EPwm6Regs.ETCLR.bit.SOCA 1; // 清除SOC标志 // ADC配置 AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 1; // 使能EPWM触发 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 1; // 使能SEQ1中断ePWM模块还支持周期中断可以在每个PWM周期开始时执行特定操作。这个功能常用于更新控制参数// 配置周期中断 EPwm6Regs.ETSEL.bit.INTSEL ET_CTR_PRD; // 计数器周期值时中断 EPwm6Regs.ETSEL.bit.INTEN 1; // 使能中断 EPwm6Regs.ETPS.bit.INTPRD ET_1ST; // 每次条件满足都中断 // 中断服务程序 interrupt void EPWM_IRQ(void) { // 更新控制参数 EPwm6Regs.ETCLR.bit.INT 1; // 清除中断标志 PieCtrlRegs.PIEACK.bit.ACK6 1; }在实际项目中我通常会先用示波器验证PWM波形是否符合预期然后再逐步添加死区、斩波等高级功能。调试时可以先把PWM频率设低一些方便观察波形细节。等所有功能都验证通过后再调整到实际工作频率。