dsPIC30F2010的QEI接口初始化问题

2019-03-25 18:53发布

编码器AB相信号通过74HC14进入dsPIC30F2010。用频率是100kHz的AB相信号测试硬件,测量dsPIC30F2010的QEA、QEB脚,波形很好,没有衰减和失真。INDX脚用4.7k的电阻上拉,位置计数器POSCNT通过匹配MAXCNT复位。
dsPIC30F2010外部晶振是无缘晶振6MHz,内部初始化程序如下:
_FOSC(XT_PLL16 & PRI & CSW_FSCM_OFF);  //配置内部时钟  6M*16
_FWDT(WDT_ON & WDTPSB_2);
_FBORPOR(MCLR_EN & PWRT_OFF);
_FGS(CODE_PROT_OFF);


QEI初始化程序如下:
ADPCFG |= 0x0038; // 将 QEI引脚配置为数字输入
QEICONbits.QEIM = 0; // 禁止 QEI模块
QEICONbits.CNTERR = 0; // 清除任何计数错误
QEICONbits.QEISIDL = 0; // 休眠期间继续工作
QEICONbits.SWPAB = 0; // QEA 和QEB 不交换
QEICONbits.PCDOUT = 0; // 正常 I/O引脚操作
QEICONbits.POSRES = 0; // 索引脉冲不复位位置计数器
QEICONbits.TQCS = 0;
QEICONbits.TQCKPS = 0;
//QEICONbits.TQGATE = 1;
//QEICONbits.UPDN_SRC = 1;
DFLTCONbits.CEID = 1; // 禁止计数错误中断
DFLTCONbits.QEOUT = 1; // 对于 QEn引脚,使能数字滤波器输出
DFLTCONbits.QECK = 0; // 将 QEn的数字滤波器设置为 1:1 时钟分频
  //DFLTCONbits.INDOUT = 1; // 使能索引引脚的数字滤波器输出
  //DFLTCONbits.INDCK = 4; // 将索引的数字滤波器设置为 1:64 时钟分频
POSCNT = 0; // 复位位置计数器
MAXCNT=0xffff;
QEICONbits.QEIM = 5; // X2 模式,位置计数器由Max复位
IEC2|=256;


现在的问题是,测试模块发送10000个频率是10kHz的AB相信号时,位置计数器POSCNT为6668左右,而且每一次的数值不固定。模式选择是X2模式,正确的POSCNT值应该是20000,现实是只有正确值的1/3。在AB相频率非常慢的时候POSCNT值是正确的,这个频率不会超过700Hz。

这个问题感觉就是QEI里面的数字滤波器设置不对,但是禁止数字滤波器输出后,POSCNT的值还是一样的,我把所有的滤波器分频都试了一遍了还是老样子。
有没有朋友用过PIC的QEI模块啊?希望能帮我分析一下,大三感激不尽了
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
犹豫的大三
2019-03-27 02:12
感谢@dingzy_2002 的热情帮助,在上周终于把这个问题解决了。解决办法我没有弄明白,特来再向大家请教。
由于新买的示波器到货,能存储的数据很多了,我可以把发送的10000个脉冲全部采集下来了。我在不接AB相单端信号采集板的时候,发现发送的脉冲是10000个,在接AB相单端信号采集板后,发送的脉冲竟然只有3300多个了顿时我就方了。 QQ截图20170314105117.png
查看电路图后,我感觉会是R1和R4两个压敏电阻的影响。果然去掉压敏电阻之后,一切都正常了。
之前我测试QEA和QEB的波形可是正常的啊,下面两张是有R1和R4的波形:
594219740967167615.jpg 806982581260604981.jpg
然后我又把拿了一块带R1和R4的板子测试QEA和QEB的波形:
843946187810818623.jpg 560241541721587915.jpg
这个问题我没法理解了,难道是R1和R4这两个压敏电阻影响了单端信号发生器?我那实际的编码器也试过,在编码器转的稍微快点,也就是600Hz左右后,脉冲计数也会丢的一塌糊涂。但是在去掉R1和R4之后就正常了。
由于急着发货,所以就把R1和R4去掉后发货了。后期我感觉把R1和R4换成TVS管再试一下。
但是这个压敏电阻为什么会有这个影响呢?一直想不明白了。。。。有朋友知道这个的原因吗?

一周热门 更多>