打印
[PIC®/AVR®/dsPIC®产品]

dsPIC30F2010的QEI接口初始化问题

[复制链接]
1778|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
犹豫的大三|  楼主 | 2017-3-2 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编码器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模块啊?希望能帮我分析一下,大三感激不尽了
沙发
犹豫的大三|  楼主 | 2017-3-3 09:35 | 只看该作者
这个问题非常奇怪。
一开始我认为可能是系统时钟没有达到我期望的那样,然并卵,用定时器中断翻转IO口,通过示波器发现时间和预期的一样。这个假设不对了

使用特权

评论回复
板凳
犹豫的大三|  楼主 | 2017-3-4 11:44 | 只看该作者
然后考虑会不会其他模块配置的时候影响了QEI模块。我新建一个工程,只初始化qei模块。然后结果还是老样子

使用特权

评论回复
地板
犹豫的大三|  楼主 | 2017-3-4 11:51 | 只看该作者
我把qei配置成普通定时器,时钟源选择的是内部时钟。通过IO口反转测试定时时间,时间和我预期的一样,作为普通定时器可以正常工作。然后我把QEI定时器的时钟源切换成QEA引脚外部时钟输入。QEI引脚输入10000个频率10kHz的占空比50%的方波,POSCNT寄存器的计数值是3334。正常应该是10000,还是只有正确值的1/3。

使用特权

评论回复
5
犹豫的大三|  楼主 | 2017-3-4 11:54 | 只看该作者
我在定时器中断里翻转IO口时发现翻转的最大频率是400kHz,有朋友试过这个吗?应该不会这么慢的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

494

帖子

9

粉丝