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.
工具/软件:Code Composer Studio
您好!
我在半周期模式下使用死区模块来延迟具有对称占空比控制的信号的边沿(在上-下计数模式下)。 这些脉冲围绕 CTR=PRD 事件(TBPRD 值为166)进行居中、因此上升沿发生在 CTR=PRD 之前、下降沿发生在 CTR=PRD 之后。 ePWM 时钟设置为200MHz、因为在 F28388器件上、ePWM (4类)模块支持在该频率下运行。
对于 DBRED 和 CMPA:CMPAHR 的大多数值 、波形都非常精确。 但是、当我增加 DBRD 时、有一个阈值、根据 CMPAHR 的值、上升沿会以不同的方式延迟。 我不是100%确定、但该阈值似乎取决于 CMPA 的值、我认为死区模块试图将上升沿延迟到 CTR=PRD 事件之后、就会出现异常。
下面是示波器屏幕截图:
我假设一种可能的解释是、死区模块不"意识到" HRPWM 模块在 HRPE 模式下使用的内部影子 CMPA 缓冲器。 但这可能只是我的配置中的一个错误。 在任何情况下、占空比如此小以至于接近死区时间的情况在我的应用中都不太可能、但我只是想确保我不会错过一些重要的东西。
此致、
皮埃尔
您好!
您说您可以以200MHz 运行、但在阅读 SPRS880D 文档时、第61页中说明了:
f (ePWM)频率、EPWMCLK (2) 100MHz (注释2)
f (HRPWM)频率、HRPWMCLK 60 100 MHz
注2:对于频率高于100MHz 的 SYSCLK、EPWMCLK 必须为 SYSCLK 的一半。
因此、您永远不能在100MHz 以上运行 PWM。
此致
您可以在此器件中使用高达200MHz 的 ePWM。 我将审核您的其余请求。
NIMA、
我在一个非常小的 CCS 项目中解决了这个问题。 使用此作为起点、重现问题应该更容易。
此致、
皮埃尔
你好、Nima、
您是否已找到运行 CCS 项目的时间?
此致、
皮埃尔
你好、Nima、
由于已经将近两个星期了,我想知道在这个问题上是否取得了一些进展。
如果我尝试在 F28379等其他器件上重现此问题、是否会有所帮助?
此致、
皮埃尔
皮埃尔
很抱歉耽误你的时间! 我在月底发布了一个新外设、我们为此付出了极大的努力。 如果您可以在 F28379D 器件上重现此问题、这将非常有帮助!
我将尝试使用您的 CCS 项目。 感谢您的提供!
NIMA
你好、Nima、
首先、请找到所附的另一个 CCS 工程、它在 F28379D controlCARD 上运行时似乎显示了相同的问题。
其次、我注意到了一些奇怪的东西。 在 C2000Ware 的许多示例中(但不是每个示例!) HRPWM 配置期间有以下操作:
(* ePWM[j]).cmpa.bit.cmpaHR =(1 << 8);//初始化 HRPWM 扩展
我不记得在 F28x 器件的数据表或 TRMS 中看到过任何有关此操作的信息。 它来自哪里、它有什么作用、它是强制性的?
此致、
皮埃尔
NIMA、
我想知道这个问题是否正在调查中、因为这已经是一个月了。
此致、
皮埃尔
皮埃尔
是的。 我们正致力于这方面的工作。
请记住我在发布之前提到的新外设 CLB。 最新的 C2000WARE 中现已发布该软件。 请查看此信息、并向我发送一封私人邮件、其中包含您对其的想法。 根据您之前的帖子、我认为 CLB 非常有用!
同时、我们正在努力了解到底是什么导致了这种情况!
NIMA
关于这一点、是的、这是强制性的、在示例中完成了、以显示它初始化为值。 它需要被移位8。
CMPAHR=0的值与禁用 HRPWM 模块的值不同。 来自 HRPWM 内部逻辑的延迟仍然应用于 ePWM 输出信号。
以上是针对 CMPAHR 初始化代码的答案。
在您发送皮埃尔的图中、
最后两个绿色上升沿是否因 CMPAHR=1根据 SFO 步长引入的延迟而分开?
NIMA
你好、Nima、
我不确定您是指(CMPAHR = 1微步进)还是(CMPAHR = 1 TBCLK)。
假设在 CMPAHR 的两个非零值之间转换时、移位是正确的、 但是当 CMPAHR=0时、边沿返回大约一个整个 TBCLK 周期(屏幕截图是10ns/div、边沿被半个 div、即5ns、这是 TBCLK 周期)。
您是否能够在电路板上重现异常情况?
皮埃尔
是的、我能够重现这种情况、我正在尝试弄清这是预期行为、违反特定模式、还是新问题。
NIMA
皮埃尔
我看到问题、但是您为 F28379D launchpad 发送的代码会变为红色、但在我在示波器上查看的信号中、它通过将信号拉至更接近 PRD 来更改信号的下降沿。 这是您打算对示例代码执行的操作吗?
NIMA
好的、我更改了代码中的一些设置、这里是我找到的内容以及我从其他 ePWM 专家那里得到的解释。
您发送的代码已更改为:
#include "F28x_Project.h" #include "SFO_v8.h" int ePWM、MEP_ScaleFactor; void HRPWM1_Config (int); void main (void){ InitSysCtrl(); _EALLOW (); ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 1; __EDIIS(); _EALLOW (); CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0; CpuSysRegs.PCLKCR0.bit.GTBCLKSYNC=0; __EDIIS(); /* *配置 ePWM2在 CTR=ZRO 和 CTR=PRD 上生成边沿。 * ePWM2上未启用高分辨率边沿放置。 * EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm2Regs.TBCTL.bit.FREE_SOFT = 2; EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR; EPwm2Regs.AQCTLA.bit.PRD = AQ_SET; EPwm2Regs.TBPRD = 20; /* *将 ePWM1配置为对称高分辨率占空比控制。 * EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; EPwm1Regs.AQCTL.bit.SHDWAQAMODE = 1; EPwm1Regs.AQCTL.bit.LDAQAMODE = 0; EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; EPwm1Regs.TBPRD = 20; EPwm1Regs.CMPA.bit.CMPA = 10; EPwm1Regs.CMPA.bit.CMPAHR = 0; EPwm1Regs.DBCTL.bit.HALFCYCLE = 1; EPwm1Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED; EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE; EPwm1Regs.DBRED.bit.DBRED = 4; _EALLOW (); EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP; EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP; EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO _PRD; EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; EPwm1Regs.HRPCTL.bit.HRPE = 1; EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1; __EDIIS(); _EALLOW (); CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1; __EDIIS(); EPwm1Regs.TBCTL.bit.SWFSYNC = 1; while (SFO ()=SFO_INCOMPLETE); /*防止 ePWM1在其自己的输出上重新同步*/ EPwm1Regs.TBCTL.bit.PHSEN = 0; InitEPwm1Gpio(); InitEPwm2Gpio(); for (;;){ /*起始位置*/ EPwm1Regs.CMPA.bit.CMPAHR = 0x0000; EPwm1Regs.DBRED.bit.DBRED = 0; ESTOP0; EPwm1Regs.CMPA.bit.CMPAHR = 0x0000; EPwm1Regs.DBRED.bit.DBRED = 22; ESTOP0; /*通过添加1个 MEP 步进、边缘 shoud 移动少量*/ EPwm1Regs.CMPA.bit.CMPAHR = 0x0100; EPwm1Regs.DBRED.bit.DBRED = 22; ESTOP0; /*通过向 DBRED 添加2、边沿被延迟1个周期*/ EPwm1Regs.CMPA.bit.CMPAHR = 0x0100; EPwm1Regs.DBRED.bit.DBRED = 26; ESTOP0; /* *通过删除1个 MEP 步进、边缘 shoud 会移动少量 *但我们可以看到它的移动比预期的要大得多。 * EPwm1Regs.CMPA.bit.CMPAHR = 0x0000; EPwm1Regs.DBRED.bit.DBRED = 26; ESTOP0; } }
1.当您延迟上升沿在第一步中通过 PRD 时、一切正常!
2.当您通过写入1来启用 HRPWM 时、它只会移动下降沿。 经过 PRD 事件后、HR 模块似乎只影响下降沿! 由于死区模块激活、因此上升沿 HR 部分不会产生影响、因此这是预料之中的!
3.启用 HR 后、将红色移至26、似乎只会延迟上升沿! 这符合预期。
禁用 HR 并保持 DBRED 不变、似乎会将所有内容向左移动、向 PRD 移动1个周期。 这是我目前还没有答案的地方!
在我调查其余问题时将此答案标记为黄色、以便具有相同问题的其他用户阅读此答案。
NIMA
你好、Nima、
您确定红色会改变信号的下降沿吗? 在我的设置中、仅上升沿发生变化、如示波器图片中所示、最右侧除法中绿色信号的下降沿全部叠加。
我将尽快再次检查我的设置。
谢谢、
皮埃尔
皮埃尔
实际上上升沿在移动。 我的示波器上的设置已更改。
NIMA
[引用用户="Nima Eskandari"]
关于这一点、是的、这是强制性的、在示例中完成了、以显示它初始化为值。 它需要被移位8。
[/报价]
NIMA,对不起,我只是注意到您说它是强制性的。
[引用用户="Nima Eskandari"]
CMPAHR=0的值与禁用 HRPWM 模块的值不同。 来自 HRPWM 内部逻辑的延迟仍然应用于 ePWM 输出信号。
[/报价]
我不关注。 HRPWM 内部逻辑延迟对输出信号有何影响? 我的意思是、当我使用 HRPWM 模块时、我的目标是在 CMPAHR 的所有值上保持一致的行为、因此我希望我不需要将 CMPAHR=0视为具有不同行为的特殊值。
此致、
皮埃尔
与3相同。
Akshaya Jain 能否确认我的上述评论?
[引用用户="Nima Eskandari"]
它确实起作用、但接受的值集是从0x1起一直到上的。 使用 HR 部分的值0将不会为您提供您假设的正确 ePWM 频率。 这是因为 HR 部分中的0x0值并不意味着 PWM 计算与禁用 HRMODE 时的计算相同。
[/报价]
很抱歉我得不到。 我遇到的有关 HRPWM 的每个文档基本上都说 CMPAHR 值=(MEP 步数)<< 8。 那么、您说的是、除了我需要零 MEP 步进的情况外、这是正确的?
例如 、第26.15.1.5.2章中的公式明确 地显示了 CMPAHR 的值应如何基于 FRAC (PWMDuty*PWMPeriod)。 如果 PWMDuty*PWMPeriod 恰好是不带小数部分的整数,则这种公式实际上是错误的吗?
[引用用户="Nima Eskandari"]
我可以添加额外的注释、以确保用户不会假定 HRMODE=DISABLED 与 CMPxHR=0一样
[/报价]
我不能把头缠绕在这里。 显然、我不会假设 HR 模式已禁用、为什么要在应用程序中间禁用? 我在外设初始化期间一劳永逸地启用它、然后我的控制环路为我提供浮点占空比、我将其转换为一个整数值、然后将其作为整数值写入 CMPA:CMPAHR、如文档中所述。 HR 模式与这有什么关系?
此致、
皮埃尔
让我尝试对其进行编码并再次检查行为。 我阅读了一些相互矛盾的文件。
皮埃尔
我对此进行了测试。 即使在 CMPAHR 被设定为0时启用 HRMODE、将增加一个以 ps 为单位的延迟(大约1 MEP 步长)。
下面是我的代码。 它不会发生任何变化、只要在启用 HR 时只发生200PS 的变化、您的正常情况下、其他一切都应按预期工作。
// //包含的文件 // #include "driverlib.h" #include "device.h" #include "SFO_v8.h" #define ePWM_TIMER_TBPRD 100UL #define MIN_HRPWM_Duty_Percent 4.0/(((float32_t) ePWM_TIMER_TBPRD)* 100.0 // 定义 // #define LAST_ePWM_index_for_example 5 // 全局 //// float32_t dutyFine = min_HRPWM_Duty_percent; uint16_t status; int MEP_ScaleFactor;//由 SFO 库使用的变量 //结果可用于所有 HRPWM 通道 //此变量也被复制到 HRMSTEP //按 SFO ()函数注册。 易失性 uint32_t ePWM[(PWM_CH + 1)]= {0、EPWM1_base、EPWM2_base、EPWM3_base、EPWM4_base}; // //函数原型 // void initHRPWM (uint32_t period); void initEPWMGpio (void); void error (void); //_interrupt void epwm1ISR (void); //_interrupt void epwm2ISR (void); //__interrupt void epwm3ISR (void); //__interrupt void epwm4ISR (void); // // Main // void main (void) { uint16_t i = 0; // //初始化设备时钟和外设 // device_init(); // //禁用引脚锁定并启用内部上拉。 // DEVICE_initGPIO(); // //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。 // interrupt_initModule(); // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 // interrupt_initVectorTable(); // //将中断服务例程分配给 ePWM 中断 // //中断寄存器(INT_EPWM1、epwm1ISR); //中断寄存器(INT_EPWM2、epwm2ISR); //中断寄存器(INT_EPWM3、epwm3ISR); //中断寄存器(INT_EPWM4、epwm4ISR); initEPWMGpio(); // //将 XBAR 输入从使用 GPIO0更改为使用 GPIO0 //如果启用了 ePWM SYNCIN,EXTSYNCIN1和 EXTSYNCIN2将使用 // GPIO0 (即 EPWM1的输出)。 //选择和未使用的 GPIO // Xbar_setInputPin (XBAR_INPUT5、50); Xbar_setInputPin (XBAR_INPUT6、50); // //调用 SFO ()使用校准的 MEP_ScaleFactor 更新 HRMSTEP 寄存器。 // HRMSTEP 必须在启用前填充比例因子值 //高分辨率周期控制。 // while (status =SFO_Incomplete) { 状态= SFO (); if (status =SFO_ERROR) { ERROR();//如果发生错误,SFO 函数返回2,MEP # } //步进/粗步进超过最大255。 } // //禁用同步(也冻结 PWM 的时钟) // SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_GTBCLKSYNC); SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); initHRPWM (ePWM_TIMER_TBPRD); // //启用到 PWM 的同步和时钟 // SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); //启用 ePWM 中断 // //中断_ENABLE (INT_EPWM1); //中断_ENABLE (INT_EPWM2); //中断_ENABLE (INT_EPWM3); //中断_ENABLE (INT_EPWM4); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; dutyFine = 50.0; 对于(i=1 <LAST_EPWM_INDEX_FOR_EXAMPLE; i++) { float32_t 计数=(dutyFine *(float32_t)(ePWM_TIMER_TBPRD << 8)))/100; uint32_t compCount =(count); HRPWM_setCounterCompareValue (ePWM[i]、HRPWM_COUNTER_COMPARE_A、compCount); HRPWM_setCounterCompareValue (ePWM[i]、HRPWM_COUNTER_COMPARE_B、compCount); } for (;;) { // //调用换算系数优化器库函数 SFO () //定期跟踪温度/电压引起的任何变化。 //此函数通过运行生成 MEP_ScaleFactor HRPWM 逻辑中的// MEP 校准模块。 该比例 //系数可用于所有 HRPWM 通道。 SFO () //函数也使用更新 HRMSTEP 寄存器 //比例因子值。 // STATUS = SFO ();//在后台,MEP 校准模块 //持续更新 MEP_ScaleFactor 如果(status =SFO_ERROR) { ERROR();// SFO 函数在发生错误时返回2 &# // MEP 步进/粗步进 } //超过最大255。 } } // epwm1ISR - ePWM 1 ISR // ////_interrupt void epwm1ISR (void) //{ // ePWM_clearEventTriggerInterruptFlag (EPWM1_base); // Interrupt_clearACKGroup (interrupt_ACK_ACK_Event3); //// // epwmisr/ interrupt/ePWM/ interrupt_Interrupt/ePWM3 (void)/ePWM/ interr/ ePWM3)/ePWM/ interrupt_interrupt_interrupt_interrupt_interrupt_interrupt/ePWM3 (interrupt_interrupt/ePWM3)/ePWM3 (interr/ ePWM3)/ePWM3)/ePWM/ ep_interrupt_interrupt_interrupt_interrupt_interrupt_interrupt_interrupt_interrupt/ePWM3 ( // Interrupt_clearACKGroup (interrupt_ACK_Group3); // //// epwm4ISR - ePWM 4 ISR // ////// interrupt void epwm4ISR (void) //// ePWM_clearEventTriggerInterruptFlag (EPWM4_base); // Interrupt_ACKGroup (void ) // EPWM3_ interrupt (void)// EPWM3_ interrupt) // //将 GPIO0/1分别配置为 ePWM1A/1B 引脚 // GPIO_setPadConfig (0、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_0_EPWM1A); GPIO_setPadConfig (1、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_1_EPWM1B); // //将 GPIO2/3分别配置为 ePWM2A/2B 引脚 // GPIO_setPadConfig (2、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_2_EPWM2A); GPIO_setPadConfig (3、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_3_EPWM2B); // //将 GPIO4/5分别配置为 ePWM3A/3B 引脚 // GPIO_setPadConfig (4、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_4_EPWM3A); GPIO_setPadConfig (5、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_5_EPWM3B); // //将 GPIO6/7分别配置为 ePWM4A/4B 引脚 // GPIO_setPadConfig (6、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_6_EPWM4A); GPIO_setPadConfig (7、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_7_EPWM4B); } void initHRPWM (uint32_t 周期) { uint16_t j; // 具有 HRPWM 的// ePWM 通道寄存器配置 // ePWMxA/ePWMxB 在上升沿由 MEP 控制切换为低电平/高电平 // 对于(j=1;j <
你好、Nima、
我想运行此代码、您可以将其作为 CCS 项目发送吗?
谢谢、此致、
皮埃尔
皮埃尔
请导入此项目: http://dev.ti.com/tirex/explore/node?node=AGQH5zZ6qpYvuEiMHzgF8A__gYkahfz__LATEST
并将主文件替换为上述内容。
并添加两个 driverlib SFO 库:
C2000Ware_2_01_00_00\libraries\calibration\HRPWM\f2837xd\lib\SFO_v8_Fpu_lib_build_c28_driverlib.lib
C2000Ware_2_01_00_00\libraries\calibration\HRPWM\f2837xd\lib\SFO_v8_Fpu_lib_build_c28_driverlib_eabi.lib
项目中。