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/TMS320F28035:PWM SW 强制 CBC 从 CLA 跳闸

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/567728/ccs-tms320f28035-pwm-sw-forced-cbc-trip-from-cla

器件型号:TMS320F28035

工具/软件:Code Composer Studio

您好!

我将 TMS320F28035 (Piccolo)与 CCS Vers 结合使用。 6.1.0.00104 (CPU 和 CLA 均为 C 代码)、以便使用峰值电流模式 controlPWM 控制断续导通模式下的升压转换器(开关间隔开始时的扼流电流应为零、我将在 CLA 中测试此情况)。 CLA 任务1执行控制 PWM1A 的 C 代码、以便从转换器获得恒定输出电压。
如果在开关间隔开始时电流大于阈值、则我尝试在当前开关间隔内使 PWM1A 关闭(在下一个间隔内、它应自动再次打开)。 通过将0输入 DAC 并在模拟比较器的帮助下执行此操作很好(但可能比必要的速度慢)。 我希望更好地避开模拟路径并生成一个关闭 PWM1A 的 SW 跳闸。 不幸的是、这不起作用、在我看来 PWM1只是停止(永远、这不是我想要的、完全不是)。 CLA 中是否存在寻址问题(CPU 中为32位指针、CLA 中为16位指针???) 当我读取和时
在 CPU 和 CLA 中以相同的方式写入 ePWM 寄存器?

非常感谢您提出的任何有用建议。

此致、
Leo Rohrecker


//=== CPU 代码中的初始化:===

       EALLOW;
       //设置比较:A = PWM 最大直流值、B = ADC SOC
       EPwm1Regs.CMPA.half.CMPA = 0;// DC = 0
       EPwm1Regs.CMPB          = ADC_SOC_OFFSET;

       //与 SYSCLKOUT 的时钟比率
       EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
       EPwm1Regs.TBCTL.bit.CLKDIV   = TB_DIV1;

       //周期
       EPwm1Regs.TBPRD = PWM_TIMER_TBPRD;
       EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;

       //设置操作
       EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;  //将 PWM1A 设置为零
       EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//最大占空比
       EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;  //将 PWM1B 设置为零
       EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;// ADC SOC 第一组

       // CBC 跳闸,定义事件(DCAEVT2)
       //(请参阅 SPRUGE9E、例如 14)
       EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT; // DCAH =比较器1输出
       EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI;        // DCAEVT2 = DCAH 高电平(将作为 COMP 变为有效。 输出变为高电平)
       EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;         // DCAEVT2 = DCAEVT2 (未滤波)
       EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_异 步;//采用异步路径
       EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;                   //启用 CBC 事件
       EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;             // EPWM1A 将变为低电平
       EPwm1Regs.TZCTL.bit.TSB = TZ_NO_CHANGE;            // EPWM1B 未更改

       //定义 SOC (ADC 触发器)
       EPwm1Regs.ETSEL.bit.SOCBEN = 1;              //启用 SOC B
       EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTRU_CMPB;  //从 CPMB 获取 SOC 递增计数
       EPwm1Regs.ETPS.bit.SOCBPRD = 1;              //在发生第一个事件时生成脉冲
       EDIS;


//=== 在 CLA 代码中运行时间操作:===
       //在开关间隔开始时通过电流测量检查 CCM
       if (((float32) ADC_U_I1 > U_I_START_THRESH_CCM_til){
           //启动电流过高.. 立即关闭
           EALLOW;
           //EPwm1Regs.TZFRC.bit.DCAEVT2 = 1;//强制 DCAEVT2跳闸条件... 也不起作用 !!!!!
           EPwm1Regs.TZFRC.bit.CBC = 1;//强制 CBC 跳闸... 不起作用!!!!!
           EDIS;
           //Comp1Regs.DACVAL.bit.DACVAL = 0;     //通过模拟比较器立即关闭。 (替代方法、工作正常、但比数字路径慢)
       }
       //控制器代码等...
       //...

//-------------------------------------------------------- 结束----------------------------------------

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

    在 CLA 方面、您是否在任何其他外设头文件之前包含 F2803x_Cla_typedefs.h? 该文件为 CLA 上的数据类型设置了正确的大小、以便正确完成外设位字段访问。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vishal、

    我认为我的代码中应包含必要的定义。  CLA C 代码文件 从开始

    #include "DSP28x_Project.h"


    和 DSP28x_Project.h 内容为:


    //######################################################################################################################

    //

    //文件:DSP28x_Project.h

    //

    //标题:DSP28x 项目头文件和示例 include 文件

    //

    //######################################################################################################################

    //$TI 版本:F2803x C/C++头文件和外设示例 V126 $

    //$Release Date:2011年11月30日$

    //######################################################################################################################

    #ifndef DSP28x_project_H

    #define DSP28x_PROJECT_H

    #include "DSP2803x_CLA_typedefs.h"// DSP2803x CLA 类型定义

    #include "DSP2803x_Device.h"// DSP2803x 头文件包含文件

    #include "DSP2803x_examples.h"// DSP2803x 示例包含文件

    #endif // DSP28x_project_H 定义的末尾

     

     

    和 DSP2803x_CLAtypedefs.h 内容为:

     

    //######################################################################################################################

    //

    //文件:DSP2803x_Cla_typedefs.h

    //

    //标题:变量类型定义

    //

    //######################################################################################################################

    //$TI 版本:F2803x C/C++头文件和外设示例 V126 $

    //$Release Date:2011年11月30日$

    //######################################################################################################################

    #ifndef CLASHARED_C_H_

    #define CLASHARED_C_H_

    ///-------------------------------------------------------

    //为便于移植,建议用户使用以下数据类型大小

    // 16位和32位有符号/无符号整数的定义:

    //

    #ifndef DSP28_data_types

    #define DSP28_DATA_Types

    typedef short int16

    typedef long int32

    typedef unsigned char uint8

    typedef unsigned short uint16

    typedef unsigned long uint32

    typedef float 32

    typedef long double float64

    #endif

    #ifndef _TI_STD_Types

    #define _TI_STD_Types

    /*

    *这些类型也在 DSP/BIOS 5.x 中定义 和

    * SYS/BIOS 6.x 文件。 我们需要保护它们

    *使用#ifndef/#define 保护进行定义以避免重复

    *定义警告。

    *

    * SYS/BIOS 要求 文件

    *任何其他.h 文件。

    *

    #endif

    //禁止转换 CLA 指针的警告

    pragma diag_suppress 70、770、232

    //操作预处理器以生成头文件名的宏

    //在编译时基于测试名称,可用作

    //#include 的参数

    #define XSTRINGIZE (s) STRINGIZE (s)

    #define STRINGIZE (s)#s

    #define XCONCAT (x、y) CONCAT (x、y)

    #define CONCAT (x、y) x#y

    #ifdef __TMS320C28XX_CLA0__

    struct MSTF_shadow_bits{//位描述

    UINT16 LVF:1;// 0锁存溢出标志

    UINT16 LUF:1;// 1锁存下溢标志

    uint16 NF:1;// 2负浮点标志

    UINT16 ZF:1;// 3零浮点标志

    uint16 rsvd1:2;// 5:4保留

    UINT16 TF:1;// 6测试标志

    uint16 rsvd2:2;// 8:7保留

    UINT16 RNDF32:1;// 9舍入模式

    uint16 rsvd3:1;// 10保留

    UINT16 MEALLOW:1;// 11 MEALLOW 状态

    uint16 RPCL:4;// 15:12 return PC:low 部分

    uint16 RPCH:8;// 23:16返回 PC:高电平部分

    uint16 rsvd4:8;// 31:24保留

    };

    extern __cregister volatile unsigned int MSTF;

    #endif //_TMS320C28XX_CLA0__

    #if defined (_TMS320C28XX_CLA0__)

    typedef 结构{uint32 low32;uint32 high32;}uint64;

    其他

    typedef unsigned long UINT64

    #endif

    #ifndef __TMS320C28XX__

    #define __cregister

    #endif //_TMS320C28xx__

    #define UINT16无符号短整型

    #endif /*CLASHARED_C_H_*/

     

    --------------------------------------------

    我于 2011/12开始 Piccolo 的代码开发、因此这些 TI 文件自2011年开始。 但我的代码运行良好、直到我尝试在 CLA C 代码中使用软件跳闸。

    此致、

    Leo

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vishal、
    目前、我无法访问我的测试硬件、 但我意识到我的 C 编译器(v6.2.8)将 EALLOW / EDIS 简单地转换为 CLA 汇编器代码文件中的 EALLOW / EDIS、而命令__meallow ()/__medis ()按原样转换为 CLA 汇编器中的 MEALLOW / MEDIS! 我的问题可能只是编译器错误。 我会随时通知您。
    此致、
    Leo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vishal、

      当我将 命令__meallow()/__medis()与受保护的寄存器一起使用时,可以从 CLA 访问 PWM 寄存器。  在.CLA 文件中找到 EALLOW 或 EDIS 等命令后、C 编译器生成警告或错误消息是很好的。

    感谢 你的帮助!


    此致、
    Leo

x 出现错误。请重试或与管理员联系。