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.

[参考译文] TMS320F28374D:使用数字比较子模块的 DCCAP 来测量模拟比较器生成的 Ton

Guru**** 2430380 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/822372/tms320f28374d-using-the-dccap-of-the-digital-compare-submodule-to-measure-the-ton-generated-by-analog-comparator

器件型号:TMS320F28374D

晚上好。

我想使用该 PWM 数字比较器的 DCCAP 寄存器测量由模拟比较器生成的 Ton 周期、该比较器由 PWM 的 CRT=0事件复位。

问题是对捕获控制逻辑的描述不清楚、并且尝试配置所有路径非常困难。 实际上我尝试过、但我没有成功。

在下面、有我使用的代码:

//比较器配置

EALLOW;
CpuSysRegs.PCLKCR14.ALL |= 1.
Cmpss2Regs.COMPCTL.bit.COMPHSOURCE = 0;
Cmpss2Regs.COMPCTL.bit.COMPHINV = 0;
Cmpss2Regs.COMPCTL.bit.CTRIPHSEL = 3;
Cmpss2Regs.COMPCTL.bit.CTRIPOUTHSEL = 3;
Cmpss2Regs.COMPCTL.bit.ASYNCHEN = 0;
Cmpss2Regs.COMPCTL.bit.COMPLSOURCE = 0;
Cmpss2Regs.COMPCTL.bit.COMPLINV = 0;
Cmpss2Regs.COMPCTL.bit.CTRIPLSEL = 0;
Cmpss2Regs.COMPCTL.bit.CTRIPOUTLSEL = 0;
Cmpss2Regs.COMPCTL.bit.ASYNCLEN = 0;
Cmpss2Regs.COMPHYSCTL.bit.COMPHYS = 2;
Cmpss2Regs.COMPSTSCLR.bit.HSYNCCLREN = 1;
Cmpss2Regs.COMPDACCTL.bit.DACSOURCE = 1;
Cmpss2Regs.COMPDACCTL.bit.RAMPSOURCE = 1;
Cmpss2Regs.COMPDACCTL.bit.SELREF = 1;
Cmpss2Regs.COMPDACCTL.bit.RAMPLOADSEL = 0;
Cmpss2Regs.COMPDACCTL.bit.SWLOADSEL = 1;
Cmpss2Regs.COMPDACCTL.bit.FREESOFT = 0;
cmps2Regs.RAMPMAXREFS = 0;
cmps2Regs.RAMPDECVALS = 0;
cmps2Regs.RAMPDLYS.bit.delay = 0;
Cmpss2Regs.CTRIPLFILCTL.bit.SAMPWIN = 0;
cmps2Regs.CTRIPLFILCTL.bit.THRESH = 1;
Cmpss2Regs.CTRIPLFILCTL.bit.FILINIT = 0;
Cmpss2Regs.CTRIPLFILCLKCTL.bit.CLKPRESCALE = 0;
Cmpss2Regs.CTRIPHFILCTL.bit.SAMPWIN = 31;
cmps2Regs.CTRIPHFILCTL.bit.THRESH = 19;
cmps2Regs.CTRIPHFILCTL.bit.FILINIT = 0;
Cmpss2Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE = 0;
Cmpss2Regs.COMPLOCK.bit.COMPCTL = 0;
Cmpss2Regs.COMPLOCK.bit.COMPHYSCTL = 0;
Cmpss2Regs.COMPLOCK.bit.DACCTL = 0;
Cmpss2Regs.COMPLOCK.bit.CTRIP = 0;
Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;
EDIS;

/* CMPSS 模块 PWM Xbar 激活:CMPSS 全部配置*/
EALLOW;
EPwmXbarRegs.TRIP5MUX0TO15CFG.bit.MUX2 = 0;//选择 CMPSS2.CTRIPH 传递到 TRIP 5 *
EPwmXbarRegs.TRIP5MUXENABLE.BIT.MUX2 = 1;//启用 MUX2使 CMPSS2.CTRIPH 跳闸5 *
EDIS;

//ePWM

EALLOW;

EPwm2Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;/* DCAEVT1 = DCAH 高电平、禁用 DCAL *
EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = e_DC_TRIPIN5;// DCAH = TRIPIN5 *
EPwm2Regs.DCFCTL.bit.SRCSEL = 0;/*滤波器块信号源为 DCAEVT1信号*
EPwm2Regs.DCFCTL.bit.Blanke = 1;//启用消隐窗口
EPwm2Regs.DCFCTL.bit.BLANKINV = 0;/*消隐窗口未反转*
EPwm2Regs.DCFCTL.bit.PULSESEL = 1;//针对消隐和捕捉对齐的脉冲选择 TBCTR = 0x00 *
EPwm2Regs.DCCAPCTL.bit.Cape = 1;/* TBCTR 计数器捕获禁用*
EPwm2Regs.DCCAPCTL.BIT.SHDWMODE = 1;//禁用影子模式
EPwm2Regs.DCCAPCTL.bit.CAPMODE = 0;/*无锁存器*
EPwm2Regs.DCFOFFSET = 0;//消隐窗口偏移量*
EPwm2Regs.DCFWINDOW=0;/*消隐窗口宽度*/
EPwm2Regs.DCAHTRIPSEL.ALL = 0;//未选择跳闸输入作为组合或输入*/
EPwm2Regs.DCALTRIPSEL.ALL = 0;/*未选择 TRIP 输入作为组合或输入*/
EPwm2Regs.DCBHTRIPSEL.ALL = 0;//未选择跳闸输入作为组合或输入*/
EPwm2Regs.DCBLTRIPSEL.ALL = 0;//未选择任何跳闸输入作为组合或输入*/
EPwm2Regs.HRPCTL.bit.PWMSYNCSEL = 1;/* PWMSYNC 源选择位:PWMSYNC = CNT_ZERO 信号脉冲。 此同步由 COMP*/使用

EDIS;

寄存  器 EPwm2Regs.DCCAP 似乎始终采样1、即使比较器正在切换(从低到高)@ Ton 更大。

请告诉我错误在哪里?

如果消隐被禁用(实际上我不需要消隐来测量 Ton)、图中"与"门的输入始终为1还是始终为0?

提前感谢您。

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

    在深入了解您的代码之前、您能否查看以下一些示例:

    http://dev.ti.com/tirex/explore/node?node=AJqO-DYwVOofrmrPQV4gyA__gYkahfz__LATEST

    http://dev.ti.com/tirex/explore/node?node=AB9m03DF0grymWU.0tPGcQ__gYkahfz__LATEST

    http://dev.ti.com/tirex/explore/node?node=AGa9FSTOtL0wK250qblPLw__gYkahfz__LATEST

    http://dev.ti.com/tirex/explore/node?node=AIdZiwaMCkU2xfxI6NktNg__gYkahfz__LATEST

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

    Nima 早上好

    感谢您的建议。 实际上、我控制这些示例、但没有一个示例使用数字比较子模块的 DCCAP 寄存器来捕获基于 DCEVTFILT 的 PWM 时间。 我的问题是如何解决这个问题。

    从手册中可以看到大量信号进入捕获控制逻辑、但不清楚它们是如何触发捕获操作的。

    如果您有一个使用 DCCAP 寄存器捕获 PWM 时基的示例、请告诉我。

    非常感谢、

    Andrea Marcianesi。

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

    我将专门为此研究一个示例。 在 f28379d launchpad 上测试代码后、我将为您发布代码

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

    您好!

    NIMA,很棒!!!!

    非常感谢。

    此致、

    Andrea。

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

    下面是 DCCAP DCCAPCTL 的一个示例。

    EPWM1设置为:

    TBPRD = 12000

    TB 计数器模式=向上/向下

    CHA:当存在直流事件(DCAEVT)时、TZ 强制其为低电平

    CHB:TZ 在消隐窗口(TBCTR=6000)后使用 DCBEVT (由 DCFILT 提供)将其强制为低电平

    DCFILT 会传递到 DCCAP 模块、以便在跳闸发生时进行捕获。 显然、没有小于6000的值、因为消隐窗口会阻止信号。

    跳闸信号来自 GPIO 25、该 GPIO 为高电平、TBCTR 递增计数除外、并且介于1000 <CTR<7000. 之间

    以下是结果和代码:

    //########################################################################################################################
    //
    ////文件:ePWM_ex11_digited_compare_event_capture_counter.c
    //
    //标题:ePWM 使用带
    //的数字比较子模块 事件滤波器(消隐窗口)和 DCCAP
    // (计数器捕捉模块)。
    //
    //! \addtogroup driver_example_list
    //! 

    ePWM 数字比较事件滤波器计数器捕捉

    //! //! 此示例将 ePWM1配置为以下 //! - ePWM1、DCAEVT1强制 ePWM 输出为低电平 //! - GPIO25被用作输入 XBAR Input1的输入 //! - Input1 (来自输入 XBAR)用作 DCAEVT1 // ! //! -具有 DCBEVT1的 ePWM1强制 ePWM 输出为低电平 //! - GPIO25被用作输入 XBAR Input1的输入 //! - Input1 (来自输入 XBAR)用作 DCAEVT1 // ! - GPIO25被设定为输出模式并且将在特定的时序// ! - DCBEVT1使用经过滤波的 DCBEVT1 //! - DCFILT 信号使用消隐窗口忽略 DCBEVT1 //! 直流消隐窗口持续时间 //! - DCCAP 模块将捕获 DCFILT 事件的发生时间 //! //! b 外部连接\n //! - GPIO0 EPWM1A //! - GPIO1 EPWM1B //! - GPIO25 TRIPIN1、GPIO 输出 //! //! b 监视\b 变量\n //! -无。 // // //////////############################################################################################################################ //$TI 发行版:F2837xD 支持库 v3.06.00.00 $ //$发行 日期:星期一5月27日06:48:24 CDT 2019 $ //版权所有: //版权所有(C) 2013-2019德州仪器(TI)公司- http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "driverlib.h" #include "device.h" // Globals // uint32_t epwm1TZIntCount; volatile uint16_t epwm1DCCAPCount; // 函数原型 // initEPWM1 (void);inituint16_t epwm1DCCpu;void ( intrpio ) interrupt (void);_ interrupt epwmisr (void) void main (void) { // //初始化全局变量 // epwm1TZIntCount = 0U; epwm1DCCAPCount = 0U; // //初始化设备时钟和外设 // device_init(); // //禁用引脚锁定并启用内部上拉。 // DEVICE_initGPIO(); // //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。 // interrupt_initModule(); // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 // interrupt_initVectorTable(); // //此示例中使用的中断被重新映射到 ISR 函数 //在此文件中找到。 // INTERRUPT_REGISTER (INT_EPWM1、epwm1ISR); //中断寄存器(INT_EPWM1_TZ、epwm1TZISR); // //配置 ePWM1和 TZ GPIO // initEPWMGPIO(); initTZGPIO(); // //禁用同步(也冻结 PWM 的时钟) // SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_GTBCLKSYNC); SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); // //使用数字比较和消隐窗口初始化 ePWM1 // initEPWM1(); // //启用到 PWM 的同步和时钟 // SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); // //启用此示例所需的中断 // //中断_ENABLE (INT_EPWM1_TZ); INTERRUPT_ENABLE (INT_EPWM1); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; // //空闲循环。 只需坐下来循环(可选): // for (;;) { if ((ePWM_TIME_BASE_STATUS_COUNT_UP = ePWM_getTimeBaseCounterDirection (EPWM1_BASE))&& (ePWM_getTimeBaseCounterValue (EPWM1_BASE)> 1000 && ePWM_getTimeBaseCounterValue (EPWM1_base)< 7000) { GPIO_writePin (25、0); } 其他 { GPIO_writePin (25、1); } NOP; } } // // epwm1ISR - ePWM 1 ISR // __interrupt void epwm1ISR (void) { epwm1DCCAPCount = ePWM_getDigitalCompareCaptureCount (EPWM1_base); // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM1_BASE); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } // epwm1TZISR - ePWM1 TZ ISR // //////中断 void epwm1TZISR (void) //{ // epwm1TZIntCount++; // // //////////////////重新启用中断/clearWm1TWEB</track/eBEEB</ble/ble/eWM1 ePWM_TZ_FLAG_DCAEVT1 | ePWM_TZ_FLAG_DCBEVT1 | ePWM_TZ_INTERRUPT); // // ////////确认此中断以接收来自组2的更多中断 //// //////// Interrupt_clearACKGroup (interrupt_ACK_group2); // ///////// initEPWM1 (void 配置 eEPWM1) ePWM_setEmulationMode (EPWM1_base、ePWM_emulation_stop_after_next _TB); // //选择 TRIPIN1 (输入 XBAR Input1)作为 DCAH 的源 // ePWM_selectDigitalCompareTripInput ( EPWM1_BASE、EPWM_DC_TRIPIN1、EPWM_DC_TYPE_DCAH); // // DCAH 为低电平时生成 DCAEVT1 // ePWM_setTripZoneDigitalCompareEventCondition ( EPWM1_BASE、EPWM_TZ_DC_OUTPUT、EPWM_TZ_EVENT_DCXH_LOW); // // DCAEVT1使用未过滤版本的 DCAEVT1 // ePWM_setDigitalCompareEventSource ( EPWM1_BASE、ePWM_DC_MODULE_A、ePWM_DC_EVENT_1、ePWM_DC_EVENT_SOURC_ORIG_SIGNAL); // // DCAEVT1是异步的 // ePWM_setDigitalCompareEventSyncMode ( EPWM1_BASE、EPWM_DC_MODULE_A、EPWM_DC_EVENT_1、EPWM_DC_EVENT_INPUT_NOT 已同步); // //选择 TRIPIN1 (输入 XBAR Input1)作为 DCBH 的源 // ePWM_selectDigitalCompareTripInput ( EPWM1_BASE、EPWM_DC_TRIPIN1、EPWM_DC_TYPE_DCBH); // // DCBEVT1在 DCBH 为低电平时生成 // ePWM_setTripZoneDigitalCompareEventCondition ( EPWM1_BASE、EPWM_TZ_DC_OUTPUT B1、EPWM_TZ_EVENT_DCXH_LOW); // // DCBEVT1作为 DCFILT 的输入 // ePWM_setDigitalCompareFilterInput ( EPWM1_BASE、ePWM_DC_WINDOW_SOURCE DCBEVT1); // // DCFILT 不反转 // ePWM_DisableDigitalCompareWindowInverseMode (EPWM1_BASE); // //消隐窗口从 CTR=0开始 // ePWM_setDigitalCompareBlankingEvent (EPWM1_base、ePWM_DC_WINDOW_START_TBCTR_ZERO); // //消隐窗口周期设置为6000 // ePWM_setDigitalCompareWindowLength (EPWM1_BASE、6000U); // //消隐窗口从 CTR=0开始,没有任何偏移 // ePWM_setDigitalCompareWindowOffset (EPWM1_base、0); // //消隐窗口已启用 // ePWM_enableDigitalCompareBlankingWindow (EPWM1_base); // // DCBEVT1是 DCFILT 输入 // ePWM_setDigitalCompareEventSource ( EPWM1_BASE、EPWM_DC_MODULE_B、EPWM_DC_EVENT_1、EPWM_DC_EVENT_SOURC_FILT_SIGNAL); // // DCBEVT1是异步的 // ePWM_setDigitalCompareEventSyncMode ( EPWM1_BASE、EPWM_DC_MODULE_B、EPWM_DC_EVENT_1、EPWM_DC_EVENT_INPUT_NOT 已同步); // //对 DCAEVT1执行操作 // ePWM_setTripZoneAction (EPWM1_base、 ePWM_TZ_ACT_EVENT_DCAEVT1、 ePWM_TZ_ACT_LOW); // //对 DCBEVT1采取行动 // ePWM_setTripZoneAction (EPWM1_base、 ePWM_TZ_ACT_EVENT_DCBEVT1、 ePWM_TZ_ACT_LOW); // //对 DCCAP 使用影子模式 // ePWM_setDigitalCompareCounterShadowImage 模式(EPWM1_base、true); // //启用计数器捕获 // ePWM_enableDigitalCompareCounterCapture (EPWM1_BASE); // //启用 TZ 中断 // //ePWM_enableTripZoneInterrupt (EPWM1_base、ePWM_TZ_INTERRUPT_DCAEVT1); // //设置 TBCLK // ePWM_setTimeBasePeriod (EPWM1_base、12000U); ePWM_setPhaseShift (EPWM1_base、0U); ePWM_setTimeBaseCounter (EPWM1_base、0U); ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP_DOWN); ePWM_DisablePhaseShiftLoad (EPWM1_base); // //设置 ePWM 时钟预分频器 // ePWM_setClockPrescaler (EPWM1_base、 ePWM_CLOCK 分频器_4、 ePWM_HSCLOCK_DEVIDER_4); // //设置隐藏 // EPWM_setCounterCompareShadowImage LoadMode (EPWM1_BASE、 ePWM_COUNTER_COMPARE_A、 ePWM_COMP_LOAD_ON_CNTR_ZERO); // //设置比较 // ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_A、2000U); // //设置操作 // ePWM_setActionQualifierAction (EPWM1_base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_up_CMPA); ePWM_setActionQualifierAction (EPWM1_base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_down_CMPA); ePWM_setActionQualifierAction (EPWM1_base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_up_CMPA); ePWM_setActionQualifierAction (EPWM1_base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_down_CMPA); // //中断,我们将在其中更改比较值 //选择 INT on 时基计数器零事件, //启用 INT,在发生第1个事件时生成 INT // ePWM_setInterruptSource (EPWM1_base、ePWM_INT_TBCTR_ZERO); ePWM_enableInterrupt (EPWM1_base); ePWM_setInterruptEventCount (EPWM1_BASE、1U); } // initTZGPIO -配置 TZ GPIO // void initTZGPIO (void) { // //将 GPIO 25设置为启用上拉的异步输入 // GPIO_setPadConfig (25、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_25_GPIO25); GPIO_setDirectionMode (25、GPIO_DIR_MODE_OUT); GPIO_writePin (25、1); // //将 GPIO 25设置为 TZ1输入 // Xbar_setInputPin (XBAR_Input1、25); } // // initEPWMGPIO -配置 ePWM GPIO // void initEPWMGPIO (void) { // //禁用 GPIO 0上的上拉电阻将其配置为 PWM1A // GPIO_setPadConfig (0、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_0_EPWM1A); // //禁用 GPIO 0上的上拉电阻将其配置为 PWM1A // GPIO_setPadConfig (1、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_1_EPWM1B); }