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/TMS320F28379D:对称 HRPWM 占空比跳转

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/839498/ccs-tms320f28379d-symmetric-hrpwm-duty-jump

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

您好!

我正在尝试使用对称 HRPWM (向上/向下)、并且我已经修改  了 HRPWM_PrdUpDown_SFO_v8.c 示例以对其进行测试。

示例接缝可以正常运行、但在某些情况下、占空比会"跳跃"、然后"后退"。 这种非线性行为 可以建立在50%(通过设置 DutyFine=16383、然后将值更改为16384、最后改为16385)。 当 Duty =16384时、PWM 跳转、然后当 Duty=16385时返回。

这种行为是否正常? PWM 是否针对此目的正确配置(对称 PWM)?

谢谢、  

e2e.ti.com/.../hrpwm_5F00_duty_5F00_sfo_5F00_v8.c

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

    您使用的值不可能大于 SFO 指定的最大延迟元素数。

    请查看以下内容:

    //########################################################################################################################
    //$Copyright:
    // Copyright (C) 2013-2019 Texas Instruments Incorporated - http://www.ti.com/
    //
    只要
    
    满足以下条件,就允许以源代码和二进制形式重新分发和使用//进行修改或不修改//:
    //
    //重新分发源代码必须保留上述版权
    //声明、此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //声明、此条件列表和//
    
    分发随附的//文档和/或其他材料中的以下免责声明。
    ////
    未经
    
    事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,不
    
    承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
    //所有者或贡献者都不对任何直接、间接、偶然、
    //特殊、模范、 或相应的损害(包括但不
    限于采购替代产品或服务;丧失使用、
    //数据或利润; 或业务中断)、无论
    
    出于何种原因使用
    本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
    //$
    //########################################################################################################################
    
    //
    //包含的文件
    //
    #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;
    
    
    for (;;)
    {
    //
    //扫描 DutyFine
    //
    对于(dutyFine = min_HRPWM_Duty_percent;dutyFine < 99.9;dutyFine += 0.01)
    {
    DEVICE_DELAY_US (1000);
    对于(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);
    }
    
    //
    //调用换算系数优化器库函数 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_3);//////// epwmisr/ interrupt_isr/ ePWM/ interr/ ePWM3 (void)/ePWM/ interrupt_interrupt_interrupt_interrupt_isr/ ePWM3)/ePWM3
    
    (ep_interr/ ePWM3)/ePWM/ eep_interrupt_interrupt_interrupt_interrupt_interrupt_interrupt_isr/ eWmisr/ eWmisr/ eWmisr/ eWm/ ePWM3)/eWmisr/ eep_interrupt_interrupt_interr
    // 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 <
    

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

    感谢你的答复。 您能否提供一些有关 SFO 最大延迟数的文档? 您是否在我提供的示例中发现了任何问题? 您能否发送整个项目以便我自己进行测试?

    谢谢你。

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

    要测试 项目、只需使用 Driverlib 示例项目并将 main.c 替换为我提供的项目。

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

    此外、对于可使用的延迟数量、取决于是否启用了自动转换。 启用后、您可以在 SFO 函数完成后查看 HRMSTEP 寄存器。