如题:
问题描述:我使用Ecap模块捕捉航模接收机输出的50hz脉冲,通过高电平的不同,来点亮不同的灯;但是
程序进入不了Read_radio()函数,逻辑上也没有错误,请教下 问题出在哪里?
void InitECapture1(void)
{
ECap1Regs.ECEINT.all = 0x0000; //禁止所有捕获中断
ECap1Regs.ECCLR.all = 0xFFFF; //清除所有CAP中断标志位
ECap1Regs.ECCTL1.bit.CAPLDEN = 0x0; //在捕捉时间禁止CAP1-CAP4寄存器装载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0x0; //确保计数器停止
ECap1Regs.ECCTL1.bit.PRESCALE=0x0; //预分频:1
// 配置ECCTL寄存器
ECap1Regs.ECCTL2.bit.CAP_APWM= 0x0; //0选择 CAP模式:1选择APWM模式
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0x1; //置0运行于连续模式,置1运行于单次模式
ECap1Regs.ECCTL2.bit.STOP_WRAP = 0x1; //在单次模式下:置3事件4停止;置2事件3停止;置1事件2停止;置0事件1停止
//在连续模式下:置3事件4清除;置2事件3清除;置1事件2清除;置0事件1清除
ECap1Regs.ECCTL1.bit.CAP1POL = 0x0; //置0上升沿触发,置1下降沿触发
ECap1Regs.ECCTL1.bit.CAP2POL = 0x1; //
ECap1Regs.ECCTL1.bit.CAP3POL = 0x0; //
ECap1Regs.ECCTL1.bit.CAP4POL = 0x1; //
ECap1Regs.ECCTL1.bit.CTRRST1 = 0x1; //置1时间差间隔运行,置0绝对时间标签运行
ECap1Regs.ECCTL1.bit.CTRRST2 = 0x1; //
ECap1Regs.ECCTL1.bit.CTRRST3 = 0x1; //
ECap1Regs.ECCTL1.bit.CTRRST4 = 0x1; //
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0x0; //0禁止sync-in;1使能sync-in
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0x2; //0直通sync-in=sync-out;1选择CTR=PRD内部同步信号为sync-out;2禁止sync-out
ECap1Regs.ECCTL1.bit.CAPLDEN = 0x1; //0禁止CAP1-4寄存器在捕捉时间装载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0x1; //启动计数器
ECap1Regs.ECCTL2.bit.REARM = 0x1; //单次强制
ECap1Regs.ECCTL1.bit.CAPLDEN = 0x1; //使能捕捉单元,在捕捉时间的时刻;使能CAP1-CAP4寄存器加载
ECap1Regs.ECEINT.bit.CEVT2 = 0x1; //4事件=中断
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
interrupt void ecap1_isr(void)
{
//声明局部变量
int ecap1_TSt1;
int ecap1_TSt2;
//提取捕捉到的脉冲
ecap1_TSt1 = ECap1Regs.CAP1; //时间戳t1
ecap1_TSt2 = ECap1Regs.CAP2; //时间戳t2
//中断计数器
ECap1IntCount++;
//匹配脉冲宽度,并置标志位
if((RC_INPUT_PERIO-(ecap1_TSt1*TIME_ELEMENT+ecap1_TSt2*TIME_ELEMENT))<1000)
{
Read_radio(ecap1_TSt2*TIME_ELEMENT);
}
//中断相关配置
ECap1Regs.ECCLR.bit.CEVT2 = 0x1; //
ECap1Regs.ECCLR.bit.INT = 0x1;
ECap1Regs.ECCTL2.bit.REARM = 0x1; //持续捕捉外部信号
// Acknowledge this interrupt to receive more interrupts from group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Read_radio(int rc_input)
{
if((rc_input-AUX_INPUT_1)<100)
{
ctr_mode_flag=MANNAL_CTR_FLAG; //自主飞行模式
//////////////////////////////////////////
LED1=1; //LED1灭
LED2=0; //LED1亮
//////////////////////////////////////////
DELAY_US(100000);
}
else if((rc_input-AUX_INPUT_0)<100)
{
ctr_mode_flag=AUTO_CTR_FLAG; //遥控飞行模式
//////////////////////////////////////////
LED1=0; //LED1亮
LED2=1; //LED1灭
///////////////////////////////////////////
DELAY_US(100000);
}
else
{
LED1=1; //LED1灭
LED2=1; //LED1灭
//Fail();
}
}
/////////////////////////////////////////////////////////////////////////////////////////
#define TIME_ELEMENT 0.00667 //系统时基,6.67ns
#define AUX_INPUT_0 1900//287999 //aux=0 高电平1900us
#define AUX_INPUT_1 1100//164917 //aux=1 高电平1100us
#define RC_INPUT_PERIO 20000//2879998 //接收机输出PWM周期,20000us
///////////////////////////////////////////////////////////////////////////////////////////////////////
jiangkun gong:
除此之外,使用航模接收机输出给Ecap捕捉每次中断停止查看ECap1Regs.CAP1和ECap1Regs.CAP2的数值,都不一样,
但是使用Epwm模块产生50hz的脉冲给Ecap捕捉,每次中断停止查看ECap1Regs.CAP1和ECap1Regs.CAP2的数值是一样,
这是为什么呢?