用28335的ECAP功能对电机编码器脉冲计数
硬件连接方面CAP1通道接光耦隔离果的电机编码器A输出端,CAP2接B输出端
ECAP功能初始化之后,软件设定在A/B脉冲的上升沿进行捕捉,CEVT4第四个上升沿进入中断
设想正转的时候对A脉冲计数,反转的时候对B脉冲计数,代码如下
- interrupt void ISRCap2(void)//在B的上升沿有中断,进入中断判断
- {
- if(CAP1_IN == 0)//B脉冲的上升沿,判断A脉冲的状态,如果为低,表明A脉冲晚于B脉冲
- {
- DELAY_US(20);
- if(CAP1_IN == 0)
- {
- COUNT2 += 4;
- }//只对B脉冲计数,COUNT2是B的计数值
- }
- else if(CAP1_IN == 1)
- {
- DELAY_US(20);
- if(CAP1_IN == 1)
- {
- COUNT1 += 4;//对A脉冲计数,COUNT1是A的计数值
- }
- }
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
- ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
- }
通过示波器观测,正转和反转输出的脉冲是不同的,相位差90度,编码器输出正常。
在定时器中断中将COUNT1和COUNT2写入SRAM中,并通过VIEW-MEMORY进行观测,理论上来说,电机朝一个方向转动,按照软件写法,应该只有1个脉冲计数,实际发现无论正转还是反转,两个脉冲都有计数值,差别是一个计数多些,一个少些,比如正转时,A脉冲计数为800,B为200,反转则相反。
问题:为什么A和B会都有计数值?有可能是哪里的问题?
由于要用到3个电机,所以没有用28335自带的EQEP模块,而且现在硬件上已不能做改动,只能在软件上更改,通过读编码器脉冲确定正反转,算出角度了。