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.
工具/软件:Code Composer Studio
我将使用 EPWM2生成 PWM 脉冲,并在 ECAP1上读取占空比和周期。 当我使用 GPIO5进行捕获时、一切都正常、但当选择 GPIO19/GPIO24时、寄存器不会更新。 我想其余的设置不需要受到干扰。
Dint; //禁用所有 CPU 中断
IER = 0x0000; //禁用所有外设中断
IFR = 0x0000; //清除所有中断标志
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=3 ; // 0=GPIO 1=EPWM3B 2=SPISIMOA 3=ECAP1
// GpioCtrlRegs.GPAPUD.bit.GPIO19=0;
// GpioCtrlRegs.GPAQSEL2.bit.GPIO19=0;
// GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 3;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1 ; // 0=GPIO 1=EPWM3B 2=SPISIMOA 3=ECAP1
EDIS;
///----------------------------------------------------------
//--为捕捉配置 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: 重新布防、0 =不重新布防、1 =重新布防
//位2-1 11: STOP_Wrap、11 = 4次捕捉后换行
//位0 0: CONT/ONESHT、0 =连续模式
ECap1Regs.ECCTL1.ALL = 0xC144; // ECAP 控制寄存器1
//位15-14 11: 自由/软、11 =忽略仿真挂起
//位13-9 00000: 预分频、00000 = 1分频
//位8 1: CAPLDEN、1 =启用捕捉结果加载
//位7 0: CTRRTST4、0 =不在 CAP4事件上复位计数器
//位6 1: CAP4POL、0 =上升沿、1 =下降沿
//位5 0: CTRRTST3、0 =不在 CAP3事件上复位计数器
//位4 0: CAP3POL、0 =上升沿、1 =下降沿
//位3 0: CTRRTST2、0 =不在 CAP2事件上复位计数器
//位2 1: CAP2POL、0 =上升沿、1 =下降沿
//位1 0: CTRRTST1、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: 保留
EALLOW;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1; //在 PIE 组4中启用 ECAP1_INT
PieVectTable.ECAP1_INT =&eCAP1_INT_ISR;
EDIS;
IER |= 0x0008; //在 IER 中启用 INT4以启用 PIE 组4
您好、Pujit、
C2000ware 随附 GPIO5、GPIO19和 GPIO24上 ECAP1输出的示例。 请尝试该示例。
C:\ti\c2000Ware_3_01_00_00\device_support\f2803x\examples\c28\ECAP_apwm
您好、先生、
感谢您的回复。 您建议的示例是在 ECAP 上生成 PWM,但我想在 ECAP 引脚上读取周期和占空比(Gpio19/GPIO24)
#include "DSP2803x_Device.h"
#include "DSP28x_Project.h" //器件头文件和示例 include 文件
#include "DSP2803x_examples.h"
#include "DSP2803x_GlobalPrototypes.h"
#include "math.h"
#include "IQmathLib.h"
#include
#include
int count1=0;
int count2=0;
int count3=0;
long i=0;
uint32 pwmDuty; //测得的 PWM 占空比
UINT32 PwmPeriod; //测得的 PWM 周期
uint32频率;
uint32速度;
//这些由链接器定义
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadSize;
extern UINT16 RamfuncsRunStart;
void init_epwm1();
void init_epwm2();
void init_epwm3();
void init_eCAP1();
void init_epwm1_int();
void init_epwm2_int();
void init_epwm3/int ();
void epwm1_int_isr();
void epwm2_int_isr ();
void epwm3/int_isr ();
void eCAP1_int_isr ();
void main (void)
{
InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
memcpy (((uint16_t *)&RamfuncsRunStart、(uint16_t *)&RamfuncsLoadStart、(unsigned long)&RamfuncsLoadSize);
InitFlash();
//初始化 DAC
// init_epwm1(); //初始化 epwm1调制器
init_epwm2();
// init_epwm3();
init_eCAP1();
// init_epwm1_int(); //初始化 epwm1中断
init_epwm2_int();
// init_epwm3/int ();
while (1)
{
EPwm2Regs.CMPA.half-CMPA=10;
对于(i=0;i<65530;i++)
{
}
EPwm2Regs.CMPA.half-CMPA=20;
对于(i=0;i<65530;i++)
{
}
}
}
void init_epwm1()
{
Dint; //禁用所有 CPU 中断
IER = 0x0000; //禁用所有外设中断
IFR = 0x0000; //清除所有中断标志
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1; //将 GPIO0配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1; //将 GPIO1配置为 EPWM1B
EDIS;
EPwm1Regs.TBCTL.bit.CLKDIV=7; //设置 PWM1块的时钟
EPwm1Regs.TBCTL.bit.HSPCLKDIV=7;
EPwm1Regs.TBPRD=33480;
EPwm1Regs.TBCTL.bit.CTRMODE=0x2; //设置 UP_DOWN 计数器模式
EPwm1Regs.TBCTL.bit.SYNCOSEL=0x1; //Selecting Down Stream Mode
EPwm1Regs.AQCTLA.bit.CAU=0x2; //为 ePWMA 设置操作
EPwm1Regs.AQCTLA.bit.CAD=0x1; //清除
EPwm1Regs.DBCTL.bit.OUT_MODE=0x3; //启用死区
EPwm1Regs.DBCTL.bit.POLSEL=0x2; //选择高电平有效互补模式
EPwm1Regs.DBFED=00; //将下降沿延迟设置为0 CLK 周期
EPwm1Regs.DBRED=00; //将上升沿延迟设置为0 CLK 周期
EPwm1Regs.CMPA.half.CMPA=16740;
}
void init_epwm2()
{
Dint; //禁用所有 CPU 中断
IER = 0x0000; //禁用所有外设中断
IFR = 0x0000; //清除所有中断标志
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //将 GPIO2配置为 EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1; //将 GPIO3配置为 EPWM2B
EDIS;
EPwm2Regs.TBCTL.bit.CLKDIV=7; //设置 PWM2块的时钟
EPwm2Regs.TBCTL.bit.HSPCLKDIV=7;
EPwm2Regs.TBPRD=40;
EPwm2Regs.TBCTL.bit.CTRMODE=0x2; //设置 UP_DOWN 计数器模式
EPwm2Regs.TBCTL.bit.SYNCOSEL=0x1; //Selecting Down Stream Mode
EPwm2Regs.AQCTLA.bit.CAU=0x2; //为 ePWMA 设置操作
EPwm2Regs.AQCTLA.bit.CAD=0x1; //清除
EPwm2Regs.DBCTL.bit.OUT_MODE=0x3; //启用死区
EPwm2Regs.DBCTL.bit.POLSEL=0x2; //选择高电平有效互补模式
EPwm2Regs.DBFED=00; //将下降沿延迟设置为0 CLK 周期
EPwm2Regs.DBRED=00; //将上升沿延迟设置为0 CLK 周期
EPwm2Regs.CMPA.half-CMPA=10;
}
void init_epwm3()
{
Dint; //禁用所有 CPU 中断
IER = 0x0000; //禁用所有外设中断
IFR = 0x0000; //清除所有中断标志
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO4=1; //将 GPIO3配置为 EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5=1; //将 GPIO4配置为 EPWM3B
EDIS;
EPwm3Regs.TBCTL.bit.CLKDIV=7; //设置 PWM2块的时钟
EPwm3Regs.TBCTL.bit.HSPCLKDIV=7;
EPwm3Regs.TBPRD=8370;
EPwm3Regs.TBCTL.bit.CTRMODE=0x2; //设置 UP_DOWN 计数器模式
EPwm3Regs.TBCTL.bit.SYNCOSEL=0x1; //Selecting Down Stream Mode
EPwm3Regs.AQCTLA.bit.CAU=0x2; //为 ePWMA 设置操作
EPwm3Regs.AQCTLA.bit.CAD=0x1; //清除
EPwm3Regs.DBCTL.bit.OUT_MODE=0x3; //启用死区
EPwm3Regs.DBCTL.bit.POLSEL=0x2; //选择高电平有效互补模式
EPwm3Regs.DBFED=00; //将下降沿延迟设置为0 CLK 周期
EPwm3Regs.DBRED=00; //将上升沿延迟设置为0 CLK 周期
EPwm3Regs.CMPA.half-CMPA=4185;
}
void init_eCAP1 ()
{
Dint; //禁用所有 CPU 中断
IER = 0x0000; //禁用所有外设中断
IFR = 0x0000; //清除所有中断标志
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=3 ; // 0=GPIO 1=EPWM3B 2=SPISIMOA 3=ECAP1
//GpioCtrlRegs.GPAMUX2.bit.GPIO19=3 ; // 0=GPIO 1=EPWM3B 2=SPISIMOA 3=ECAP1
EDIS;
///----------------------------------------------------------
//--为捕捉配置 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: 重新布防、0 =不重新布防、1 =重新布防
//位2-1 11: STOP_Wrap、11 = 4次捕捉后换行
//位0 0: CONT/ONESHT、0 =连续模式
ECap1Regs.ECCTL1.ALL = 0xC144; // ECAP 控制寄存器1
//位15-14 11: 自由/软、11 =忽略仿真挂起
//位13-9 00000: 预分频、00000 = 1分频
//位8 1: CAPLDEN、1 =启用捕捉结果加载
//位7 0: CTRRTST4、0 =不在 CAP4事件上复位计数器
//位6 1: CAP4POL、0 =上升沿、1 =下降沿
//位5 0: CTRRTST3、0 =不在 CAP3事件上复位计数器
//位4 0: CAP3POL、0 =上升沿、1 =下降沿
//位3 0: CTRRTST2、0 =不在 CAP2事件上复位计数器
//位2 1: CAP2POL、0 =上升沿、1 =下降沿
//位1 0: CTRRTST1、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: 保留
EALLOW;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1; //在 PIE 组4中启用 ECAP1_INT
PieVectTable.ECAP1_INT =&eCAP1_INT_ISR;
EDIS;
IER |= 0x0008; //在 IER 中启用 INT4以启用 PIE 组4
}
void init_epwm1_int ()
{
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1; //启用 epwm1 interupt
PieVectTable.EPWM1_INT =&epwm1_int_ISR; //将中断重定向到 ISR
EDIS;
IER |= M_INT3; //启用 CPU 中断3
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 epwm1中断
EPwm1Regs.ETSEL.bit.INTSEL=1; 发生 TBCTR=0000事件时为//中断
EPwm1Regs.ETPS.bit.INTPRD=1; //在第一个事件发生时生成中断
}
void init_epwm2_int ()
{
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1; //启用 epwm1 interupt
PieVectTable.EPWM2_INT =&epwm2_int_ISR; //将中断重定向到 ISR
EDIS;
IER |= M_INT3; //启用 CPU 中断3
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
EPwm2Regs.ETSEL.bit.INTEN = 1; //启用 epwm1中断
EPwm2Regs.ETSEL.bit.INTSEL=1; 发生 TBCTR=0000事件时为//中断
EPwm2Regs.ETPS.bit.INTPRD=1; //在第一个事件发生时生成中断
}
void init_epwm3_int ()
{
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx3=1; //启用 epwm1 interupt
PieVectTable.EPWM3_INT =&epwm3/int_ISR; //将中断重定向到 ISR
EDIS;
IER |= M_INT3; //启用 CPU 中断3
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
EPwm3Regs.ETSEL.bit.INTEN = 1; //启用 epwm1中断
EPwm3Regs.ETSEL.bit.INTSEL=1; 发生 TBCTR=0000事件时为//中断
EPwm3Regs.ETPS.bit.INTPRD=1; //在第一个事件发生时生成中断
}
中断空 epwm1_int_ISR (空)
{
EPwm1Regs.ETCLR.bit.INT=1; //清除中断标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; //确认 PIE 中断
IFR = 0x0000;
COUNT1 ++;
返回;
}
中断空 epwm2_int_isr (空)
{
EPwm2Regs.ETCLR.bit.INT=1; //清除中断标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; //确认 PIE 中断
IFR = 0x0000;
count2++;
返回;
}
中断空 epwm3_int_ISR (空)
{
EPwm3Regs.ETCLR.bit.INT=1; //清除中断标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; //确认 PIE 中断
IFR = 0x0000;
count3++;
返回;
}
中断空 eCAP1_INT_ISR (空)
{
PieCtrlRegs.PIEACK.all = PIEACK_group4; //必须确认 PIE 组
ECap1Regs.ECCLR.bit.INT = 1; //清除 ECAP1中断标志
ECap1Regs.ECCLR.bit.CEVT3 = 1; //清除 CEVT3标志
//计算 PWM 占空比(上升沿到下降沿)
PwmDuty =(int32) ECap1Regs.CAP2 -(int32) ECap1Regs.CAP1;
//计算 PWM 周期(上升沿到上升沿)
PwmPeriod =(Int32) ECap1Regs.CAP3 -(Int32) ECap1Regs.CAP1;
频率= PwmPeriod/342;
速度=(120*频率)/46;
返回;
}
请建议 我对以下代码进行哪些更改。
我正在读取另一个引脚上的信号。