This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28.0049万C:ePWM可变占空比

Guru**** 2524550 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1101021/tms320f280049c-epwm-variable-duty-cycle

部件号:TMS320F28.0049万C
Thread:sysconfigC2000WARE中讨论的其它部件

我有几个关于ePWM属性的后续问题。

ePWM中断例程的默认时钟速度是多少? 您能否向我指出一项资源,用于计算实施1.44万 Hz切换频率所需选择的theta增量?

示例2  ePWM_Updom_AQ使用compAValue更新CMPA寄存器,compAValue递增至1950,递减至50。 为什么2000被视为100 % 占空比?

我一直在尝试使用theta值数组,这些值在每个中断上交替变化,采用它们的正弦,然后乘以compAValue,以生成不同的占空比。

这是我目前为止的代码副本,我非常感谢他们的帮助。

//#######################################################################
//
//文件:ePWM_ex2_upding_aq.c
//
//标题:ePWM Action Qualifier Module - Using up / down count (ePWM操作限定器模块-使用向上/向下计数)。
//
//! \addtogroup driver_example_list
//! <H1>ePWM向上计数操作限定符</H1>
//!
//! 此示例将ePWM1,ePWM2,ePWM3配置为使用生成波形
//! ePWMxA和ePWMxB上的独立调制。
//!
//! 比较值CMPA和CMBB在ePWM的ISR内进行了修改。
//!
//! 对于本示例,TB计数器处于上升/下降计数模式。
//!
//! 查看ePWM1A/B (GPIO0和GPIO1),ePWM2A/B (GPIO2和GPIO3)
//! 和ePWM3A/B (GPIO4和GPIO5)波形在示波器上。
//
//#######################################################################
//
//
//$Copyright:
//版权所有(C) 2022 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,无论是否使用
//修改,但前提是满足以下条件
//满足:
//
//重新分发源代码必须保留上述版权
//注意,此条件列表和以下免责声明。
//
//以二进制形式重新分发必须复制上述版权
//注意,此条件列表和中的以下免责声明
//随提供的文档和/或其他材料
//分发。
//
//既不是德州仪器(TI)公司的名称,也不是的名称
//其贡献者可用于支持或促销衍生产品
//未经特定的事先书面许可。
//
//本软件由版权所有者和贡献者提供
//“按原样”和任何明示或暗示的担保,包括但不包括
//仅限于适销性和适用性的暗示担保
//不承担特定目的。 在任何情况下,版权都不应享有
//所有者或贡献者对任何直接,间接,附带,
//特殊,典型或后果性损害(包括但不包括
//仅限于采购替代货物或服务;无法使用,
//数据或利润;或业务中断)
//责任理论,无论是合同,严格责任还是侵权行为
//(包括疏忽或其他)因使用而产生的任何问题
//此软件的任何版本,即使已被告知可能会造成此类损坏。
//$
//#######################################################################

//
//包含的文件
//
#include "driverlib.h"
包含"device.h"
包含"board.h"


//
//定义
//
#define EPWM1_TIMER_TBPRD 2000U
#define EPWM1_MAX_CMPA 1950U
#define EPWM1_MIN_CMPA 50U

#define EPWM2_TIMER_TBPRD 2000U
#define EPWM2_MAX_CMPA 1950U
#define EPWM2_MIN_CMPA 50U

#define EPWM3_TIMER_TBPRD 2000U
#define EPWM3_MAX_CMPA 1950U
#define EPWM3_MIN_CMPA 50U

#define ePWM_CMP_UP 1u
#define ePWM_CMP_DOWN 0U

//
//全局
//
typedef结构

  UINT32_t epwmModule;
  UINT16_t epwmCompA方向;
  uINT16_t epwmTimerIntCount;
  UINT16_t epwmMaxCompA;
  UINT16_t epwmMinCompA;
} epwmInformation;

//
//全局值以保存本示例中使用的ePWM信息
//
epwmInformation epwm1Info;
epwmInformation epwm2Info;
epwmInformation epwm3Info;

//
//函数原型
//
void initEPWM1(void);
void initEPWM2(void);
void initEPWM3(void);
__interrupt void epwm1ISR(void);
__interrupt void epwm2ISR(void);
__interrupt void epwm3ISR(void);
void updateCompare(epwmInformation *epwmInfo);

//
//主菜单
//
Void主(void)

//
//初始化设备时钟和外围设备
//
device_init();

//
//禁用引脚锁并启用内部上拉。
//
DEVICE_INITGPIO ();

//
//初始化饼图和清除饼图寄存器。 禁用CPU中断。
//
interrup_initModule();

//
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//
interrupT_initVectorTable();

//
//将中断服务例程分配给ePWM中断
//
中断注册(INT_EPWM1,&epwm1ISR);
中断注册(INT_EPWM2,&epwm2ISR);
中断注册(INT_EPWM3,&epwm3ISR);


//
//禁用同步(同时冻结时钟至PWM)
//
sysctl_disablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);

//
//将GPIO0/1,GPIO2/3和GPIO4/5配置为ePWM1A/1B,ePWM2A/2B和
// ePWM3A/3B引脚
//配置ePWM模块
//
Board_init();

initEPWM1();
initEPWM2();
initEPWM3();

//
//启用与PWM的同步和时钟
//
sysctl_enablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);

//
//启用ePWM中断
//
INTERRUL_ENABLE (INT_EPWM1);
INTERRUL_ENABLE (INT_EPWM2);
中断启用(INT_EPWM3);

//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

//
//空闲循环。 只需坐下来永远循环(可选):
//
对于(;;)

NOP;
}
}

//
// epwm1ISR - ePWM 1 ISR
//
__interrupt void epwm1ISR(void)

//
//更新CMPA和CMBB值
//
更新比较(&epwm1Info);

//
//清除此计时器的INT标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM1_base);

//
//确认中断组
//
interrupT_clearACKGroup(interrupT_ACK_Group3);
}

//
// epwm2ISR - ePWM 2 ISR
//
__interrupt void epwm2ISR(void)

//
//更新CMPA和CMBB值
//
更新比较(&epwm2Info);

//
//清除此计时器的INT标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM2_base);

//
//确认中断组
//
interrupT_clearACKGroup(interrupT_ACK_Group3);
}

//
// epwm3ISR - ePWM 3 ISR
//
__interrupt void epwm3ISR(void)

//
//更新CMPA和CMBB值
//
更新比较(&epwm3Info);

//
//清除此计时器的INT标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM3_base);

//
//确认中断组
//
interrupT_clearACKGroup(interrupT_ACK_Group3);
}

//
// initEPWM1 -配置ePWM1
//
void initEPWM1()

//
//此示例用于跟踪方向的信息
// CMPA/CMPB值正在移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm1Info.epwmCompADirection = ePWM_CMP_UP;
epwm1Info.epwmTimerIntCount = 0U;
epwm1Info.epwmModule = myEPWM1_base;
epwm1Info.epwmMaxCompA = EPWM1_MAX_CMPA;
epwm1Info.epwmMinCompA = EPWM1_MIN_CMPA;

}

//
// initEPWM2 -配置ePWM2
//
void initEPWM2()

//
//此示例用于跟踪方向的信息
// CMPA/CMPB值正在移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm2Info.epwmCompADirection = ePWM_CMP_UP;
epwm2Info.epwmTimerIntCount = 0U;
epwm2Info.epwmModule = myEPWM2_base;
epwm2Info.epwmMaxCompA = EPWM2_MAX_CMPA;
epwm2Info.epwmMinCompA = EPWM2_MIN_CMPA;
}

//
// initEPWM3 -配置ePWM3
//
void initEPWM3(void)

//
//此示例用于跟踪方向的信息
// CMPA/CMPB值正在移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm3Info.epwmCompADirection = ePWM_CMP_UP;
epwm3Info.epwmTimerIntCount = 0U;
epwm3Info.epwmModule = myEPWM3_base;
epwm3Info.epwmMaxCompA = EPWM3_MAX_CMPA;
epwm3Info.epwmMinCompA = EPWM3_MIN_CMPA;
}

//
// updateCompare -用于更新频率的功能
//
void updateCompare(epwmInformation *epwmInfo)

UINT16_t compAValue;
Float32_t theta[6]={0},0.31.4159万 ,0.62.8319万 ,0.94.2478万 ,1.2.5664万 , 1.5708 ;
float32_t x;
UINT16_t计数= 0;


compAValue = ePWM_getCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_a);


//
//每隔10次中断更改CMPA/CMPB值。
//
IF (epwmInfo->epwmTimerIntCount == 10U)

epwmInfo->epwmTimerIntCount = 0U;


//
//如果我们增加CMPA,请检查我们是否达到了最大值
//值。 如果不是,则增加CMPA,否则更改方向并减小
// CMPA
//
x = sin (theta[count]);

IF (epwmInfo->epwmCompADirection == ePWM_CMP_UP)

IF (compAValue <(epwmInfo->epwmMaxCompA))

ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
++compAValue*x);
COUNT++;
}
否则

epwmInfo->epwmCompADirection = ePWM_CMP_DOWN;
ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
--compAValue*x);
计数--;
}
}
//
//如果降低CMPA,请检查是否达到了最小值
//值。 如果不是,则降低CMPA,否则,更改方向并增加
// CMPA
//
否则

IF( compAValue ==(epwmInfo->epwmMinCompA))

epwmInfo->epwmCompADirection = ePWM_CMP_UP;
ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
++compAValue*x);
COUNT++;
}
否则

ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
--compAValue*x);
计数--;
}
}


}
否则

epwmInfo->epwmTimerIntCount++;
}

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另一件让我感到困惑的事情是如何改变第二和第三ePWM,使其相 位相距为120和240度。 在示例11中,有一个配置信号功能,但我认为它会干扰我当前正在使用的updateCompare功能中分配的占空比。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew,您好!

    ,您是否可以向我指示一个资源来计算实施1.44万 Hz切换频率时需要选择的theta增量?

    我已将此线程分配给Aditya,以帮助您继续支持您的初始线程,并回答有关theta计算的问题。

    ePWM中断例程的默认时钟速度是什么?

    您正在使用的特定示例具有以下用于设置ePWM中断的代码:

        // Interrupt where we will change the Compare Values
        // Select INT on Time base counter zero event,
        // Enable INT, generate INT on 3rd event
        //
        EPWM_setInterruptSource(myEPWM1_BASE, EPWM_INT_TBCTR_ZERO);
        EPWM_enableInterrupt(myEPWM1_BASE);
        EPWM_setInterruptEventCount(myEPWM1_BASE, 3U);

    这意味着,每隔三次时基计数器等于零时,将发生ePWM中断。 如果您希望更频繁地发生这种情况,则可以将其更改为每次时基计数器等于零时,从而使您的ISR频率与您的ePWM输出的频率相匹配。

    示2000示例110.1021万例228.0049万2 ePWM_updline_pwm 使用compAValue更新CMPA,compAValue递增至1950,递减至50。 为什么2000被视为100 % 占空比?[/QUOT]

    您是否使用比较器值在2000运行代码? 您在哪里看到了100 % 占空比?

    如何110.1021万如何改变28.0049万改变第二407.9032万第二个407.9032万个和第三个ePWM,使它们的相 距分别为120和240度。 在示例11中,有一个配置信号功能,但我认为它会干扰我当前正在使用的updateCompare功能中分配的占空比。

    正确,您需要使用映射到设置同步方案和相位移值的功能。

    请查看此线程,其中包含如何设置的示例:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1078925/tms320f28388d-examplw-epwm_ex3_synchronization-c/3998071?tisearch=e2e-sitesearch&keymatch=epwm_ex3_synchronization#3998071</s>2000 2000107.8925万2.8388万399.8071万399.8071万 

    我们最近还发布了一个视频,介绍设置同步/相位移所需的步骤:

    https://training.ti.com/c2000-enhanced-pulse-width-modulator-epwm-time-base-submodule?context=1137766-1149551-1149545</s>113.7766万 114.9551万114.9545万 

    此致,

    Marlyn

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ,您是否可以向我指示一个资源来计算实施1.44万 Hz切换频率时需要选择的theta增量?

    很抱歉混淆了。 让我来说明一下计算方法。

    例如,您的EPWMCLK频率为100MHz,您需要1.44万 Hz的输出频率,计算结果将下降为(1M/1.44万)--此值可以输入到TBPRD寄存器,该寄存器将为您提供所需的切换频率。 这几乎是计算TBPRD值的标准方法。 设备技术参考手册将是检查详细计算的良好参考。


    只有当您希望变频器/其他电源模块的输出频率为50/60Hz时,才会出现Theta计算。 如果不需要,请忽略该部件。

    谢谢!

    Aditya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Aditya:

    感谢你的帮助。 此代码将用于400 Hz逆变器,因此我需要使用theta来创建代表预期正弦电压的占空比。 到目前为止,我有一个包含6个theta值(以弧度为单位)的6元素浮点数组,当compAValue达到最大计数器值时,将其作为单位值乘以compAValue。 数组索引到PI/2,然后返回到0并重复。 不会使用负值,因为逆变器的输入电压是浮动的,因此50 % 占空比将表示sin波越过原点的位置。

    我还将ePWM更改为仅处于上升计数模式。

    下面是更新的'updateCompare'功能,如果您可以让我知道这是否是正确的方法。

    void updateCompare(epwmInformation *epwmInfo)

    UINT16_t compAValue;
    Float32_t theta[6]={0},0.31.4159万 ,0.62.8319万 ,0.94.2478万 ,1.2.5664万 , 1.5708 ;
    float32_t x;
    UINT16_t计数= 0;
    Bool posDirection =真;

    compAValue = ePWM_getCounterCompareValue(epwmInfo->epwmModule,
    ePWM_counter_compare_a);

    //
    //如果我们增加CMPA,请检查我们是否达到了最大值
    //值。 如果不是,则增加CMPA,否则更改方向并减小
    // CMPA
    //
    x = sin (theta[count]);

    IF (compAValue == EPWM1_MAX_CMPA)

    IF (位置方向)

    ePWM_setCounterCompareValue(epwmInfo->epwmModule,
    ePWM_counter_compare_A,
    compAValue*x);
    COUNT++;
    IF (计数= 6)

    posDirection =假;
    计数= 5;
    }
    }
    否则

    ePWM_setCounterCompareValue(epwmInfo->epwmModule,
    ePWM_counter_compare_A,
    compAValue*x);
    计数--;
    如果(count == 0)

    posDirection =真;
    }
    }
    compAValue = 0U;
    }

    compAValue++;


    }

    谢谢!

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew,

    您是如何得出0到90度内的6 theta值数组的? 我的直觉告诉您,这应该为您提供(1.44万/6*4)=1440 Hz而不是400的输出逆变器频率。

    对于400的输出频率,您可能需要阵列大小(1.44万/400)= 36 (在360度的完整周期中)。例如,在象限上的阵列大小为9。

    否则,配置看起来正常。

    谢谢!

    Aditya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Aditya:

    我更新了程序,将正弦值的36个元素数组包括在内,之前的6个数组用于一个象限,并基于对每个象限采样率的早期计算。 我仍然有一些令我困惑的事情: ePWMCLK默认设置为10MHz吗? 我在数据表和用户手册中看到它可以是许多值,但我假设这都是使用时钟分频器,所以如果我选择HSPCLKDIV = 4和CLKDIV = 1, TBCLK将是2.5 MHz?  

    这是我的修订代码 ,以及sysconfig文件中的参数。 在示波器上读取输出时,最初显示一个约为50 % 的占空比,且通道之间的相距不正确。

    //
    //包含的文件
    //
    #include "driverlib.h"
    包含"device.h"
    包含"board.h"

    //
    //定义
    // TBPRD的计算
    #define EPWM1_TIMER_TBPRD 172U //使用hspclkdiv =4, clkdiv =1
    #define EPWM1_MAX_CMPA 170U //TBCLK = 10MHz/4*1= 2.5MHz,T_PWM = 1/1.44万Hz = 69.44 usec
    //T_TBCLK = 400 nsec
    //TBPRD =(T_PWM/T_TBCLK)- 1 = 172
    #define EPWM2_TIMER_TBPRD 172U
    #define EPWM2_MAX_CMPA 170U

    #define EPWM3_TIMER_TBPRD 172U
    #define EPWM3_MAX_CMPA 170U

    #define ePWM_CMP_UP 1u


    //
    //全局
    //
    typedef结构

    UINT32_t epwmModule;
    UINT16_t epwmCompA方向;
    uINT16_t epwmTimerIntCount;
    UINT16_t epwmMaxCompA;
    } epwmInformation;

    //
    //全局值以保存本示例中使用的ePWM信息
    //
    epwmInformation epwm1Info;
    epwmInformation epwm2Info;
    epwmInformation epwm3Info;

    //
    //函数原型
    //
    void initEPWM1(void);
    void initEPWM2(void);
    void initEPWM3(void);
    __interrupt void epwm1ISR(void);
    __interrupt void epwm2ISR(void);
    __interrupt void epwm3ISR(void);
    void updateCompare(epwmInformation *epwmInfo);

    //
    //主菜单
    //
    Void主(void)

    //
    //初始化设备时钟和外围设备
    //
    device_init();

    //
    //禁用引脚锁并启用内部上拉。
    //
    DEVICE_INITGPIO ();

    //
    //初始化饼图和清除饼图寄存器。 禁用CPU中断。
    //
    interrup_initModule();

    //
    //使用指向外壳中断的指针初始化PIE矢量表
    //服务例程(ISR)。
    //
    interrupT_initVectorTable();

    //
    //将中断服务例程分配给ePWM中断
    //
    中断注册(INT_EPWM1,&epwm1ISR);
    中断注册(INT_EPWM2,&epwm2ISR);
    中断注册(INT_EPWM3,&epwm3ISR);


    //
    //禁用同步(同时冻结时钟至PWM)
    //
    sysctl_disablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);

    //
    //将GPIO0/1,GPIO2/3和GPIO4/5配置为ePWM1A/1B,ePWM2A/2B和
    // ePWM3A/3B引脚
    //配置ePWM模块
    //
    Board_init();

    initEPWM1();
    initEPWM2();
    initEPWM3();


    //
    //使用120度相位移初始化ePWM2
    //172*120/180=115
    //
    ePWM_selectPeriodLoadEvent (myEPWM2_BASE,ePWM_shadow_load_mode_sync);
    ePWM_setPhaseShift (myEPWM2_base,115);


    //
    //使用相位移初始化ePWM2
    //
    ePWM_selectPeriodLoadEvent (myEPWM3_base,ePWM_shadow_load_mode_sync);
    ePWM_setPhaseShift (myEPWM3_base,230);


    //
    // ePWM1 SYNCO在CTR =0上生成
    //
    ePWM_setSyncOutPulseMode (myEPWM1_BASE,ePWM_SYNC_OUT脉冲ON_COUN_ZERO);
    ePWM_setSyncOutPulseMode (myEPWM2_base,ePWM_SYNC_out_puls_on_EPWMxSYNCIN);
    ePWM_setSyncOutPulseMode (myEPWM3_base,ePWM_SYNC_Out_Pulse_on_EPWMxSYNCIN);


    ePWM_enablePhaseShiftLoad(myEPWM2_base);
    ePWM_enablePhaseShiftLoad(myEPWM3_base);


    //
    //启用与PWM的同步和时钟
    //
    sysctl_enablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);


    //
    //启用ePWM中断
    //
    INTERRUL_ENABLE (INT_EPWM1);
    INTERRUL_ENABLE (INT_EPWM2);
    中断启用(INT_EPWM3);


    //
    //设置每次TBCLK =0时发生的中断
    //
    ePWM_setInterruptEventCount (myEPWM1_BASE,1U);
    ePWM_setInterruptEventCount (myEPWM2_BASE,1U);
    ePWM_setInterruptEventCount (myEPWM3_BASE,1U);

    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    //
    //空闲循环。 只需坐下来永远循环(可选):
    //
    对于(;;)

    NOP;
    }
    }

    //
    // epwm1ISR - ePWM 1 ISR
    //
    __interrupt void epwm1ISR(void)

    //
    //更新CMPA和CMBB值
    //
    更新比较(&epwm1Info);

    //
    //清除此计时器的INT标志
    //
    ePWM_clearEventTriggerInterruptFlag (myEPWM1_base);

    //
    //确认中断组
    //
    interrupT_clearACKGroup(interrupT_ACK_Group3);
    }

    //
    // epwm2ISR - ePWM 2 ISR
    //
    __interrupt void epwm2ISR(void)

    //
    //更新CMPA和CMBB值
    //
    更新比较(&epwm2Info);

    //
    //清除此计时器的INT标志
    //
    ePWM_clearEventTriggerInterruptFlag (myEPWM2_base);

    //
    //确认中断组
    //
    interrupT_clearACKGroup(interrupT_ACK_Group3);
    }

    //
    // epwm3ISR - ePWM 3 ISR
    //
    __interrupt void epwm3ISR(void)

    //
    //更新CMPA和CMBB值
    //
    更新比较(&epwm3Info);

    //
    //清除此计时器的INT标志
    //
    ePWM_clearEventTriggerInterruptFlag (myEPWM3_base);

    //
    //确认中断组
    //
    interrupT_clearACKGroup(interrupT_ACK_Group3);
    }

    //
    // initEPWM1 -配置ePWM1
    //
    void initEPWM1()

    epwm1Info.epwmCompADirection = ePWM_CMP_UP;
    epwm1Info.epwmTimerIntCount = 0U;
    epwm1Info.epwmModule = myEPWM1_base;
    epwm1Info.epwmMaxCompA = EPWM1_MAX_CMPA;

    }

    //
    // initEPWM2 -配置ePWM2
    //
    void initEPWM2()

    epwm2Info.epwmCompADirection = ePWM_CMP_UP;
    epwm2Info.epwmTimerIntCount = 0U;
    epwm2Info.epwmModule = myEPWM2_base;
    epwm2Info.epwmMaxCompA = EPWM2_MAX_CMPA;
    }

    //
    // initEPWM3 -配置ePWM3
    //
    void initEPWM3(void)

    epwm3Info.epwmCompADirection = ePWM_CMP_UP;
    epwm3Info.epwmTimerIntCount = 0U;
    epwm3Info.epwmModule = myEPWM3_base;
    epwm3Info.epwmMaxCompA = EPWM3_MAX_CMPA;
    }

    //
    // updateCompare -用于更新频率的功能
    //
    void updateCompare(epwmInformation *epwmInfo)

    UINT16_t compAValue;

    //
    //浮动电压被用作电源,因此我们有一个0.5 占空比代表交流0伏
    //
    float32_t theta[36]={0.5 ,0.58.9278万 ,0.67.5687万 ,0.75.6449万 ,0.82.8969万 , 0.89.0915万 ,
    0.94.0297万 ,0.97.5528万 ,0.99.5475万 ,0.99.9497万 ,0.98.7464万 , 0.95.9765万 ,
    0.91.7288万 ,0.86.1399万 ,0.79.3895万 ,0.71.6945万 ,0.63.3022万 , 0.54.4823万 ,0.49.9497万 ,
    0.49.5475万 ,0.47.5528万 ,0.44.0297万 ,0.39.0915万 ,0.32.8969万 , 0.25.6449万 ,0.17.5687万 ,
    0.89.2783万 ,0,0.4.4823万 ,0.13.3022万 ,0.21.6945万 , 0.29.3895万 ,0.36.1399万 ,0.41.7288万 ,
    0.45.9765万 ,0.48.7464万 };
    UINT16_t计数= 0U;

    compAValue = ePWM_getCounterCompareValue(epwmInfo->epwmModule,
    ePWM_counter_compare_a);

    //
    //增加CMPA直到达到最大CMPA,更新占空比,增加正弦值计数器
    //


    IF (compAValue == EPWM1_MAX_CMPA)

    ePWM_setCounterCompareValue(epwmInfo->epwmModule,
    ePWM_counter_compare_A,
    EPWM1_MAX_CMPA*thet[COUNT]);
    COUNT++;
    IF (计数= 36)

    计数= 0;
    }
    compAValue = 0U;
    }

    compAValue++;


    }

    感谢您的所有帮助,

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I还有110.1021万还有一些28.0049万一些令408.3126万令我408.3126万我困惑的事情: ePWMCLK默认设置为10MHz吗? 我在数据表和用户手册中看到它可以是许多值,但我假设这都是使用时钟分频器,所以如果我选择HSPCLKDIV = 4和CLKDIV = 1, TBCLK将是2.5 MHz?  [/引述]

    取决于您使用的时钟源。 对于默认设置,您可以检查可用在main.c下的Device_Init()函数,也可以直接检查device.c和.h文件。 如果在您的情况下EPWMCLK为10MHz,则您所做的设置是正确的,即TBCLK将为2.5MHz。 (对于F2.8004万x,默认SYSCLK/EPWMCLK频率应为100MHz,这应使TBCLK具有提及的分频器时为25MHz)

    在跳至相移部分之前,您是否能够验证您是否获得了所需的输出频率?

    相位转换流程几乎就是您所做的。 除了您可能需要根据SYSCLK验证TBPRD值之外,我在计算中没有看到任何错误。 如果SYSCLK为100MHz (默认值),则TBPRD将显示为~1736,您的计算将根据其进行更改。

    此外,正如Marlyn前面指出的,这里提供了一个关于设置TBPRD和TBPHS值的视频指南: C2000 增强脉宽调制器(ePWM):时基子模块| TI.com视频

    我建议你来一次。

    谢谢!

    Aditya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Aditya:

    我观看了培训视频,它对计算TBPRD和TBPHS值非常有帮助。 我使用.c程序文件和sysconfig GUI中的功能设置这两个功能(请告诉我这是否是好的做法)。 确认设备默认设置为在SYSCLK上以100 MHz运行后,我将ePWMx_Timer_TBPRD的相应值更新为1735。 我删除了相移的代码和GUI设置,以便首先重点获取所需的PWM频率,但仍在示波器上读取50 % 占空比和4kHz频率的~1秒脉冲, 然后在1秒脉冲后保持恒定的高输出电压。 出于某种原因,即使在去除相位移之后,EPWM3输出仍会导出大约69 usec。  

    谢谢!

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我408.3359万我设置了使用我的.c程序文件中的函数和GUI (如果是好的话,请告诉我)。

    不需要,Matthew。 sysconfig配置在主文件中使用Board_Init()函数调用。 如果在主代码中再次写入,它将覆盖sysconfig文件中的内容。 仅在一个实例上配置,最好在sysconfig GUI中配置以避免任何错误。

    对于代码方面,我建议您从C2000Ware_XX_XX/driverlib/f28004x/examples/ePWM --2.8004万 -- ePWM_ex13_UP_AQ中的可用示例开始进行计数配置。 您可以根据需要修改TBPRD。 这将是解决您的问题的更简单的方法。 您可以稍后将您的代码与TI提供的软件进行比较,以检查您的代码中是否存在任何错误。

    谢谢!
    Aditya