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.

[参考译文] TMS320F28035:带有相移的丢失 CMP 事件 TMS320F28035

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1034043/tms320f28035-lost-cmp-events-with-phase-shift-tms320f28035

器件型号:TMS320F28035

您好!

我的 Piccolo 控制器有问题。 我将使用 PWM 模块、PWM1作为主器件、Pwm2、3、4作为从器件。 一
需要控制两个具有相移功能的 H 桥、并且我正在使用采用上/下配置的高分辨率 PWM。 调制控制通过使用 CMPA 寄存器的固定值来完成
并更改模块 PWM2、3、4中 TBPHS 寄存器的值。

在这种情况下、当 CMPA 值介于上一个和下一个 TBPHS 寄存器值之间(相位为50%)时、我会丢失一些 CMP 事件。

PWM 配置如下:

EPwm1Regs.TBPRD = uintPeriodAtt;// PWM 周期:XXus 至60MHz CPU 时钟
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0 (初始条件)
EPwm1Regs.TBCTR = 0x0000;//清除计数器

//设置比较值
EPwm1Regs.CMPA.half.CMPA =(uint16)(uintPeriodAtt / 2);//设置比较值
EPwm1Regs.CMPA.half.CMPAHR = 0;//设置高分辨率比较一个值
EPwm1Regs.CMPB = 0;//设置比较 B 值

//设置计数器模式
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上/向下计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//主模块:禁用相位加载
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;//从影子寄存器选择加载活动周期寄存器
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步下流模块
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.FREE_SOFT = 11;

//设置隐藏
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;//零或周期上的负载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD;//零或周期上的负载

//设置操作
// PWM 高电平有效的设置


EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;//事件零计数时无操作 PWM1A
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;//对事件周期计数无操作 PWM1A
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM1A、递增计数
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM1A,递减计数
EPwm1Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;//事件 B 上无操作 PWM1A、递增计数
EPwm1Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;//在事件 B 上无操作 PWM1A、递减计数

EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;//事件零计数时无操作 PWM1B
EPwm1Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;//对事件周期计数无操作 PWM1B
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//在事件 A 上清除 PWM1B,递增计数
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;//在事件 A 上设置 PWM1B、递减计数
EPwm1Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;//事件 B 上无操作 PWM1B、递增计数
EPwm1Regs.AQCTLB.bit.CBD = AQ_NO_ACTION;//在事件 B 上无操作 PWM1B、递减计数


//死区时间
EPwm1Regs.DBCTL.bit.IN_MODE = 0;
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC;
EPwm1Regs.DBFED =(uint16) DeadTimeTmp;/死区时间值
EPwm1Regs.DBRED =(uint16) DeadTimeTmp;


//在 ePWM1模块上启用高分辨率 ePWM
EPwm1Regs.HRCNFG.ALL = 0;//首先清除所有位
EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;//在下降沿启用高精度位置控制
EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_zero_PRD;//在 CTR=Zero 或 CTR=PRD 上加载 CMPAHR 寄存器
EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;//启用自动转换
EPwm1Regs.HRCNFG.bit.SELOUTB = 0;// ePWMxB 输出是 ePWMxA 信号的反相版本

EPwm1Regs.HRPCTL.bit.HRPE = 1;//开启高分辨率周期控制。


//中断,我们将在其中更改比较值
//中断为 ADC 模块生成 SOCA
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在发生第一个事件时启用 INT
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;//生成 ADC 转换启动第一个事件
EPwm1Regs.ETPS.bit.SOCBPRD = et_disable;//禁用 SOCB 事件计数器。
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;// SOCA 事件时基计数器=零
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;//在 PRD 事件上选择 INT



EPwm2Regs.TBPRD = uintPeriodAtt -1;// PWM 周期:XX us 至60 MHz CPU 时钟
EPwm2Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器

//设置比较值
EPwm2Regs.CMPA.half.CMPA =((UINT16) uintPeriodAtt / 2);//设置比较值
EPwm2Regs.CMPA.half.CMPAHR = 0;//设置高分辨率比较一个值
EPwm2Regs.CMPB = 0;

//设置计数器模式
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上/向下计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//主模块:禁用相位加载
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;//从影子寄存器选择加载活动周期寄存器
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步下流模块
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.FREE_SOFT = 11;

//设置隐藏
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;//零或周期上的负载
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD;

//设置操作
// PWM 高电平有效的设置


EPwm2Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;//事件零计数时无操作 PWM2A
EPwm2Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;//对事件周期计数无操作 PWM2A
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM2A、递增计数
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM2A、递减计数
EPwm2Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;//事件 B 上无操作 PWM2A、递增计数
EPwm2Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;//在事件 B 上无操作 PWM2A、递减计数

EPwm2Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;//事件零计数时无操作 PWM2B
EPwm2Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;//事件周期计数上无操作 PWM2B
EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;//在事件 A 上清除 PWM2B、递增计数
EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;//在事件 A 上设置 PWM2B、递减计数
EPwm2Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;//事件 B 上无操作 PWM2B、递增计数
EPwm2Regs.AQCTLB.bit.CBD = AQ_NO_ACTION;//在事件 B 上无操作 PWM2B、递减计数


//死区时间
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC;
EPwm2Regs.DBFED =(uint16) DeadTimeTmp;
EPwm2Regs.DBRED =(uint16) DeadTimeTmp;


//在 ePWM1模块上启用高分辨率 ePWM
EPwm2Regs.HRCNFG.ALL = 0;//首先清除所有位
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;//在下降沿启用高精度位置控制
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_zero_PRD;//在 CTR=Zero 或 CTR=PRD 上加载 CMPAHR 寄存器
EPwm2Regs.HRCNFG.bit.AUTOCONV = 1;//启用自动转换
EPwm2Regs.HRCNFG.bit.SELOUTB = 0;// ePWMxB 输出是 ePWMxA 信号的反相版本
EPwm2Regs.HRPCTL.bit.HRPE = 1;//开启高分辨率周期控制。


//中断,我们将在其中更改比较值
//中断为 ADC 模块生成 SOCA
EPwm2Regs.ETPS.bit.INTPRD = et_disable;//禁用 INT
EPwm2Regs.ETPS.bit.SOCAPRD = ET_1ST;//生成 ADC 转换启动第一个事件
EPwm2Regs.ETPS.bit.SOCBPRD = et_disable;//禁用 SOCB 事件计数器。
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;// SOCA 事件时基计数器= 0
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件上的 INT -集中器

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

    如何避免此问题?

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

    你好、Filippo、

    您在应用中的何处计算和更改相移值? 您需要将 CMPx 值更改为高于相移值、仅针对加载相移的 PWM 周期、以确保发生 CMPx 事件、然后在下一个 PWM 周期将其设置回默认值。 CMPx 值的临时更改可在 PWM ISR 内完成。

    此致、

    Marlyn