主题中讨论的其他器件: C2000WARE
我已经执行了实验7_10来使用 ECAP 模块捕获 EPWM1A (GPIO00)的数字信号、并通过观察窗口测量仿真器上的占空比和周期。 在这里、GPIO00 ePWM 连接到 GPIO24。 该实验工作得很好。
现在、我的任务是从外部捕获具有不同占空比作为输入的数字信号(而不是来自 ePWM GPIO0) 和通过观察窗口测量仿真器上的占空比和周期、 然后分别生成两个互补 ePWM 信号作为 GPIO2 EPWM2A 和 GPIO4 EPWM3A 上的输出、测量的占空比和周期相同。
为了执行上述任务、我需要在实验7_10中进行哪些更改? 社区成员请提出建议
实验7_10代码:
//
// Lab7_10:TMS320F28335
//(c) Frank Bormann
//
//######################################################################################################################
//
//文件:Lab7_10.c
//
//标题:DSP28335ControlCARD;ePWM1A 1KHz 输出
//以及使用 eCAP1进行测量
// Lab7_10的解决方案文件
//######################################################################################################################
// Ver| dd mmm yyyy | WER |更改说明
//=== =================== =========== ================================================================================================
// 3.0 | 2009年5月12日| F.B. |用于 F28335的 Lab7_10;
// 3.1 | 2009年11月11日|用于 F28335和 PE 修订版5的 F.B | Lab7_10
//######################################################################################################################
#include "DSP2833x_Device.h"
//外部函数原型
extern void InitSysCtrl(void);
extern void InitPieCtrl (void);
extern void InitPieVectTable (void);
extern void InitCpuTimers (void);
extern void ConfigCpuTimer (struct CPUTIME_VARS *、float、float);
//此文件中找到的函数的原型语句。
void GPIO_select (void);
void Setup_ePWM1A (void);
void Setup_eCAP1 (void);
中断空 CPU_timer0_ISR (空);
中断空 eCAP1_ISR (空);
//全局变量
uint32 PWM_Duty;
uint32 PWM_PERIOD;
//######################################################################################################################
//主代码
//######################################################################################################################
void main (void)
{
int counter=0;//数字输出的二进制计数器
InitSysCtrl();// DSP2833x_sysctrl.c 中的基本内核初始化
EALLOW;
SysCtrlRegs.WDCR= 0x00AF;//重新启用看门狗
EDIS;// 0x00AF 要不禁用看门狗、预分频器= 64
DINT;//禁用所有中断
GPIO_SELECT ();// GPIO9、GPIO11、GPIO34和 GPIO49作为输出
//到外设学习板上的4个 LED
Setup_ePWM1A ();//初始化 ePWM1A
Setup_eCAP1 ();//初始化 eCAP1
InitPieCtrl();// PIE 表的基本设置;来自 DSP2833x_PIECTRL.c
InitPieVectTable();// PIE 中的默认 ISR
EALLOW;
PieVectTable.TINT0 =&CPU_timer0_ISR;
PieVectTable.ECAP1_INT=&eCAP1_ISR;
EDIS;
InitCpuTimer();//基本设置 CPU Timer0、1和2
ConfigCpuTimer (&CpuTimer0、150、100000);
PieCtrlRegs.PIEIER1.bit.INTx7=1;//启用 CPU 定时器0 INT
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;//在 PIE 组4中启用 ECAP1_INT
IER |= 0x0009;//启用 INT4和 INT1
EINT;
ERTM;
CpuTimer0Regs.TCR.bit.TSS = 0;//启动 timer0
while (1)
{
while (CpuTimer0.InterruptCount = 0);
CpuTimer0.InterruptCount = 0;
EALLOW;
SysCtrlRegs.WDKEY = 0x55;//服务 WD #1
EDIS;
COUNTER++;
if (COUNTER&1) GpioDataRegs.GPASET.bit.GPIO9=1;
否则 GpioDataRegs.GPACLEAR.bit.GPIO9=1;
if (counter&2) GpioDataRegs.GPASET.bit.GPIO11=1;
否则 GpioDataRegs.GPACLEAR.bit.GPIO11=1;
if (COUNTER&4) GpioDataRegs.GPBSET.BIO34 = 1;
否则 GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
if (COUNTER&8) GpioDataRegs.GPBSET.BIO49 = 1;
否则 GpioDataRegs.GPBCLEAR.bit.GPIO49=1;
}
}
void GPIO_select (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0;// GPIO15... GPIO0 =通用尸体 I/O
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// ePWM1A 有效
GpioCtrlRegs.GPAMUX2.ALL = 0;// GPIO31... GPIO16 =通用 I/O
GpioCtrlRegs.GPAMUX2.bit.GPIO24= 1;// eCAP1有效
GpioCtrlRegs.GPBMUX1.ALL = 0;// GPIO47... GPIO32 =通用 I/O
GpioCtrlRegs.GPBMUX2.ALL = 0;// GPIO63... GPIO48 =通用 I/O
GpioCtrlRegs.GPCMUX1.ALL = 0;// GPIO79... GPIO64 =通用 I/O
GpioCtrlRegs.GPCMUX2.ALL = 0;// GPIO87... GPIO80 =通用 I/O
GpioCtrlRegs.GPADIR.ALL = 0;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;//外设资源管理器:GPIO9上的 LED LD1
GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;//外设资源管理器:GPIO11上的 LED LD2
GpioCtrlRegs.GPBDIR.ALL = 0;// GPIO63-32作为输入
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//外设资源管理器:GPIO34上的 LED LD3
GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;//外设资源管理器:GPIO49上的 LED LD4
GpioCtrlRegs.GPCDIR.ALL = 0;// GPIO87-64作为输入
EDIS;
}
void Setup_ePWM1A (void)
{
EPwm1Regs.TZCTL.ALL = 0;
EPwm1Regs.TBCTL.bit.CLKDIV = 0;// CLKDIV = 1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;// HSPCLKDIV = 2
EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式
EPwm1Regs.AQCTLA.ALL = 0x0006;// ZRO =置1、PRD =清除
EPwm1Regs.TBPRD = 37500;// 1KHz - PWM 信号
}
void Setup_eCAP1 (void)
{
///----------------------------------------------------------
//--为捕捉配置 eCAP1单元
///----------------------------------------------------------
ECap1Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
ECap1Regs.TSCTR = 0;//清除计数器
ECap1Regs.CTRPHS = 0;//清除计数器相位寄存器
ECap1Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
//位15-11 00000:保留
//位10 0:APWMPOL、无关
//位9 0:CAP/APWM、0 =捕捉模式、1 = APWM 模式
//位8 0:SWSYNC、0 =无操作(无 s/w 同步)
//位7-6 10:SYNCO_SEL、10 =禁用 SYNC OUT 信号
//位5 0:SYNCI_EN、0 =禁用同步输入
//位4 1:TSCTRSTOP、1 =使能计数器
//位3 0:重新 ARM、0 =不重新 ARM、1 =重新 ARM
//位2-1 11:STOP_Wrap、11 = 4次捕捉后换行
//位0 0:CONT/ONESHT、0 =连续模式
ECap1Regs.ECCTL1.ALL = 0x01C4;// ECAP 控制寄存器1.
//位15-14 00:自由/软、00 =立即停止 TSCTR
//位13-9 00000:预分频、00000 = 1分频
//位8 1:CAPLDEN、1 =使能捕捉结果加载
//位7 1:CTRRST4、1 = CAP4事件上的复位计数器
//位6 1:CAP4POL、0 =上升沿、1 =下降沿
//位5 0:CTRRTST3、0 =在 CAP3事件发生时不复位计数器
//位4 0:CAP3POL、0 =上升沿、1 =下降沿
//位3 0:CTRRST2、0 =不在 CAP2事件上复位计数器
//位2 1:CAP2POL、0 =上升沿、1 =下降沿
//位1 0:CTRRST1、0 =不在 CAP1事件上复位计数器
//位0 0:CAP1POL、0 =上升沿、1 =下降沿
ECap1Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP 中断
//位15-8 0:保留
//位7 0:CTR=CMP、0 =禁用比较中断
//位6 0:CTR=PRD、0 =禁用周期中断
//位5 0:CTROVF、0 =溢出中断被禁用
//位4 0:CEVT4、0 =事件4中断被禁用
//位3 1:CEVT3、1 =事件3中断被使能
//位2 0:CEVT2、0 =事件2中断被禁用
//位1 0:CEVT1、0 =事件1中断被禁用
//位0 0:保留
}
中断空 CPU_timer0_ISR (空)
{
CpuTimer0.InterruptCount++;
EALLOW;
SysCtrlRegs.WDKEY = 0xAA;//服务 WD #2
EDIS;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
中断空 eCAP1_ISR (空)
{
ECap1Regs.ECCLR.bit.INT = 1;//清除 ECAP1中断标志
ECap1Regs.ECCLR.bit.CEVT3 = 1;//清除 CEVT3标志
//计算 PWM 占空比(上升沿到下降沿)
PWM_Duty =(int32) ECap1Regs.CAP2 -(int32) ECap1Regs.CAP1;
//计算 PWM 周期(上升沿到上升沿)
PWM_PERIOD =(Int32) ECap1Regs.CAP3 -(Int32) ECap1Regs.CAP1;
PieCtrlRegs.PIEACK.all = PIEACK_group4;//必须确认 PIE 组4
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//源代码结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================