1. 28335 EPWM模块入门从零开始理解PWM电机控制第一次接触28335的EPWM模块时我被它复杂的寄存器配置搞得晕头转向。但当我真正用它驱动了一个三相无刷电机后才发现这个模块的强大之处。EPWMEnhanced Pulse Width Modulation是TI C2000系列DSP特有的增强型PWM模块特别适合电机控制、电源转换等需要精确时序控制的应用场景。想象一下PWM就像是一个快速开关的水龙头通过调节开关的开启和关闭时间比例占空比就能精确控制水流大小。在电机控制中这个水流就是驱动电机的电流而EPWM模块就是那个智能水龙头控制器。28335芯片最多可以有6个独立的EPWM模块EPWM1-EPWM6每个模块都能生成两路互补的PWM信号EPWMxA和EPWMxB非常适合驱动H桥电路。在实际项目中我常用EPWM来控制直流有刷电机和无刷电机。比如要让一个24V直流电机以60%功率运转就需要生成占空比为60%的PWM波。通过配置EPWM的时基模块TB、比较模块CMP和动作模块AQ可以轻松实现这个需求。下面这段基础配置代码展示了如何设置一个10kHz的PWM信号// 时基模块配置 EPwm1Regs.TBPRD 1500; // 设定PWM周期为1500个时钟周期 (10kHz 15MHz) EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UP; // 向上计数模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟不分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟不分频 // 比较模块配置 EPwm1Regs.CMPA.half.CMPA 900; // 设置占空比为60% (900/1500) // 动作模块配置 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // 计数等于CMPA时置高 EPwm1Regs.AQCTLA.bit.PRD AQ_CLEAR; // 计数等于周期时置低2. 核心模块详解从寄存器配置到波形生成2.1 时基模块(TB)PWM的节拍器时基模块就像是乐队的指挥决定了PWM波的节奏。TBCTR是核心的计数器它会根据配置的计数模式不断变化。我在调试时经常用示波器观察TBCTR的变化发现它有三种工作模式递增模式(TB_COUNT_UP)计数器从0增加到TBPRD然后归零递减模式(TB_COUNT_DOWN)计数器从TBPRD减少到0然后重新加载增减模式(TB_COUNT_UPDOWN)计数器从0增加到TBPRD再减少回0增减模式特别适合电机控制因为它可以产生中心对称的PWM波形减少谐波干扰。配置示例EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 增减计数模式 EPwm1Regs.TBPRD 1000; // 设定周期值 EPwm1Regs.TBPHS.half.TBPHS 0; // 相位寄存器清零时钟分频是另一个需要注意的参数。我有次调试时PWM频率总是不对后来发现是忘了配置HSPCLKDIV。时钟计算公式是TBCLK SYSCLKOUT / (HSPCLKDIV × CLKDIV)。比如系统时钟60MHz要得到1MHz的TBCLK可以这样设置EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV2; // 高速时钟2分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV30; // 时钟30分频2.2 比较模块(CMP)精准控制占空比比较模块决定了PWM波的占空比。CMPA和CMPB寄存器会不断与TBCTR比较当数值匹配时触发动作模块。这里有个影子寄存器的概念特别重要可以防止PWM波形出现毛刺。我曾在电机高速运行时遇到过占空比跳变的问题就是因为直接修改了CMPA主寄存器。正确的做法是使用影子寄存器EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 在计数器为零时加载 EPwm1Regs.CMPA.half.CMPA 600; // 设置占空比为60%高精度PWM(HRPWM)是28335的特色功能通过CMPAHR寄存器可以实现ps级的精度调整。配置HRPWM时需要注意EPwm1Regs.HRCNFG.bit.EDGMODE HR_FEP; // 上升沿和下降沿都微调 EPwm1Regs.HRCNFG.bit.CTLMODE HR_CMP; // 控制CMPAHR寄存器 EPwm1Regs.CMPAHR.half.CMPAHR 0x0800; // 设置微调量2.3 动作模块(AQ)PWM波形塑形师动作模块决定了比较事件发生时输出引脚的行为。通过AQCTLA和AQCTLB可以配置六种触发事件对应的动作CAU/CAD递增/递减时匹配CMPACBU/CBD递增/递减时匹配CMPBPRD/ZRO达到周期值/零值我最常用的配置是生成互补PWM// EPWMxA配置 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 递增匹配CMPA时拉低 EPwm1Regs.AQCTLA.bit.PRD AQ_SET; // 周期匹配时拉高 // EPWMxB配置互补 EPwm1Regs.AQCTLB.bit.CBU AQ_SET; // 递增匹配CMPB时拉高 EPwm1Regs.AQCTLB.bit.ZRO AQ_CLEAR; // 零匹配时拉低软件强制功能在调试时特别有用可以手动触发PWM变化EPwm1Regs.AQSFRC.bit.ACTSFA AQ_TOGGLE; // 设置切换动作 EPwm1Regs.AQSFRC.bit.OTSFA 1; // 触发强制事件3. 高级功能配置死区与故障保护3.1 死区模块(DB)防止H桥直通的关键死区时间是电机驱动中必须考虑的因素。我有次忽略了死区设置结果MOS管发热严重差点烧毁驱动电路。EPWM的死区模块可以自动在互补PWM中加入延迟。配置死区需要设置三个关键参数DBRED上升沿延迟DBFED下降沿延迟DBCTL控制信号路径典型配置如下EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; // 两路信号都作为死区输入 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // 高电平有效互补模式 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 使能死区 EPwm1Regs.DBRED 100; // 上升沿延迟100个TBCLK EPwm1Regs.DBFED 100; // 下降沿延迟100个TBCLK实际应用中死区时间需要根据功率器件的开关特性确定。比如IGBT通常需要500ns-1μs的死区而MOSFET可以设置200-500ns。可以通过公式计算死区时钟周期 死区时间 × TBCLK频率。3.2 故障保护(TZ)系统安全的最后防线故障保护模块是我最重视的部分它能在过流、过压等故障发生时快速关闭PWM输出。28335提供了6个故障输入引脚(TZ1-TZ6)可以配置为单次触发或周期触发模式。安全配置示例// 选择故障源 EPwm1Regs.TZSEL.bit.OSHT1 TZ_ENABLE; // 使能TZ1单次触发 EPwm1Regs.TZSEL.bit.CBC1 TZ_ENABLE; // 使能TZ1周期触发 // 配置故障动作 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; // 故障时强制EPWMxA拉低 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // 故障时强制EPWMxB拉低 // 使能中断 EPwm1Regs.TZEINT.bit.OST 1; // 使能单次触发中断调试技巧可以通过软件强制触发故障来测试保护电路EPwm1Regs.TZFRC.bit.OST 1; // 软件强制单次故障故障标志需要手动清除才能恢复PWM输出EPwm1Regs.TZCLR.bit.OST 1; // 清除单次故障标志4. 完整电机控制应用实例4.1 三相无刷电机驱动配置下面是一个完整的无刷电机驱动配置示例包含中心对齐PWM、死区保护和故障处理void InitEPWM(void) { // 时基模块配置 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 中心对齐模式 EPwm1Regs.TBPRD 1000; // 10kHz PWM (假设系统时钟60MHz) EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV2; // 时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 比较模块配置 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // 使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 零点时加载 EPwm1Regs.CMPA.half.CMPA 300; // 初始占空比30% // 动作模块配置 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 递增匹配CMPA时拉低 EPwm1Regs.AQCTLA.bit.PRD AQ_SET; // 周期匹配时拉高 EPwm1Regs.AQCTLB.bit.CBU AQ_SET; // 递增匹配CMPB时拉高 EPwm1Regs.AQCTLB.bit.ZRO AQ_CLEAR; // 零匹配时拉低 // 死区配置 EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; EPwm1Regs.DBRED 60; // 500ns死区 120MHz TBCLK EPwm1Regs.DBFED 60; // 故障保护配置 EPwm1Regs.TZSEL.bit.OSHT1 TZ_ENABLE; EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; EPwm1Regs.TZEINT.bit.OST 1; }4.2 调试技巧与常见问题解决在实际调试中我总结了一些实用技巧使用示波器观察EPWMxA和EPWMxB波形时要确保探头接地良好否则可能看到虚假的振铃如果PWM输出不稳定检查TBPRD和CMPA的加载时机是否一致死区时间不足会导致桥臂直通可以通过观察Vgs波形确认使用强制功能测试各种边界条件常见问题排查问题PWM无输出检查时基时钟是否使能确认GPIO复用功能配置正确查看TZ模块是否处于强制状态问题占空比不正确检查CMPA影子寄存器加载模式确认计数模式(增减模式占空比计算方式不同)验证时钟分频设置问题电机运行不平稳调整死区时间检查电源电压是否稳定确认PWM频率是否适合电机特性通过合理配置28335的EPWM模块可以实现高效、可靠的电机控制。我在多个无刷电机驱动项目中都采用了类似的配置框架系统运行稳定动态响应良好。
28335 EPWM模块实战:从寄存器配置到电机控制应用
发布时间:2026/5/27 12:19:51
1. 28335 EPWM模块入门从零开始理解PWM电机控制第一次接触28335的EPWM模块时我被它复杂的寄存器配置搞得晕头转向。但当我真正用它驱动了一个三相无刷电机后才发现这个模块的强大之处。EPWMEnhanced Pulse Width Modulation是TI C2000系列DSP特有的增强型PWM模块特别适合电机控制、电源转换等需要精确时序控制的应用场景。想象一下PWM就像是一个快速开关的水龙头通过调节开关的开启和关闭时间比例占空比就能精确控制水流大小。在电机控制中这个水流就是驱动电机的电流而EPWM模块就是那个智能水龙头控制器。28335芯片最多可以有6个独立的EPWM模块EPWM1-EPWM6每个模块都能生成两路互补的PWM信号EPWMxA和EPWMxB非常适合驱动H桥电路。在实际项目中我常用EPWM来控制直流有刷电机和无刷电机。比如要让一个24V直流电机以60%功率运转就需要生成占空比为60%的PWM波。通过配置EPWM的时基模块TB、比较模块CMP和动作模块AQ可以轻松实现这个需求。下面这段基础配置代码展示了如何设置一个10kHz的PWM信号// 时基模块配置 EPwm1Regs.TBPRD 1500; // 设定PWM周期为1500个时钟周期 (10kHz 15MHz) EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UP; // 向上计数模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟不分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟不分频 // 比较模块配置 EPwm1Regs.CMPA.half.CMPA 900; // 设置占空比为60% (900/1500) // 动作模块配置 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // 计数等于CMPA时置高 EPwm1Regs.AQCTLA.bit.PRD AQ_CLEAR; // 计数等于周期时置低2. 核心模块详解从寄存器配置到波形生成2.1 时基模块(TB)PWM的节拍器时基模块就像是乐队的指挥决定了PWM波的节奏。TBCTR是核心的计数器它会根据配置的计数模式不断变化。我在调试时经常用示波器观察TBCTR的变化发现它有三种工作模式递增模式(TB_COUNT_UP)计数器从0增加到TBPRD然后归零递减模式(TB_COUNT_DOWN)计数器从TBPRD减少到0然后重新加载增减模式(TB_COUNT_UPDOWN)计数器从0增加到TBPRD再减少回0增减模式特别适合电机控制因为它可以产生中心对称的PWM波形减少谐波干扰。配置示例EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 增减计数模式 EPwm1Regs.TBPRD 1000; // 设定周期值 EPwm1Regs.TBPHS.half.TBPHS 0; // 相位寄存器清零时钟分频是另一个需要注意的参数。我有次调试时PWM频率总是不对后来发现是忘了配置HSPCLKDIV。时钟计算公式是TBCLK SYSCLKOUT / (HSPCLKDIV × CLKDIV)。比如系统时钟60MHz要得到1MHz的TBCLK可以这样设置EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV2; // 高速时钟2分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV30; // 时钟30分频2.2 比较模块(CMP)精准控制占空比比较模块决定了PWM波的占空比。CMPA和CMPB寄存器会不断与TBCTR比较当数值匹配时触发动作模块。这里有个影子寄存器的概念特别重要可以防止PWM波形出现毛刺。我曾在电机高速运行时遇到过占空比跳变的问题就是因为直接修改了CMPA主寄存器。正确的做法是使用影子寄存器EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 在计数器为零时加载 EPwm1Regs.CMPA.half.CMPA 600; // 设置占空比为60%高精度PWM(HRPWM)是28335的特色功能通过CMPAHR寄存器可以实现ps级的精度调整。配置HRPWM时需要注意EPwm1Regs.HRCNFG.bit.EDGMODE HR_FEP; // 上升沿和下降沿都微调 EPwm1Regs.HRCNFG.bit.CTLMODE HR_CMP; // 控制CMPAHR寄存器 EPwm1Regs.CMPAHR.half.CMPAHR 0x0800; // 设置微调量2.3 动作模块(AQ)PWM波形塑形师动作模块决定了比较事件发生时输出引脚的行为。通过AQCTLA和AQCTLB可以配置六种触发事件对应的动作CAU/CAD递增/递减时匹配CMPACBU/CBD递增/递减时匹配CMPBPRD/ZRO达到周期值/零值我最常用的配置是生成互补PWM// EPWMxA配置 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 递增匹配CMPA时拉低 EPwm1Regs.AQCTLA.bit.PRD AQ_SET; // 周期匹配时拉高 // EPWMxB配置互补 EPwm1Regs.AQCTLB.bit.CBU AQ_SET; // 递增匹配CMPB时拉高 EPwm1Regs.AQCTLB.bit.ZRO AQ_CLEAR; // 零匹配时拉低软件强制功能在调试时特别有用可以手动触发PWM变化EPwm1Regs.AQSFRC.bit.ACTSFA AQ_TOGGLE; // 设置切换动作 EPwm1Regs.AQSFRC.bit.OTSFA 1; // 触发强制事件3. 高级功能配置死区与故障保护3.1 死区模块(DB)防止H桥直通的关键死区时间是电机驱动中必须考虑的因素。我有次忽略了死区设置结果MOS管发热严重差点烧毁驱动电路。EPWM的死区模块可以自动在互补PWM中加入延迟。配置死区需要设置三个关键参数DBRED上升沿延迟DBFED下降沿延迟DBCTL控制信号路径典型配置如下EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; // 两路信号都作为死区输入 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // 高电平有效互补模式 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 使能死区 EPwm1Regs.DBRED 100; // 上升沿延迟100个TBCLK EPwm1Regs.DBFED 100; // 下降沿延迟100个TBCLK实际应用中死区时间需要根据功率器件的开关特性确定。比如IGBT通常需要500ns-1μs的死区而MOSFET可以设置200-500ns。可以通过公式计算死区时钟周期 死区时间 × TBCLK频率。3.2 故障保护(TZ)系统安全的最后防线故障保护模块是我最重视的部分它能在过流、过压等故障发生时快速关闭PWM输出。28335提供了6个故障输入引脚(TZ1-TZ6)可以配置为单次触发或周期触发模式。安全配置示例// 选择故障源 EPwm1Regs.TZSEL.bit.OSHT1 TZ_ENABLE; // 使能TZ1单次触发 EPwm1Regs.TZSEL.bit.CBC1 TZ_ENABLE; // 使能TZ1周期触发 // 配置故障动作 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; // 故障时强制EPWMxA拉低 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // 故障时强制EPWMxB拉低 // 使能中断 EPwm1Regs.TZEINT.bit.OST 1; // 使能单次触发中断调试技巧可以通过软件强制触发故障来测试保护电路EPwm1Regs.TZFRC.bit.OST 1; // 软件强制单次故障故障标志需要手动清除才能恢复PWM输出EPwm1Regs.TZCLR.bit.OST 1; // 清除单次故障标志4. 完整电机控制应用实例4.1 三相无刷电机驱动配置下面是一个完整的无刷电机驱动配置示例包含中心对齐PWM、死区保护和故障处理void InitEPWM(void) { // 时基模块配置 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 中心对齐模式 EPwm1Regs.TBPRD 1000; // 10kHz PWM (假设系统时钟60MHz) EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV2; // 时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 比较模块配置 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // 使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 零点时加载 EPwm1Regs.CMPA.half.CMPA 300; // 初始占空比30% // 动作模块配置 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 递增匹配CMPA时拉低 EPwm1Regs.AQCTLA.bit.PRD AQ_SET; // 周期匹配时拉高 EPwm1Regs.AQCTLB.bit.CBU AQ_SET; // 递增匹配CMPB时拉高 EPwm1Regs.AQCTLB.bit.ZRO AQ_CLEAR; // 零匹配时拉低 // 死区配置 EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; EPwm1Regs.DBRED 60; // 500ns死区 120MHz TBCLK EPwm1Regs.DBFED 60; // 故障保护配置 EPwm1Regs.TZSEL.bit.OSHT1 TZ_ENABLE; EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; EPwm1Regs.TZEINT.bit.OST 1; }4.2 调试技巧与常见问题解决在实际调试中我总结了一些实用技巧使用示波器观察EPWMxA和EPWMxB波形时要确保探头接地良好否则可能看到虚假的振铃如果PWM输出不稳定检查TBPRD和CMPA的加载时机是否一致死区时间不足会导致桥臂直通可以通过观察Vgs波形确认使用强制功能测试各种边界条件常见问题排查问题PWM无输出检查时基时钟是否使能确认GPIO复用功能配置正确查看TZ模块是否处于强制状态问题占空比不正确检查CMPA影子寄存器加载模式确认计数模式(增减模式占空比计算方式不同)验证时钟分频设置问题电机运行不平稳调整死区时间检查电源电压是否稳定确认PWM频率是否适合电机特性通过合理配置28335的EPWM模块可以实现高效、可靠的电机控制。我在多个无刷电机驱动项目中都采用了类似的配置框架系统运行稳定动态响应良好。