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.

[参考译文] TMS320F28335:TMS320F28335

Guru**** 2582405 points
Other Parts Discussed in Thread: TMS320F28335, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1039931/tms320f28335-tms320f28335

器件型号:TMS320F28335
Thread 中讨论的其他器件: controlSUITE

大家好、

我目前有一个从函数发生器生成的 PWM 信号。 我 需要在其中添加一个"可编程相位延迟"。 我 想使用"TMS320F28335电路板"来执行它。

因此、MCU 板需要复制"外部 PWM 信号"、然后在其中添加"已编程的相位延迟"。 我想我们可以使用 ECAP 模块来实现这一点。

我 在    controlSUITE 支持器件上找到一个"ECAP_CAPTURE_PWM"代码示例。 但是、 eCAP1引脚在这个代码中从 ePWM3A 引脚获取输入(请注意、在我的情况下、输入将来自一个外部函数发生器)。  您能不能建议我如何在我的用途中使用该示例代码。 我在此附上了代码。 请检查。

提前感谢、

此致大家

//######################################################################################################################
//
//文件:example_2833xECap_Capture_PWM.c
//
//标题:ECAP 捕获 PWM 示例
//
//! 添加到组 F2833x_example_list
//!

ECAP 捕获 PWM (ECAP_CAPTURE_PWM)


//!
//! 以下示例将 ePWM3A 配置为:
//! -向上计数
//! -周期从2开始,最高1000
//! -在 PRD 上切换输出
//!
//! eCAP1被配置为捕捉上升之间的时间
//! 和 ePWM3A 输出的下降沿。
//!
//! b 外部连接\n
//! - eCAP1位于 GPIO24上
//! - ePWM3A 在 GPIO4上
//! -将 GPIO4连接到 GPIO24。
//!
//! b 监视\b 变量\n
//! - ECap1IntCount -成功捕获
//! - ECap1通过计数-中断计数
//
//######################################################################################################################
//$TI 发行版:F2833x 支持库 v2.01.00.00 $
//$Release Date:Tue May 26 17:12:15 IST 2020 $
//版权所有:
//版权所有(C) 2009-2020 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//######################################################################################################################

//
//包含的文件
//
#include "DSP28x_Project.h"//器件头文件和示例 include 文件

//
//定义为计时器配置开始/结束周期
//
#define PWM3_TIMER_MIN 10.
#define PWM3_TIMER_MAX 8000

//
//函数原型
//
_interrupt void eCAP1_ISR (void);
void InitECapture (void);
空 InitEPwmTimer (空);
失效失效(失效);

//
//全局
//
UINT32 ECap1IntCount;
uint32 ECap1通过计数;
uint32 EPwm3TimerDirection;

//
//定义以跟踪计时器值的移动方式
//
#define ePWM_TIMER_UP 1.
#define ePWM_TIMER_DOWN 0

//
//主函
//
void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP2833x_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 DSP2833x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();//针对此示例跳过
InitEPwm3Gpio();
InitECap1Gpio();

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP2833x_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP2833x_PieVect.c 中找到
//
InitPieVectTable();

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ECAP1_INT =&eCAP1_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//
//步骤4. 初始化所有器件外设:
//此函数位于 DSP2833x_InitPeripherals.c 中
//
// InitPeripherals ();//此示例不需要
InitEPwmTimer();//对于本示例,只初始化 ePWM 计时器
InitECapture();

//
//步骤5. 特定于用户的代码、启用中断:
//

//
//初始化计数器
//
ECap1IntCount = 0;
ECap1PassCount = 0;

//
//启用连接到 ECAP1-4 INT 的 CPU INT4
//
IER |= M_INT4;

//
//在 PIE 中启用 eCAP INTn:组3中断1-6
//
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;

//
//启用全局中断和更高优先级的实时调试事件
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//
//步骤6. 空闲循环。 只需坐下来循环(可选)
//
for (;;)

_asm (" NOP");

//
// InitEPwmTimer -
//
无效
InitEPwmTimer()

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
EPwm3Regs.TBPRD = PWM3_TIMER_MIN;
EPwm3Regs.TBPHS.ALL = 0x00000000;
EPwm3Regs.AQCTLA.bit.PRD = AQ_TOGGLE;//打开 PRD

//
// TBCLK = SYSCLKOUT
//
EPwm3Regs.TBCTL.bit.HSPCLKDIV=1;
EPwm3Regs.TBCTL.bit.CLKDIV = 0;

EPwm3TimerDirection = ePWM_TIMER_UP;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

//
// InitECapture -
//
无效
InitECapture ()

ECap1Regs.ECEINT.ALL = 0x0000;//禁用所有捕捉中断
ECap1Regs.ECCLR.ALL = 0xFFFF;//清除所有 CAP 中断标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用 CAP1-CAP4寄存器加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//确保计数器被停止

//
//配置外设寄存器
//
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;//单次触发
ECap1Regs.ECCTL2.bit.STOP_Wrap = 3;//在4个事件时停止
ECap1Regs.ECCTL1.bit.CAP1POL = 1;//下降边沿
ECap1Regs.ECCTL1.bit.CAP2POL = 0;//上升边沿
ECap1Regs.ECCTL1.bit.CAP3POL = 1;//下降边沿
ECap1Regs.ECCTL1.bit.CAP4POL = 0;//上升边沿
ECap1Regs.ECCTL1.bit.CTRRST1 = 1;//差动操作
ECap1Regs.ECCTL1.bit.CTRRST2 = 1;//差动操作
ECap1Regs.ECCTL1.bit.CTRST3 = 1;//差动操作
ECap1Regs.ECCTL1.bit.CTRRST4 = 1;//差动操作
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用捕捉单元

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;//起始计数器
ECap1Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP1-CAP4寄存器加载
ECap1Regs.ECEINT.BIT.CEVT4 = 1;// 4个事件=中断

//
// eCAP1_ISR -
//
_interrupt void
eCAP1_ISR (空)

//
//电容输入是 SYC'ed 到 SYSCLKOUT 的、因此可能存在
// A +/- 1周期变化
//
if (ECap1Regs.CAP2 > EPwm3Regs.TBPRD*2+1 ||
ECap1Regs.CAP2 < EPwm3Regs.TBPRD*2-1)

fail();

if (ECap1Regs.CAP3 > EPwm3Regs.TBPRD*2+1 ||
ECap1Regs.CAP3 < EPwm3Regs.TBPRD*2-1)

fail();

if (ECap1Regs.CAP4 > EPwm3Regs.TBPRD*2+1 ||
ECap1Regs.CAP4 < EPwm3Regs.TBPRD*2-1)

fail();

ECap1IntCount++;

if (EPwm3TimerDirection = ePWM_TIMER_UP)

IF (EPwm3Regs.TBPRD < PWM3_TIMER_MAX)

EPwm3Regs.TBPRD++;

其他

EPwm3TimerDirection = ePWM_TIMER_DOWN;
EPwm3Regs.TBPRD--;


其他

IF (EPwm3Regs.TBPRD > PWM3_TIMER_MIN)

EPwm3Regs.TBPRD--;

其他

EPwm3TimerDirection = ePWM_TIMER_UP;
EPwm3Regs.TBPRD++;

ECap1PassCount++;

ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;

//
//确认此中断以接收来自组4的更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;

//
//失败-
//
无效
失败()

_asm (" ESTOP0");

//
//文件结束
//

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

    您好!

    ECAP 模块可用于捕获外部和内部信号的时间延迟和其他时序参数。 对于延迟外部 PWM 信号的要求、我认为 ECAP 不是一个好选择。  

    我们没有支持此要求的可用示例或功能。 我可以建议您获取 GPIO 引脚上的输入并添加硬编码的软件延迟。

    谢谢、

    Aditya