006-TMS320F28335 DSP外设详解:ePWM的配置与应用

        TMS320F28335(简称28335)作为一款高性能DSP,其ePWM(增强型脉宽调制模块)是其核心外设之一,广泛用于电机控制和电源管理等领域。本文将深入讲解ePWM的功能、配置方法及应用实例,助力开发者快速上手。

一、ePWM功能概述

ePWM模块具备以下关键特性:

  • 高精度输出:支持150ps的高分辨率脉冲输出,适用于对控制精度要求极高的应用场景。

  • 多通道独立控制:支持多达6个独立的ePWM通道,可同时控制多个负载或电机相。

  • 可编程死区控制:内置可编程死区时间控制功能,用于防止功率器件的直通短路。

  • 同步功能:支持多个ePWM模块之间的同步,实现多相电机的精确控制。

  • 故障保护机制:支持故障输入,可在紧急情况下快速关闭PWM输出,保护系统安全。

二、ePWM寄存器配置

ePWM的配置主要通过以下寄存器实现:

(一)TBPRD寄存器(计数器周期寄存器)

  • 功能:设置ePWM计数器的周期值。

  • 配置方法:根据所需的PWM频率,计算并设置TBPRD寄存器的值。例如,要产生20kHz的PWM信号,TBPRD的值可设置为系统时钟频率除以20kHz再减1。

(二)CMPA寄存器(比较寄存器A)

  • 功能:设置PWM信号的占空比。

  • 配置方法:根据所需的占空比,计算并设置CMPA寄存器的值。例如,要实现50%的占空比,CMPA的值可设置为TBPRD值的一半。

(三)TBCTL寄存器(计数器控制寄存器)

  • 功能:配置计数器的工作模式,如向上计数、向下计数或上下计数模式。

  • 配置方法

    • TBCTL.bit.CTRMODE:设置为0表示向上计数模式,设置为1表示向下计数模式,设置为2表示上下计数模式。

    • TBCTL.bit.CTRRST:用于重置计数器。

(四)CMPCTL寄存器(比较控制寄存器)

  • 功能:配置比较模块的行为。

  • 配置方法:通过设置CMPCTL寄存器的相应位来选择比较模式,如设置为0表示在计数器达到CMPA时输出高电平。

(五)ACTRA寄存器(动作资格寄存器A)

  • 功能:配置比较事件触发后的输出动作。

  • 配置方法:例如,设置ACTRA寄存器的相应位,使能在计数器达到CMPA时输出高电平。

(六)DBCTL寄存器(死区控制寄存器)

  • 功能:设置死区时间,防止功率器件的直通短路。

  • 配置方法:根据系统要求,设置DBCTL寄存器的相应位来选择死区时间。

三、ePWM应用实例

(一)电机控制

通过配置ePWM模块生成精确的PWM信号,控制电机的转速和方向。

1. 硬件连接

将ePWM输出引脚连接到电机驱动模块的输入端。

2. 代码实现
#include "DSP28x_Project.h"

void EPWM_Init(void);
void SetPWMFrequency(Uint16 frequency);
void SetPWMDutyCycle(Uint16 dutyCycle);

int main(void)
{
    // 系统初始化
    InitSysCtrl();

    // ePWM初始化
    EPWM_Init();

    // 主循环
    while(1)
    {
        // 设置PWM频率为20kHz
        SetPWMFrequency(20000);
        // 设置PWM占空比为50%
        SetPWMDutyCycle(50);
    }
}

void EPWM_Init(void)
{
    // 配置ePWM模块
    EPwm1Regs.TBPRD = 1000; // 设置周期寄存器
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 设置为向上计数模式
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 设置时钟分频为1
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 设置时钟分频为1

    // 配置比较寄存器
    EPwm1Regs.CMPA.bit.CMPA = 500; // 设置占空比为50%

    // 配置动作资格寄存器
    EPwm1Regs.ACTRA.bit.CTR_CMPA_CLR = 0; // 设置在计数器达到CMPA时输出高电平
    EPwm1Regs.ACTRA.bit.CTR_CMPA_SET = 1;

    // 配置死区控制寄存器
    EPwm1Regs.DBCTL.bit.DBFED = 150; // 设置死区时间为150ns
    EPwm1Regs.DBCTL.bit.DBRIS = 1; // 使能死区功能

    // 启动ePWM模块
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 设置为向上计数模式
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 3; // 选择同步源
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 0; // 设置为自由运行模式

    // 使能ePWM输出
    EPwm1Regs.OUTCTL.bit.OUTMOD = 3; // 设置为连续输出模式
}

void SetPWMFrequency(Uint16 frequency)
{
    // 计算周期寄存器值
    Uint16 tbprd = SysCtrlRegs.PLLFREQ.bit.PLLCLK / frequency / 2 - 1;
    EPwm1Regs.TBPRD = tbprd;
}

void SetPWMDutyCycle(Uint16 dutyCycle)
{
    // 计算比较寄存器值
    Uint16 cmpa = dutyCycle * EPwm1Regs.TBPRD / 100;
    EPwm1Regs.CMPA.bit.CMPA = cmpa;
}
  • HSPCLKDIV(High-Speed Pre-counter Clock Divide):这个位字段用于设置ePWM模块的时钟预分频。它影响的是输入到计数器的时钟频率。设置为0表示不分频,即使用原始时钟频率。

  • CLKDIV(Counter Clock Divide):这个位字段用于设置ePWM计数器的时钟分频。它进一步调整进入计数器的时钟频率。设置为0同样表示不分频。

通过组合使用HSPCLKDIVCLKDIV,可以灵活调整ePWM模块的时钟频率,从而实现不同的PWM频率和分辨率要求。

四、总结

        ePWM模块作为28335中重要的外设模块,提供了高精度的脉宽调制功能,适用于多种电机控制和电源管理场景。通过合理配置其寄存器,可实现精确的PWM信号生成。掌握ePWM的使用,对于开发高性能嵌入式应用具有重要意义。希望本文能帮助你更好地理解和运用28335的ePWM外设。

你可能感兴趣的:(单片机,嵌入式硬件,dsp开发)