28335的ECAP抽风啦
我用了ECAP2 ECAP3 ECAP4分别去检测无刷电机的U V W转子信号。刚开始发现第一次的上升沿或者下降沿中断,各个ECAP还挺正常的,再来一次沿跳变信号,这三个ECAP中的两个ECAP就不断的进入中断,根本停不下来。
后来改了改程序发现,这几个ECAP就进入一次中断,然后就再也不进了,每个ECAP产生且仅响应一次中断,而别的外设中断仍然正常运作。
下面贴一小段代码各位帮帮忙。 // Configure peripheral registers
ECap2Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap2Regs.ECCTL2.bit.CONT_ONESHT = 1; // One shot
ECap2Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events
ECap2Regs.ECCTL1.bit.CAP1POL = 0; // 默认上升沿触发
//ECap2Regs.ECCTL1.bit.CAP2POL = 1; // Falling edge
// ECap2Regs.ECCTL1.bit.CAP3POL = 0; // Rising edge
//ECap2Regs.ECCTL1.bit.CAP4POL = 0; // Falling edge
ECap2Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap2Regs.ECCTL2.bit.SYNCI_EN = 0; // Disable sync
ECap2Regs.ECCTL2.bit.SYNCO_SEL = 2; // Disable sync out
ECap2Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap2Regs.ECCTL1.bit.PRESCALE = 0;
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap2Regs.ECCTL2.bit.REARM = 1; // arm one-shot
ECap2Regs.ECEINT.bit.CEVT1 = 1;
ECap2Regs.ECEINT.bit.CEVT2 = 1; // CEVENT = interrupt interrupt void ISRCap2(void)
{
ControllerEventHandler(TRIGER);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap3Regs.ECCTL2.bit.REARM = 1;
}
interrupt void ISRCap3(void)
{
ControllerEventHandler(TRIGER);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap3Regs.ECCLR.all=0xFFFF;//clare all flag
ECap3Regs.ECCTL2.bit.REARM = 1;
}
interrupt void ISRCap4(void)
{
ControllerEventHandler(TRIGER);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap4Regs.ECCLR.all=0xFFFF;//clare all flag
ECap4Regs.ECCTL2.bit.REARM = 1;
} 配置过的2812 不知道是否有参考价值
void InitEv(void)
{
EvaRegs.DBTCONA.all = 0x0530; //使能死区定时器,分频40/16=2.5M,死区时间5*0.4us=2us
EvaRegs.T1CNT = 0; //定时器1初值设为0
EvaRegs.T1PR = 4652; //1K(4650)
EvaRegs.ACTR.all = 0x0066; //PWM2低有效,PWM1高有效,改变设置可使电机反转
EvaRegs.CMPR1=0;
EvaRegs.CMPR2=0;
EvaRegs.COMCONA.all = 0xA600; //比较器控制A
// EvaRegs.T1CMPR = 2400; //定时器1比较值
// EvaRegs.T1CON.all = 0x144E; //连续增模式,TPS系数40M/16=2.5M,T1使能
EvaRegs.T1CON.all = 0x1442; //定时器输入预定标时钟HSPCLK/16
/*配置通用定时器2用于正交编码QEP模块和捕获单元模块CAP */
EvaRegs.T2CON.all=0x1830; //仿真停挂起,双向递增/减计数,禁止定时器操作,定时器时钟来源QEP
//定时器重载条件保留,禁止定时器比较操作
EvaRegs.T2PR = 0xFFFF; //定时周期0xFFFF
EvaRegs.T2CNT = 0x7FFF; //设置定时初值为0x7FFF
/*配置通用定时器3用于精确时间测量,服务于M/T测速 */
EvbRegs.T3CNT = 0; //定时器3初始值,用于测量高频脉冲个数,M/T测速
EvbRegs.T3PR = 0xFFFF;
EvbRegs.T3CON.all = 0x1000; //连续增模式,输入时钟预定标为0(HSPCLK=75M,周期为13.33ns)
EvaRegs.CAPCONA.all=0; //复位捕获单元寄存器,QEP电路清0
EvaRegs.CAPCONA.bit.CAP1EDGE=1;//捕获单元检测上升沿
EvaRegs.CAPCONA.bit.CAP12TSEL=0;//捕获单元选择定时器为定时器2
EvaRegs.CAPFIFO.bit.CAP1FIFO=0; //清空CAP1FIFO
// EvaRegs.CAPCONA.bit.CAPRES = 0; //清除所有捕获单元寄存器,QEP电路清0
EvaRegs.EVAIFRC.bit.CAP1INT=1;//清中断标志位
EvaRegs.EVAIMRC.bit.CAP1INT=1;//CAP1中断使能
EvaRegs.CAPCONA.bit.CAPQEPN = 0; //禁止捕获单元1和2
// EvaRegs.T2CON.bit.TENABLE = 1; //使能定时器2
EvaRegs.T2CON.bit.TCLKS10 = 3; //启动T2计数QEP
} 找到问题鸟 跟ECAP自身配置没太大关系 问题出在中断里面的一个读取霍尔传感器的函数 此函数先是将ECAP模块用的引脚置为GPIO功能 再读取 读取完了再把那几个引脚复用给ECAP 去掉这个过程直接读取IO端口的数值就行 不用改变引脚的复用功能 zhangmangui 发表于 2014-5-28 22:45 static/image/common/back.gif
配置过的2812 不知道是否有参考价值
void InitEv(void)
{
如果IO的MUX被配置用于ECAP,对其进行读操作能有正常的结果么。 lzlz70707 发表于 2014-5-29 10:40 static/image/common/back.gif
如果IO的MUX被配置用于ECAP,对其进行读操作能有正常的结果么。
应该是不正确的 你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP引脚不能像2812那样既能检测上升沿,又能检测下降沿,28335的ECAP检测分为四个事件,如果设置CEVT1检测上升沿,CEVT2检测下降沿,同时设置两个事件引发中断,好像不可以。不知道你是怎么检测的?希望能看到我的留言并帮忙解答下,谢谢 我现在用dsp控制无刷直流电机,需要cap捕获三路霍尔位置信号来进行电子换相。这样的话,必须使每路信号的上升沿和下降沿触发中断啊!怎么解决呢? sdzhen 发表于 2014-6-26 23:46 static/image/common/back.gif
你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP ...
@lzlz70707 交流一下
帮忙解答 sdzhen 发表于 2014-6-26 23:49 static/image/common/back.gif
我现在用dsp控制无刷直流电机,需要cap捕获三路霍尔位置信号来进行电子换相。这样的话,必须使每路信号的上 ...
28335 每个ECAP都有四个CEVT 分别配置为FALLING和RISING 比如我是配置1 3Falling 2 4Rising,然后开 1 2的中断,3 4也可以开。就妥了 楼主好牛 lzlz70707 发表于 2014-6-30 10:34
28335 每个ECAP都有四个CEVT 分别配置为FALLING和RISING 比如我是配置1 3Falling 2 4Rising,然后开 1 2 ...
楼主,我现在用到28035的捕获,补一个频率大概为100Hz的方波的频率,但是出来的结果一直不对,4个捕获寄存器的值一直一样。这是怎么回事?谢谢! sdzhen 发表于 2014-6-26 23:46
你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP ...
同一个脉冲信号,一个检测上升沿,一个检测下降沿,怎么会同时引发中断呢?
页:
[1]