TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28379D: 将CMPSS输出连接到ePWM

阅读(54)

Part Number:TMS320F28379D

我想实现对LLC副边的高频电流过零采样实现同步整流;电流0A对应的采样基准电压为1.65v,我想在其过零附近1.6V和1.7V(由信号发生器模拟)实现控制EPWM1A和EPWM1B通道,即> 1.7V时EPWM1A 置高;≤ 1.7V时EPWM1A置低 ;< 1.6V时EPWM1B 置高;≥ 1.6V关闭下管EPWM1B 置低。

我将CMPSS2 的输出信号CTRIPH 和CTRIPL 通过 EPWM XBAR 的TRIP4和TRIP5 路由到 ePWM 模块的DCAH和DCBH;

期望当DCAH为高时触发 DCAEVT1,而当DCAEVT1触发时,使EPWM1A强制输出为高;当DCAH为低时触发 DCAEVT2,而当DCAEVT2触发时,使EPWM1A强制输出为低;

同理,当DCBH为高时触发 DCBEVT1,而当DCBEVT1触发时,使EPWM1B强制输出为高;当DCBH为低时触发 DCBEVT2,而当DCAEVT2触发时,使EPWM1B强制输出为低;

下面是我配置的部分主要程序

//CMPSS2 配置 ==========

 Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;              Cmpss2Regs.COMPDACCTL.bit.SWLOADSEL=1;      Cmpss2Regs.COMPDACCTL.bit.DACSOURCE=0;  
    //高比较器配置(1.7V)
    Cmpss2Regs.DACHVALS.bit.DACVAL = 2110;           // 对应约 1.7V:2110*3.3/4096 ≈ 1.7V
    Cmpss2Regs.COMPCTL.bit.COMPHSOURCE = 0;          // 高比较器的负输入选择为内部 DAC(正输入通常接电流采样信号)。
    Cmpss2Regs.COMPCTL.bit.COMPHINV = 0;             // 不反相
    Cmpss2Regs.COMPCTL.bit.CTRIPHSEL = 0;            // 异步 CTRIPH
    Cmpss2Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;         // 异步输出观察用
   //低比较器配置(1.6V)
    Cmpss2Regs.DACLVALS.bit.DACVAL = 1986;           // 对应约 1.6V
    Cmpss2Regs.COMPCTL.bit.COMPLSOURCE = 0;
    Cmpss2Regs.COMPCTL.bit.COMPLINV = 1;             // 低比较器反相,输出逻辑与上面匹配
    Cmpss2Regs.COMPCTL.bit.CTRIPLSEL = 0;            // 异步 CTRIPL
    Cmpss2Regs.COMPCTL.bit.CTRIPOUTLSEL = 0;
      OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX8 = 0;
      OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX8 = 1;

      //X-bar设置,连接到EPWMX-bar
      EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX2 = 0; // CMPSS2.CTRIPH → MUX2 → TRIP4(即CMPSS2 的高比较器输出 CTRIPH通过MUX2接入EPWM-XBAR的TRIP4信号线上)
      EPwmXbarRegs.TRIP5MUX0TO15CFG.bit.MUX3 = 0; // CMPSS2.CTRIPL → MUX3 → TRIP5(即CMPSS2 的低比较器输出 CTRIPL通过MUX3接入EPWM-XBAR的TRIP5信号线上)

      EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX2 = 1;// 启用 MUX2路由到 TRIP4
      EPwmXbarRegs.TRIP5MUXENABLE.bit.MUX3 = 1;// 启用 MUX3路由到 TRIP5

      EPwmXbarRegs.TRIPOUTINV.bit.TRIP4 = 0; // 不反相输出(默认)
      EPwmXbarRegs.TRIPOUTINV.bit.TRIP5 = 0; // 不反相输出(默认)

//EPWM1 配置 ==========
void InitEPwm1Example()  //采样和中断
{
    EPwm1Regs.TBPRD = 1000;                        // Set timer period   中断频率和采样频率100k
    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;             // Phase is 0
    EPwm1Regs.TBCTR = 0x0000;                       // Clear counter
    //EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    //EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    // Setup TBCLK
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up

    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

    // Setup compare
    EPwm1Regs.CMPA.bit.CMPA = 500;

    // Set actions
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;             // Set PWM1A on CAU
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;           // Clear PWM1A on CAD

    EPwm1Regs.ETSEL.bit.SOCAEN    = 1;        EPwm1Regs.ETSEL.bit.SOCASEL    = 1;       EPwm1Regs.ETPS.bit.SOCAPRD = 1;               
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     EPwm1Regs.ETSEL.bit.INTEN = 1;                 EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           EPwm1Regs.ETFLG.bit.INT = 1;
}

//EPWM1中断 配置 ==========

__interrupt void epwm1_isr(void)
{
    EALLOW;
       // === Digital Compare 配置 ===

       // A通道:控制EPWM1A(下管),对应 CMPSS2.CTRIPOUTH(高比较器) → DCAH
       EPwm1Regs.DCAHTRIPSEL.bit.TRIPINPUT4 = 1;    // 将TRIP4信号(即 CMPSS2.CTRIPH输出),指定为ePWM1的DCAH输入源;【即当 CMPSS2高比较器输出 CTRIPH为高时,TRIP4变高,DCAH接收到高电平。】
       EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 4;     // TRIP4 -> DCAH
       EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;  // DCAH为高时触发 DCAEVT1
       EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_LOW; // DCAH为低时触发 DCAEVT2
       EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1;   // 0x0源是DCAEVT1;0x1源是DCEVTFILT信号
       EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;   // 0x0源是DCAEVT2;0x1源是DCEVTFILT信号
       EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC;//异步方式输出,不依赖同步信号。
       EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;//异步方式输出,不依赖同步信号。

       // B通道:控制EPWM1B(下管),对应 CMPSS2.CTRIPOUTL(低比较器) → DCBH
       EPwm1Regs.DCBHTRIPSEL.bit.TRIPINPUT5 = 1;    // 将TRIP5信号(即 CMPSS2.CTRIPL输出),指定为 ePWM1的DCBH输入源;【即当 CMPSS2低比较器输出 CTRIPL为高时,TRIP5变高,DCBH接收到高电平】
       EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 5;     // TRIP5 -> DCBH
       EPwm1Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;  // DCBH为高时触发DCBEVT1
       EPwm1Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_LOW; // DCBH为低时触发 DCBEVT2
       EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = DC_EVT1;
       EPwm1Regs.DCBCTL.bit.EVT2SRCSEL = DC_EVT2;        EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC;
       EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;

       // 启用 DCAEVT1 和 DCBEVT1 的“事件使能”(同时触发强制)
       EPwm1Regs.TZSEL.bit.DCAEVT1 = 1;
       EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;
       EPwm1Regs.TZSEL.bit.DCBEVT1 = 1;
       EPwm1Regs.TZSEL.bit.DCBEVT2 = 1;

       EPwm1Regs.TZCTL.bit.DCAEVT1 = TZ_FORCE_HI;
       EPwm1Regs.TZCTL.bit.DCAEVT2 = TZ_FORCE_LO;
       EPwm1Regs.TZCTL.bit.DCBEVT1 = TZ_FORCE_HI;
       EPwm1Regs.TZCTL.bit.DCBEVT2 = TZ_FORCE_LO;
       EDIS;
    EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
我在上述代码的调试过程中将CMPSS2 的输出信号CTRIPH 和CTRIPL 分别通过 output- XBAR连接到两个gpio进行观测,是可以正常看到两个基本为互补的方波信号,但是将其通过EPWM XBAR连接到EPWM1A和1B上,两个输出一直为低,这是为什么?上述代码配置能否能够符合我所描述功能的逻辑,编程是否存在问题,烦请解释原因。

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待

TMS320F28P650SH: 在芯片上跑Ucos RTOS内核,出现数据异常,由于P650的FPU是双精度 64位,之前用的都是单精度32位FPU,TI是否有对应的demo参考

yi zhu阅读(45)

Part Number:TMS320F28P650SHOther Parts Discussed in Thread:TMS320F28388D

在芯片上跑Ucos RTOS内核,出现数据异常,由于P650的FPU是双精度 64位,之前用的都是单精度32位FPU,TI是否有对应的demo参考 ;

查看资料,TMS320F28388D的FPU也是采样64位。

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

TMS320F28377D: 你好,我有一个问题,我的程序进不去main函数,卡在了copy_decompress_lzss.c 这个文件里面,请问这个文件是什么作用呢?怎么修改呢?

zhisheng xiong阅读(46)

Part Number:TMS320F28377D

如题所示,我是利用EMIF对SRAM进行写入,当我写入小于65536个数据就可以正常写入,超过65536个数据就不行,就会卡在图里面的for循环中,但是length的定义length_t是灰色的,又无法知道他是什么类型,我该怎么办呢?我怀疑就是length_t的长度不够,65536刚好就是16位,里面的CHAR_BIT怎么修改呢?

/*****************************************************************************/
/* copy_decompress_lzss.c*/
/**/
/* Copyright (c) 2006 Texas Instruments Incorporated*/
/* http://www.ti.com/*/
/**/
/*  Redistribution and  use in source  and binary forms, with  or without*/
/*  modification,  are permitted provided  that the  following conditions*/
/*  are met:*/
/**/
/*Redistributions  of source  code must  retain the  above copyright*/
/*notice, this list of conditions and the following disclaimer.*/
/**/
/*Redistributions in binary form  must reproduce the above copyright*/
/*notice, this  list of conditions  and the following  disclaimer in*/
/*the  documentation  and/orother  materials  provided  with  the*/
/*distribution.*/
/**/
/*Neither the  name of Texas Instruments Incorporated  nor the names*/
/*of its  contributors may  be used to  endorse or  promote products*/
/*derived  fromthis  software  withoutspecific  prior  written*/
/*permission.*/
/**/
/*  THIS SOFTWARE  IS PROVIDED BY THE COPYRIGHT  HOLDERS AND CONTRIBUTORS*/
/*  "AS IS"  AND ANY  EXPRESS OR IMPLIED  WARRANTIES, INCLUDING,  BUT NOT*/
/*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR*/
/*  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT*/
/*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,*/
/*  SPECIAL,  EXEMPLARY,  OR CONSEQUENTIAL  DAMAGES  (INCLUDING, BUT  NOT*/
/*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,*/
/*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY*/
/*  THEORY OF  LIABILITY, WHETHER IN CONTRACT, STRICT  LIABILITY, OR TORT*/
/*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE*/
/*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
/**/
/**/
/* Decompress routine for Lempel-Ziv-Storer-Szymanski (LZSS) compression.*/
/* Given an input buffer with data compressed using LZSS encoding and an*/
/* output buffer, this routine decompresses the data in the output buffer.*/
/**/
/* NOTE:*/
/* 1. This routine could be used to copy uninitialized or initialized global */
/*data space of a program. Hence this routine cannot define any global*/
/*variable.*/
/* 2. This routine will never be used to initialize stack space and hence*/
/*all the variables are allocated to stack.*/
/* 3. The calling application should ensure the output buffer is big*/
/*enough to hold the uncompressed data.*/
/**/
/*****************************************************************************/
#include <stdint.h>
#include <limits.h>

#define LZSS_EOD4095
#define LZSS_WINDOW_SIZE4095

/*****************************************************************************/
/* The offset is always 12-bits so use a 16-bit type.*/
/*****************************************************************************/
typedef uint_fast16_t offset_t;

#if CHAR_BIT == 8

/*****************************************************************************/
/* The max length is 2^15-1+18, which can fit in a 16-bit type.*/
/*****************************************************************************/
typedef uint_fast16_t length_t;

/*****************************************************************************/
/* Flags is always of length 1 char.*/
/*****************************************************************************/
typedef uint_fast8_t  flags_t;

#elif CHAR_BIT == 16

/*****************************************************************************/
/* The max length =s 2^16-1+17, which may not fit in a 16-bit type, so use a */
/* 32-bit type.*/
/*****************************************************************************/
typedef uint_fast32_t length_t;

/*****************************************************************************/
/* Flags is always of length 1 char.*/
/*****************************************************************************/
typedef uint_fast16_t flags_t;

#else
#error Illegal value for CHAR_BIT
#endif

/*****************************************************************************/
/* MSP copy tables can handle moving functions even in small data model +*/
/* large code model, where data pointers are not big enough to represent*/
/* function pointers.  This requires the EABI decompression functions*/
/* (SHARED/copy_*.c) to be changed to accept "far" pointers.  For this*/
/* memory model combination, the decompression functions are changed to use  */
/* "unsigned long" to represent function pointers, so function pointers*/
/* through which we call these functions also needs to have a prototype*/
/* accepting "unsigned long" instead of pointer types.  All other memory*/
/* model combinations use the same prototype that all the other targets use: */
/* two data pointer arguments.  Ultimately we use MSP peek/poke intrinsics*/
/* to read/write the "far" memory.*/
/*****************************************************************************/
#if defined(__MSP430__) && defined(__LARGE_CODE_MODEL__) && !defined(__LARGE_DATA_MODEL__)
typedef unsigned long pointer_t;
typedef unsigned long pointer_to_const_t;
#define READ_CHAR_ADV(x)__data20_read_char(x++)
#define WRITE_CHAR_ADV(x, c) __data20_write_char(x++, c)
#else
typedefunsigned char *pointer_t;
typedef const unsigned char *pointer_to_const_t;
#define READ_CHAR_ADV(x)(*x++)
#define WRITE_CHAR_ADV(x,c) (*x++ = (c))
#endif

/*****************************************************************************/
/**/
/* __TI_DECOMPRESS_LZSS() - Decompress data encoded using LZSS encoding.*/
/*Input buffer (inbuf) has the encoded data and*/
/*uncompressed data is returned in outbuf.*/
/**/
/*****************************************************************************/
__attribute__((section(".text:decompress:lzss")))
void __TI_decompress_lzss(pointer_to_const_t inbuf, pointer_t outbuf)
{while (1){flags_t flags = READ_CHAR_ADV(inbuf);int i;for (i=0; i<CHAR_BIT ; i++){if (flags & 0x1){/*---------------------------------------------------------------*//* We have an uncoded byte, just write it out.*//*---------------------------------------------------------------*/WRITE_CHAR_ADV(outbuf, READ_CHAR_ADV(inbuf));}else{/*---------------------------------------------------------------*//* Read and unpack the offset and length*//*---------------------------------------------------------------*/offset_t offset;length_t length;
#if CHAR_BIT == 8offset = READ_CHAR_ADV(inbuf);length = READ_CHAR_ADV(inbuf);offset <<= 4;offset |= ((length & 0x00F0) >> 4);length = (length & 0x000F) + 3;/*---------------------------------------------------------------*//* If the length is 3->17, we only use 4 bits. If the length is  *//* >= 18, we read an additional 8 bits and add it to the length. *//**//* If the msb of the second byte is 1, we read an additional*//* 8 bits and use that for bits 7-14 of the length. This gives*//* us a range of 3->32785.*//*---------------------------------------------------------------*/if (length == 18){length_t length2 = READ_CHAR_ADV(inbuf);if (length2 & 0x80){length_t length3 = READ_CHAR_ADV(inbuf);length2 = (length2 & 0x7f) | (length3 << 7);}length += length2;}
#elif CHAR_BIT == 16unsigned char temp = READ_CHAR_ADV(inbuf);length = (temp & 0xf) + 2;offset = temp >> 4;/*---------------------------------------------------------------*//* If the length is the maximum value encoded in 4 bits, read an *//* additional 16-bit value and add it to the length.*//*---------------------------------------------------------------*/if (length == 17)length += READ_CHAR_ADV(inbuf);
#endif/*---------------------------------------------------------------*//* If the offset indicates end of data, exit.*//*---------------------------------------------------------------*/if (offset == LZSS_EOD)return;/*---------------------------------------------------------------*//* Copy the decoded string from sliding window to output buffer. *//*---------------------------------------------------------------*/length_t j;pointer_t pos = outbuf - offset - 1;for (j = 0; j < length; j++)WRITE_CHAR_ADV(outbuf, READ_CHAR_ADV(pos));}flags >>= 1;}}
}


Eirwen:

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

zhisheng xiong:

请问copy_decompress_lzss.c这个文件是什么作用?以及是在main函数运行之前启用吗?为什么我会卡在这个文件里面呢?

TMS320F28335: 有没有对应的DSPLIB库

jiabao wu阅读(38)

Part Number:TMS320F28335

有没有实现FFT的库函数

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Lydia:

您好,这个帖子的客户和您有类似的需求,请看看这个帖子能否解决您的问题,

e2e.ti.com/…/1670777

LAUNCHXL-F28379D: 对于CLA的一些疑问

Ken true阅读(36)

Part Number:LAUNCHXL-F28379D

TI的工程师们你们好,

我想请问一下CLA的对于CLA task的中断寄存器,注册了对应的寄存器后其时序是否是先执行对应的CLA task,在执行完对应的CLA task后再执行对应的中断呢?

(比如我设置了CLA task1,然后在上图中选中为TASK1注册中断,是否时序是在触发task1执行,执行完task1任务后再执行对应task1的中断呢?)

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

TMS320F28035: 串口下载报错

drly Dan阅读(35)

Part Number:TMS320F28035

 请问串口下载显示这个错误是什么问题

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

TMS320F28377D: 如何让SPI主机连续接收16位以上的来自从机的数据?

yutao liu阅读(49)

Part Number:TMS320F28377D

我们知道,SPI通信虽然为全双工,但要读取从机的数据,方式为主机主动发送数据给从机来读取,且28377D这个芯片的接收和发送缓存只有16个字;

如果我想实现连续读取超过16个字以上的数据,出现了以下问题:
1、当我SPI主机发送了16位数据的时候(用于读取SPI从机数据),我的SpiaRegs.SPIFFRX.bit.RXFFST却只有2个字的数据,这导致我不得不停止对SPI从机的读取(即停止发送),否则我将会丢失后面的数据;

我该如何处理才能够让SPI主机连续读取16位以上的数据呢???,记住是连续!!!而不是每16位的读取,是一次性!!!

希望看到这个贴子的技术人员能够帮我解决这个问题,谢谢!!!

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

TMS320SPC0200是什么类型的器件,为什么用UniFlash连接不上

Jing Huang阅读(42)

Other Parts Discussed in Thread:UNIFLASH

TMS320SPC0200是什么类型的器件,为什么用UniFlash连接不上,已知芯片未加密未上锁!

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

jing huang:

,

jing huang:

,

FRANK1:

感谢您对TI产品的关注!关于你的咨询,通过我们的系统中查不到这个TMS320SPC0200芯片。通过芯片丝印也查不到。

www.ti.com/…/partlookup.tsp

TMS320F280049C: 在CLA中调用GPIO_writePin和GPIO_togglePin,IO没有反应

John Pan阅读(34)

Part Number:TMS320F280049C

在CLA中调用GPIO_writePin和GPIO_togglePin,IO没有反应

请问该如何解决?

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

YuanZe Wang:

GPIO要配置由CPU控制或CLA控制

,

John Pan:

好的,可以了,谢谢

© 2025 TI中文支持网   网站地图 鲁ICP备2022002796号-1