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

28335 eCAP模块配置问题

大家好,我在使用CAP模块时遇到了一些问题。

看了ti的几个eCAP例程,对其中的配置还是有一些疑问,例程里基本都要用到中断,然后eCAP1模块的CAP1-4都要用到,然后算频率之类的等等。

而我想实现的功能是:比如EPwm1A输出一个50Hz的方波,将该方波送入ECAP1口检测。检测上升沿时强制EPwm1B置高,检测下降沿时强制EPwm1B置低(其实就是检测电网电压过零点产生50Hz的方波去驱动一个逆变桥)。然后我看了eCAP模块在捕获事件发生时会将ECFLG寄存器中对应的状态位CEVTx置位。

但是我有两个疑问:

1. 如果不配置中断,状态位CEVTx在捕获事件发生时会被置位么?(实际上我就是不需要配置中断,因为最后这段程序本来就会运行在系统的中断程序里,没必要再加一个中断。)

2. 在使用ECAP1时,我可以只使用CAP1-2,3-4不使用么?因为我只需要捕获一个上升沿,EPwm1B置高,等待下一次上升沿;捕获一次下降沿,EPwm1B置低,等待下一次下降沿。

我按照这个想法去写了一个测试程序,没有出现正确现象,我感觉配置上也有一点问题,所以不确定是不是中断的原因。50Hz的pwm波是正常产生,接线也没有错,

我的ECAP1配置如下:

void SetCap1Mode(void)
{
    ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
    ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;

    ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
    ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;

    ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
    ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
    ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
    ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
    ECap1Regs.ECEINT.all = 0x0000; //stop all interrupt
    ECap1Regs.ECCLR.all = 0xFFFF;  //clare all flag
    ECap1Regs.ECCTL2.bit.REARM = EC_ARM;
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;     // 启动
    ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT2;
}

在主循环里是这样判断的(总感觉好像缺点什么,比如ECAP要不要重新再启动一下?)

while(1)
{
           if( ECap1Regs.ECFLG.bit.CEVT1 ==1 )//when cap the rising,the flag CEVT1 will be set automatically
           {
                   LED1 = ~LED1;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 2;
                   ECap1Regs.ECCLR.bit.CEVT1 = 1;  //clear the flag CEVT1 to wait for the next rising
           }

           if( ECap1Regs.ECFLG.bit.CEVT2 == 1 )//when cap the falling,the flag CEVT2 will be set automatically
           {
                   LED2 = ~LED2;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 1;
                   ECap1Regs.ECCLR.bit.CEVT2 = 1; //clear the flag CEVT2 to wait for the next falling
           }
  }

希望得到高手指点,谢谢!

mangui zhang:CEVT*是允许触发中断吧
你先使用CAP1-2打开中断试试功能能正常不

大家好,我在使用CAP模块时遇到了一些问题。

看了ti的几个eCAP例程,对其中的配置还是有一些疑问,例程里基本都要用到中断,然后eCAP1模块的CAP1-4都要用到,然后算频率之类的等等。

而我想实现的功能是:比如EPwm1A输出一个50Hz的方波,将该方波送入ECAP1口检测。检测上升沿时强制EPwm1B置高,检测下降沿时强制EPwm1B置低(其实就是检测电网电压过零点产生50Hz的方波去驱动一个逆变桥)。然后我看了eCAP模块在捕获事件发生时会将ECFLG寄存器中对应的状态位CEVTx置位。

但是我有两个疑问:

1. 如果不配置中断,状态位CEVTx在捕获事件发生时会被置位么?(实际上我就是不需要配置中断,因为最后这段程序本来就会运行在系统的中断程序里,没必要再加一个中断。)

2. 在使用ECAP1时,我可以只使用CAP1-2,3-4不使用么?因为我只需要捕获一个上升沿,EPwm1B置高,等待下一次上升沿;捕获一次下降沿,EPwm1B置低,等待下一次下降沿。

我按照这个想法去写了一个测试程序,没有出现正确现象,我感觉配置上也有一点问题,所以不确定是不是中断的原因。50Hz的pwm波是正常产生,接线也没有错,

我的ECAP1配置如下:

void SetCap1Mode(void)
{
    ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
    ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;

    ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
    ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;

    ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
    ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
    ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
    ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
    ECap1Regs.ECEINT.all = 0x0000; //stop all interrupt
    ECap1Regs.ECCLR.all = 0xFFFF;  //clare all flag
    ECap1Regs.ECCTL2.bit.REARM = EC_ARM;
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;     // 启动
    ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT2;
}

在主循环里是这样判断的(总感觉好像缺点什么,比如ECAP要不要重新再启动一下?)

while(1)
{
           if( ECap1Regs.ECFLG.bit.CEVT1 ==1 )//when cap the rising,the flag CEVT1 will be set automatically
           {
                   LED1 = ~LED1;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 2;
                   ECap1Regs.ECCLR.bit.CEVT1 = 1;  //clear the flag CEVT1 to wait for the next rising
           }

           if( ECap1Regs.ECFLG.bit.CEVT2 == 1 )//when cap the falling,the flag CEVT2 will be set automatically
           {
                   LED2 = ~LED2;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 1;
                   ECap1Regs.ECCLR.bit.CEVT2 = 1; //clear the flag CEVT2 to wait for the next falling
           }
  }

希望得到高手指点,谢谢!

mangui zhang:

大家好,我在使用CAP模块时遇到了一些问题。

看了ti的几个eCAP例程,对其中的配置还是有一些疑问,例程里基本都要用到中断,然后eCAP1模块的CAP1-4都要用到,然后算频率之类的等等。

而我想实现的功能是:比如EPwm1A输出一个50Hz的方波,将该方波送入ECAP1口检测。检测上升沿时强制EPwm1B置高,检测下降沿时强制EPwm1B置低(其实就是检测电网电压过零点产生50Hz的方波去驱动一个逆变桥)。然后我看了eCAP模块在捕获事件发生时会将ECFLG寄存器中对应的状态位CEVTx置位。

但是我有两个疑问:

1. 如果不配置中断,状态位CEVTx在捕获事件发生时会被置位么?(实际上我就是不需要配置中断,因为最后这段程序本来就会运行在系统的中断程序里,没必要再加一个中断。)

2. 在使用ECAP1时,我可以只使用CAP1-2,3-4不使用么?因为我只需要捕获一个上升沿,EPwm1B置高,等待下一次上升沿;捕获一次下降沿,EPwm1B置低,等待下一次下降沿。

我按照这个想法去写了一个测试程序,没有出现正确现象,我感觉配置上也有一点问题,所以不确定是不是中断的原因。50Hz的pwm波是正常产生,接线也没有错,

我的ECAP1配置如下:

void SetCap1Mode(void)
{
    ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
    ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;

    ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
    ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;

    ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
    ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
    ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
    ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
    ECap1Regs.ECEINT.all = 0x0000; //stop all interrupt
    ECap1Regs.ECCLR.all = 0xFFFF;  //clare all flag
    ECap1Regs.ECCTL2.bit.REARM = EC_ARM;
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;     // 启动
    ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT2;
}

在主循环里是这样判断的(总感觉好像缺点什么,比如ECAP要不要重新再启动一下?)

while(1)
{
           if( ECap1Regs.ECFLG.bit.CEVT1 ==1 )//when cap the rising,the flag CEVT1 will be set automatically
           {
                   LED1 = ~LED1;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 2;
                   ECap1Regs.ECCLR.bit.CEVT1 = 1;  //clear the flag CEVT1 to wait for the next rising
           }

           if( ECap1Regs.ECFLG.bit.CEVT2 == 1 )//when cap the falling,the flag CEVT2 will be set automatically
           {
                   LED2 = ~LED2;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 1;
                   ECap1Regs.ECCLR.bit.CEVT2 = 1; //clear the flag CEVT2 to wait for the next falling
           }
  }

希望得到高手指点,谢谢!

Serenity_pjb:

回复 mangui zhang:

ECFLG里面也有CEVTx的,代表的是某一个捕获事件发生后该标志位被置位。

大家好,我在使用CAP模块时遇到了一些问题。

看了ti的几个eCAP例程,对其中的配置还是有一些疑问,例程里基本都要用到中断,然后eCAP1模块的CAP1-4都要用到,然后算频率之类的等等。

而我想实现的功能是:比如EPwm1A输出一个50Hz的方波,将该方波送入ECAP1口检测。检测上升沿时强制EPwm1B置高,检测下降沿时强制EPwm1B置低(其实就是检测电网电压过零点产生50Hz的方波去驱动一个逆变桥)。然后我看了eCAP模块在捕获事件发生时会将ECFLG寄存器中对应的状态位CEVTx置位。

但是我有两个疑问:

1. 如果不配置中断,状态位CEVTx在捕获事件发生时会被置位么?(实际上我就是不需要配置中断,因为最后这段程序本来就会运行在系统的中断程序里,没必要再加一个中断。)

2. 在使用ECAP1时,我可以只使用CAP1-2,3-4不使用么?因为我只需要捕获一个上升沿,EPwm1B置高,等待下一次上升沿;捕获一次下降沿,EPwm1B置低,等待下一次下降沿。

我按照这个想法去写了一个测试程序,没有出现正确现象,我感觉配置上也有一点问题,所以不确定是不是中断的原因。50Hz的pwm波是正常产生,接线也没有错,

我的ECAP1配置如下:

void SetCap1Mode(void)
{
    ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
    ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;

    ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
    ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;

    ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
    ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
    ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
    ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
    ECap1Regs.ECEINT.all = 0x0000; //stop all interrupt
    ECap1Regs.ECCLR.all = 0xFFFF;  //clare all flag
    ECap1Regs.ECCTL2.bit.REARM = EC_ARM;
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;     // 启动
    ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT2;
}

在主循环里是这样判断的(总感觉好像缺点什么,比如ECAP要不要重新再启动一下?)

while(1)
{
           if( ECap1Regs.ECFLG.bit.CEVT1 ==1 )//when cap the rising,the flag CEVT1 will be set automatically
           {
                   LED1 = ~LED1;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 2;
                   ECap1Regs.ECCLR.bit.CEVT1 = 1;  //clear the flag CEVT1 to wait for the next rising
           }

           if( ECap1Regs.ECFLG.bit.CEVT2 == 1 )//when cap the falling,the flag CEVT2 will be set automatically
           {
                   LED2 = ~LED2;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 1;
                   ECap1Regs.ECCLR.bit.CEVT2 = 1; //clear the flag CEVT2 to wait for the next falling
           }
  }

希望得到高手指点,谢谢!

Serenity_pjb:

回复 mangui zhang:

试过了,只用CAP1-2是可以的,但是我要的那个功能好像还没实现,感觉是ECCTL1和ECCTL2没配置好

大家好,我在使用CAP模块时遇到了一些问题。

看了ti的几个eCAP例程,对其中的配置还是有一些疑问,例程里基本都要用到中断,然后eCAP1模块的CAP1-4都要用到,然后算频率之类的等等。

而我想实现的功能是:比如EPwm1A输出一个50Hz的方波,将该方波送入ECAP1口检测。检测上升沿时强制EPwm1B置高,检测下降沿时强制EPwm1B置低(其实就是检测电网电压过零点产生50Hz的方波去驱动一个逆变桥)。然后我看了eCAP模块在捕获事件发生时会将ECFLG寄存器中对应的状态位CEVTx置位。

但是我有两个疑问:

1. 如果不配置中断,状态位CEVTx在捕获事件发生时会被置位么?(实际上我就是不需要配置中断,因为最后这段程序本来就会运行在系统的中断程序里,没必要再加一个中断。)

2. 在使用ECAP1时,我可以只使用CAP1-2,3-4不使用么?因为我只需要捕获一个上升沿,EPwm1B置高,等待下一次上升沿;捕获一次下降沿,EPwm1B置低,等待下一次下降沿。

我按照这个想法去写了一个测试程序,没有出现正确现象,我感觉配置上也有一点问题,所以不确定是不是中断的原因。50Hz的pwm波是正常产生,接线也没有错,

我的ECAP1配置如下:

void SetCap1Mode(void)
{
    ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
    ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;

    ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
    ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;

    ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
    ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
    ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
    ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
    ECap1Regs.ECEINT.all = 0x0000; //stop all interrupt
    ECap1Regs.ECCLR.all = 0xFFFF;  //clare all flag
    ECap1Regs.ECCTL2.bit.REARM = EC_ARM;
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;     // 启动
    ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT2;
}

在主循环里是这样判断的(总感觉好像缺点什么,比如ECAP要不要重新再启动一下?)

while(1)
{
           if( ECap1Regs.ECFLG.bit.CEVT1 ==1 )//when cap the rising,the flag CEVT1 will be set automatically
           {
                   LED1 = ~LED1;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 2;
                   ECap1Regs.ECCLR.bit.CEVT1 = 1;  //clear the flag CEVT1 to wait for the next rising
           }

           if( ECap1Regs.ECFLG.bit.CEVT2 == 1 )//when cap the falling,the flag CEVT2 will be set automatically
           {
                   LED2 = ~LED2;
                   EPwm1Regs.AQCSFRC.bit.CSFB = 1;
                   ECap1Regs.ECCLR.bit.CEVT2 = 1; //clear the flag CEVT2 to wait for the next falling
           }
  }

希望得到高手指点,谢谢!

Serenity_pjb:

回复 mangui zhang:

试过只用CAP1-2利用中断可以测频率,但是我想要的功能还没实现,感觉是ECCTL1和ECCTL2配置还是有问题。

赞(0)
未经允许不得转载:TI中文支持网 » 28335 eCAP模块配置问题
分享到: 更多 (0)