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频率设低一些,方便观察波形细节。等所有功能都验证通过后,再调整到实际工作频率。