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.

[参考译文] TMS320F280049C:多个 CMPSS 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/915215/tms320f280049c-multiple-cmpss-issue

器件型号:TMS320F280049C

您好!

对于280049、我们需要监控多个模拟输入、以便使用比较器对 ePWM 进行三角测量。

例如、我们从2个比较器(1和3)开始、然后设置7。

我们所面对的问题是:

CMPSS1工作正常、并对 ePWM 进行 TRIG

CMPSS1未启用时、CMPSS3工作正常、它会触发 ePWM 和外部 IO

只要我启用 CMPSS1、CMPSS3就不再工作。

我已经加入了2个初始化代码段,但在 CMPSS1中看不到哪些指令可能会阻塞 CMPSS3?

此致

Francois  

空 Comp1Init (空)

//! 初始化输出电压比较器。
//!
//! \param 无。
//!
//! CMPSS1
//!
//! 返回0无。
EALLOW;
CpuSysRegs.PCLKCR14.bit.CMPSS1 = 1;/* 1:模块时钟被打开。 *
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;/* 1比较器/DAC 被启用*
/*比较器高电平*/
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 0;/* 0由内部 DAC 驱动的比较器的反相输入*
Cmpss1Regs.COMPDACCTL.bit.SELREF = 0;/* 0 VDDA 是 DAC 的电压基准*
Cmpss1Regs.DACHVALS.bit.DACVAL = 2048;//3560;
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 0;/* 0异步比较器输出驱动 CTRIPH */
//Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;/* 0异步比较器输出驱动 CTRIPOUTH *
/*输入高电平= A2 */
AnalogSubsysRegs.CMPHPMXSEL.bit.CMP1HPMXSEL = 0;// 0:A2 High Positive *
/* EPwmA 上的触发区*/
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;//将 TRIP4配置为 CTRIP1H */
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;// 1:启用 Mux0的相应输出以驱动 ePWM-XBAR 的 TRIP4 */
EDIS;

空 COMP3Init (空)

//! 初始化输出电压比较器。
//!
//! \param 无。
//!
//! CMPSS3
//!
//! 返回0无。
EALLOW;
CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1;// 1:模块时钟被打开。 *
Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;/* 1比较器/DAC 被启用*
/*比较器高电平*/
Cmpss3Regs.COMPCTL.bit.COMPHSOURCE = 0;/* 0由内部 DAC 驱动的比较器的反相输入*
Cmpss3Regs.COMPDACCTL.bit.SELREF = 0;/* 0 VDDA 是 DAC 的电压基准*
Cmpss3Regs.DACHVALS.bit.DACVAL = 2048;//3560;
Cmpss3Regs.COMPCTL.bit.CTRIPHSEL = 0;/* 0异步比较器输出驱动 CTRIPH */
Cmpss3Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;/* 0异步比较器输出驱动 CTRIPOUTH *
/*输入高电平= B3 */
AnalogSubsysRegs.CMPHPLXSEL.bit.CMP3HPMXSEL = 3;// 3:B3为高电平正数*/
/* EPwmA 上的触发区*/
EPwmXbarRegs.TRIP7MUX0TO15CFG.bit.MUX4 = 0;//将 TRIP7配置为 CTRIP3H */
EPwmXbarRegs.TRIP7MUXENABLE.BIT.MUX4 = 1;// 1:启用 Mux0的相应输出以驱动 ePWM-XBAR 的 TRIP7 */
/*到引脚的输出*/
OutputXbarRegs.OUTPUT5MUX0TO15CFG.bit.MUX4 = 0;/* 00:为 Mux0选择.0输入*/
OutputXbarRegs.OUTPUT5MUXENABLE.BIT.MUX4 = 1;/* 1:启用 Mux0的相应输出以驱动 OUTPUT5的 OUTPUT5输出- XBAR *
GpioCtrlRegs.GPADIR.bit.GPIO28 = 1;/* 1:引脚为输出*/
GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 1;
EDIS;

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

    当您说"CMPSS3不再工作"时、GPIO28上的输出和 PWM 跳闸是否都停止工作、或者它只是一个还是另一个? COMPSTS 寄存器是否显示正确的状态? 您能详细说明吗?

    代码中没有任何内容会对我产生影响。 您是否介意分享 PWM 配置中与跳闸配置相关的部分?

    惠特尼

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

    您好、Whitney、

    感谢您处理我们的问题。

    当 CMPSS3是单独的时、GPIO28和 ePWM 一起跳闸

    进一步了解您的信息,我在不使用和使用 Comp1Init()的情况下做了一些实验。

    <或>是比较器条件

               1  3 COMPSTS1 COMPSTS3 GPIO28 ePWM  

    CMPSS1置1  
               <  0x0300      0x0000      0      好的
               > < 0x0303      0x0000      0      否
               < > 0x0302       0x0000      0      好的
               >  0x0303      0x0000      0      否
    删除了 CMPSS1  
               <  0x0000       0x0300     0       好的
               > < 0x0000       0x0300     0       好的
               < > 0x0000       0x0303     1       否
    这是代码的一部分(仅适用于 ePWM 中的 TZ)
    (我们同时停止6个 ePWM、以便对 init 进行索引)
    /*跳匣区域寄存器(TZ)*/
    EPwmRegs[n].TZCTL.bit.TZA = 2;                   /* 10:强制 EPWMxA 进入低电平状态*/
    EPwmRegs[n].TZFRC.bit.OST = 1;                   /* 1:强制执行单次触发事件并设置 TZFLG[OST]位。 *
    CMPss 上的/*跳闸区域*/
    EPwmRegs[n].DCTRIPSEL.bit.DCAHCOMPSEL = 0x0F;    /* 1111:跳闸组合输入(由 DCAHTRIPSEL 寄存器选择的所有跳闸输入或一起进行)*/
    EPwmRegs[n].DCAHTRIPSEL.bit.TRIPINPUT4 = 1;      // 1:选择 TRIP 输入4作为 DCAH 多路复用器的组合 ORed 输入*/
    EPwmRegs[n].DCAHTRIPSEL.bit.TRIPINPUT7 = 1;      // 1:选择 TRIP 输入7作为 DCAH 多路复用器的组合 ORed 输入*/
    EPwmRegs[n].TZDCSEL.bit.DCAEVT1 = 2;               //数字比较输出 A 事件1选择010:DCAH =高电平、DCAL =无关*/
    EPwmRegs[n].DCACTL.bit.EVT1SRCSEL = 0;             /* 0:源为 DCAEVT1信号*
    EPwmRegs[n].DCACTL.bit.EVT1FRCSYNCSEL = 1;         /* 1:源通过异步*/
    EPwmRegs[n].TZSEL.bit.DCAEVT1 = 1;                 /* 1:启用 DCBEVT1作为此 ePWM 模块的单触发源。 *
    EDIS;
    此致、
    Francois
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Francois:

    为了进行调试、现在我们尝试隔离比较器和 ePWM 连接、只关注比较器。 如果您只将 CMPSS1和 CMPSS3路由到输出 XBAR、它们在一起单独初始化时是否按预期工作?

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

    您好 Frank、

    感谢您的回复。 我已经对比较器进行了更多调查、但我更愿意听取您的意见?

    我在打开时钟和配置之间增加了一个小延迟、现在正在工作。

    下面是我添加的内容、现在 CMPSS 似乎已正确初始化。

    空 COMP3Init (空)

    //! 初始化输出电压比较器。
    //!
    //! \param 无。
    //!
    //! CMPSS3
    //!
    //! 返回0无。
    uchar i;
    EALLOW;
    CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1;              // 1:模块时钟被打开。 *
    I = 0;
    操作
     I ++;
    while (i!= 0);
    Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    /*比较器高电平*/
    Cmpss3Regs.COMPCTL.bit.COMPHSOURCE = 0;          /* 0由内部 DAC 驱动的比较器的反相输入*
    Cmpss3Regs.COMPDACCTL.bit.SELREF = 0;            /* 0 VDDA 是 DAC 的电压基准*
    Cmpss3Regs.DACHVALS.bit.DACVAL = 2048;//DataFlash.VOutMax * VOUTGAIN;
    Cmpss3Regs.COMPCTL.bit.CTRIPHSEL = 0;            /* 0异步比较器输出驱动 CTRIPH */
    Cmpss3Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;         /* 0异步比较器输出驱动 CTRIPOUTH *
    /*输入高电平= B3 */
    AnalogSubsysRegs.CMPHPLXSEL.bit.CMP3HPMXSEL = 3; // 3:B3为高电平正数*/
    /* EPwmA 上的触发区*/
    EPwmXbarRegs.TRIP7MUX0TO15CFG.bit.MUX4 = 0;      //将 TRIP5配置为 CTRIP3H */
    EPwmXbarRegs.TRIP7MUXENABLE.BIT.MUX4 = 1;        // 1:启用 Mux0的相应输出以驱动 ePWM-XBAR 的 TRIP5 */
    /*到引脚的输出*/
    OutputXbarRegs.OUTPUT5MUX0TO15CFG.bit.MUX4 = 0;  /* 00:为 Mux0选择.0输入*/
    OutputXbarRegs.OUTPUT5MUXENABLE.BIT.MUX4 = 1;    /* 1:启用 Mux0的相应输出以驱动 OUTPUT5的 OUTPUT5输出- XBAR *
    //GpioDataRegs.GPASET.bit.GPIO28 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO28 = 1;              /* 1:引脚为输出*/
    GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 1;
    EDIS;
    }  

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

    尊敬的 Francois:

    我很高兴您找到了权变措施、但解决方案有点奇怪。 我从未见过这种情况。 我想知道它是否与 PCLKCR14的读取-修改-写入有关、因为它包含所有 CMPSS 的时钟开启。 如果可以、请尝试下面的几个实验、以便我们能够弄清发生了什么。

    1.如果您在启用 CMPSS1和 CMPSS3后立即返回原始代码、您能否检查两个 CMPSS 的 COMPDACE 位以查看它们是否确实设置为1?

    2.要确认这不是读-修改-写问题、在使用 PCLKR14启用 CMPSS1和 CMPSS3时、而不是使用 CpuSysRegs.PCLKCR14.bit.CMPSS1和 CpuSYSRegs.PCLKCR14.bit.CMPSS3时、请使用 CpuSysRegs.PCLKCR14.PCKCR14.all。 在 CMPSS1配置代码中、写入一个只开启 CMPSS1的值。 在 CMPSS3代码中、将其写入一个同时打开 CMPSS1和 CMPSS3的值。

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

    您好、Frank、

    根据您的建议,我已经测试了以下内容:

    1)  

    删除我的权变措施

    当我初始化两个 CMPSS (1然后是3)时、3不起作用

    PCLK14 = 0x0000 0005 (两个 CMPSS 都计时)

     Cmpss1Regs.COMPCTL.COMPDACE = 1 ->确定

     Cmpss3Regs.COMPCTL.COMPDACE = 0 ->错误(这就是问题所在)

    2)

    删除我的权变措施

    将 CpuSysRegs.PCLKCR14.ALL = 0x0001;置于 COMP1Init()中

    将 CpuSysRegs.PCLKCR14.ALL = 0x0005;置于 Comp3Init()中

    PCLK14 = 0x0000 0005 (两个 CMPSS 都计时)

    Cmpss1Regs.COMPCTL.COMPDACE = 1 ->确定

     Cmpss3Regs.COMPCTL.COMPDACE = 0 ->错误

    我认为问题是时钟稳定问题、如果我与调试器分步执行程序、那么就可以了。

    此致

    Francois

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

    尊敬的 Francois:

    感谢您执行附加调试。 是的、您是对的、这看起来像是时钟延迟问题。 这种行为是意外的。 即使在配置模块之前存在时钟延迟、我也希望 CMPSS1和 CMPSS3都需要相同的延迟、但根据您的分析、CMPSS1不需要延迟、而 CMPSS3需要延迟。

    如果您不介意、可以再运行一个实验吗? 我想确认哪个 CMPSS 表现出该行为。 是否可以对所有7个 CMPSS 重复相同的实验? 打开每个 CMPSS 的时钟、写入 COMPDACE 并检查是否设置为1。

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

    您好 Frank、

    我已经完成了以下操作,这里的结果是:

    EALLOW;
    CpuSysRegs.PCLKCR14.bit.CMPSS1 = 1;              /* 1:模块时钟被打开。 *
    Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    //CpuSysRegs.PCLKCR14.bit.CMPSS2 = 1;              // 1:模块时钟被打开。 *
    //Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1;              // 1:模块时钟被打开。 *
    Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    //CpuSysRegs.PCLKCR14.bit.CMPSS4 = 1;              // 1:模块时钟被打开。 *
    //Cmpss4Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 启用*
    //CpuSysRegs.PCLKCR14.bit.CMPSS5 = 1;              // 1:模块时钟被打开。 *
    //Cmpss5Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 启用*
    //CpuSysRegs.PCLKCR14.bit.CMPSS6 = 1;              // 1:模块时钟被打开。 *
    //Cmpss6Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 启用*
    //CpuSysRegs.PCLKCR14.bit.CMPSS7 = 1;              // 1:模块时钟被打开。 *
    //Cmpss7Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 启用*
    EDIS;
    -> CMPSS3未启用(这确认了我们的原始问题)
    EALLOW;
    CpuSysRegs.PCLKCR14.bit.CMPSS1 = 1;              /* 1:模块时钟被打开。 *
    Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS2 = 1;              // 1:模块时钟被打开。 *
    Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1;              // 1:模块时钟被打开。 *
    Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS4 = 1;              // 1:模块时钟被打开。 *
    Cmpss4Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS5 = 1;              /* 1:模块时钟被打开。 *
    Cmpss5Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS6 = 1;              /* 1:模块时钟被打开。 *
    Cmpss6Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS7 = 1;              // 1:模块时钟被打开。 *
    Cmpss7Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    EDIS;
    -> CMPSS7未启用
    EALLOW;
    CpuSysRegs.PCLKCR14.bit.CMPSS1 = 1;              /* 1:模块时钟被打开。 *
    Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS2 = 1;              // 1:模块时钟被打开。 *
    Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1;              // 1:模块时钟被打开。 *
    Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS4 = 1;              // 1:模块时钟被打开。 *
    Cmpss4Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS5 = 1;              /* 1:模块时钟被打开。 *
    Cmpss5Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    CpuSysRegs.PCLKCR14.bit.CMPSS6 = 1;              /* 1:模块时钟被打开。 *
    Cmpss6Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 被启用*
    //CpuSysRegs.PCLKCR14.bit.CMPSS7 = 1;              // 1:模块时钟被打开。 *
    //Cmpss7Regs.COMPCTL.bit.COMPDACE = 1;             /* 1比较器/DAC 启用*
    EDIS;
    -> CMPSS6非使能
    最后一个初始化的比较器似乎未正确完成。
    此致
    Francois
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Francois:

    感谢您进行额外的调试。 这很有意思。 让我进行一些本地调查、然后返回给您。 预计下周周二会收到回复。

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

    尊敬的 Francois:

    事实证明、此问题已在本地确定、受影响的器件已更新了反映此问题的文档。 F28004x 器件错过了此更新。 正如您正确识别的那样、在模块寄存器可以被写入之前、启用到模块的时钟需要一个延迟。 此延迟为5 NOP。 我已提交一个 TT、以将此备注添加到 F28005750的 TRM 中。 很抱歉给您带来不便。

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

    您好 Frank、

    感谢您确认5 nop 后、我将在所有比较器初始化中实施您的解决方案。

    最好的平地机

    Francois