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.

[参考译文] CCS/TMS320F2808:F2808

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/678388/ccs-tms320f2808-f2808

器件型号:TMS320F2808

工具/软件:Code Composer Studio

我正在尝试创建一个脉冲序列。 脉冲序列的跨度为1ms。 单个脉冲的时间周期为100 μ s。 我正在使用 timer0来生成 ePWM1的 CMPA 值。 代码如下所示

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#include "DSP280x_Device.h"
#include "DSP280x_examples.h"

int i=0;

typedef 结构

volatile struct ePWM_regs * EPwmRegHandle;
}ePWM_INFO;


void InitEPwm1Examples(void);

_interrupt void CPU_timer0_ISR (void);

void main (void)

InitSysCtrl();

InitEPwm1Gpio();

Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;
PieVectTable.TINT0 =&CPU_timer0_ISR;
EDIS;

InitCpuTimer();

ConfigCpuTimer (&CpuTimer0、100、1000);\\时钟频率1kHz
CpuTimer0Regs.TCR.ALL = 0x4000;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

InitEPwm1Examples();

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

IER |= M_INT3;
IER |= M_INT1;

PieCtrlRegs.PIEIER1.bit.INTx7=1;

EINT;
ERTM;

for (;;)

_asm ("NOP");

_interrupt void CPU_timer0_ISR (void)

如果(i<1)

EPwm1Regs.CMPA.half.CMPA = 2110;

其他

EPwm1Regs.CMPA.half.CMPA = 0;

i=i+1;
if (i>19)

I=0;

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

空 InitEPwm1Examples()


EPwm1Regs.TBPRD = 2500;\\ PWM 频率10kHz
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;


EPwm1Regs.CMPA.half.CMPA = 0;


EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;



EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

会发生一个特殊情况。 由于我的脉冲序列跨度为1msec、一个脉冲为100usec、因此我在1msec 内总共有10个脉冲。 由于我在这1ms 内具有恒定的 CMPA 值、因此脉宽应该相同、但最后一个脉冲的第10个脉冲具有100%占空比。 我不希望 PWM 中断更改 CMPA 值我有目的地希望计时器中断更改 CMPA 值。 有人可以帮助我解决这个问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些是低电平有效脉冲、对吧? 您似乎要做的是强制将 CAU、CAD 和影子更新全部更新到零匹配事件上。 为什么不单独保留 CMPA、只需将 CAU 更改为 AQ_SET 即可禁用脉冲?
    另外,在我看来,从 CMPA 设置中,您应该得到15.6us 的脉冲宽度,因为(2500 - 2110)*2 = 780,100*780/5000 = 15.6%的占空比。
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好 Richard。 感谢您的回复。 您更改动作限定符位的想法非常好。 实际上、该程序是较大程序的一部分。 它基本上是一个逆变器程序。 我必须在每1ms 创建一个每1ms 的脉冲序列后不断改变 CMPA 值。

    对于我上面给出的计划、不是84%的占空比。 清除递增计数比较匹配并设置递减计数比较匹配、这意味着脉冲在大多数时间都保持高电平、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、没错。 如果您将其称为高电平有效信号、则占空比为84%。 很高兴 AQ 建议帮助了我们。
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是我的原生。

    假设20ms 为1个周期。
    将此20msec 分为20个1 msec 的分部。
    在这20个师中,1个师必须有一个训练脉冲。
    每个脉冲的频率为10kHz、占空比应为84%。
    由于每个脉冲的频率为10kHz、因此脉冲序列中必须有10个脉冲、所有脉冲的宽度应为84%

    我的问题是前9个脉冲宽度为84%、最后一个脉冲宽度为100%。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、不涉及 CMPA、而只是更改计时器 ISR 中的 AQ 设置、什么也没有改变?

    当我读取您的代码时、您应该会在 PWM 零匹配之前获得一个计时器中断。 原因是您在启动 PWM 计时器之前启动 CPU 计时器、因此存在较小的滞后。 我想知道这种滞后是否不够、因此、到您的定时器 ISR 完成其上下文保存时、PWM 零事件已经通过。 您可以尝试在启动 PWM 计时器之前插入一个小延迟(例如100个周期左右)。

    有更好更简单的方法来调制脉冲序列。 困难是尝试匹配两个独立计数器之间的时序。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有办法使用 PWM 中断代替计时器中断每1ms 发生一次? 我以10kHz 的频率运行 PWM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以将任何未使用的 PWM 模块配置为用作1ms 中断计时器。 在 SYSCLK/2设置和向上计数模式下、您可以将 TBPRD 设置为5000。

    您的10kHz 和1ms 数字是固定的、还是要更改这些数字? 如果不是、我在上一篇文章中得到的结果是、您最好是从 PWM 周期中断执行一切操作。

    此致、

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

     您好!

    我的10kHz 和1msec 是固定的。  我唯一不理解的是为什么脉冲序列中10个脉冲中的一个脉冲具有不同的占空比。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否布置 PWM 设置和中断代码? 我很高兴能来看看。

    此致、

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

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


    #include "DSP280x_Device.h"
    #include "DSP280x_examples.h"

    int i=0;

    typedef 结构

    volatile struct ePWM_regs * EPwmRegHandle;
    }ePWM_INFO;

    void InitEPwm1Examples(void);

    _interrupt void CPU_timer0_ISR (void);

    void main (void)


    InitSysCtrl();

    InitEPwm1Gpio();

    Dint;

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;
    PieVectTable.TINT0 =&CPU_timer0_ISR;
    EDIS;

    InitCpuTimer();

    ConfigCpuTimer (&CpuTimer0、100、1000);\\时钟频率1kHz
    CpuTimer0Regs.TCR.ALL = 0x4000;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;

    InitEPwm1Examples();

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;

    IER |= M_INT3;
    IER |= M_INT1;

    PieCtrlRegs.PIEIER1.bit.INTx7=1;

    EINT;
    ERTM;

    for (;;)

    _asm ("NOP");



    _interrupt void CPU_timer0_ISR (void)


    如果(i<1)

    EPwm1Regs.CMPA.half.CMPA = 1125;

    其他

    EPwm1Regs.CMPA.half.CMPA = 0;


    i=i+1;
    if (i>19)

    I=0;


    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    空 InitEPwm1Examples()


    EPwm1Regs.TBPRD = 2500;\\ PWM 频率10kHz
    EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm1Regs.TBCTR = 0x0000;


    EPwm1Regs.CMPA.half.CMPA = 0;


    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;



    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;


    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除了 CMPA 设置之外、该代码看起来与您在第一个帖子中的代码相同。 然而、您说您在最后一个脉冲中获得100%占空比、在这里它被截断。 是这样吗?

    您是否尝试过上述 PWM 中断方法?

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    指定 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;修复了问题。 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很开心 很高兴知道问题已解决。 感谢您的介绍。

    此致、

    Richard