STC8H8K编码器模式有回差的问题 | 已解决
使用STC8H8K64U,PWMA配置为正交编码器,接EC11编码器,不使用中断。配置程序如下:
P2_MODE_IN_HIZ(GPIO_Pin_2);//高阻输入
P2_MODE_IN_HIZ(GPIO_Pin_0);
P2_PULL_UP_ENABLE(GPIO_Pin_2);//上拉
P2_PULL_UP_ENABLE(GPIO_Pin_0);
PWMA_ENO = 0x00; //失能所有PWM输出
PWMA_PS = 0x05; //引脚映射 PWM1P_2-P2.0 PWM2P_2-P2.2
PWMA_PSCRH = 0x00; //预分频寄存器
PWMA_PSCRL = 0x00;
PWMA_CCMR1 = 0x20 + 0x1; //滤波器4时钟 通道模式配置为输入
PWMA_CCMR2 = 0x20 + 0x2; //滤波器4时钟 通道模式配置为输入
PWMA_SMCR = 0x03; //编码器模式3
PWMA_CCER1 = 0x55; //配置通道使能和极性
PWMA_CCER2 = 0x55; //配置通道使能和极性
PWMA_CR1 |= 0x01; //使能计数器
实测可以从PWMA_CCR1H,PWMA_CCR1L读到数据,比如我一直向右拧,也是每格+4,这看起来正常。但是假如我先向右拧再向左拧,就会产生回差。
比如我先右拧一格,由0变4,再右拧一格,由4变8,再右拧一格,由8变12,这时左拧一格,本来它应该变回8,但是它会由12变11,然后再左拧,会变为7。。。
就是这里体现出一种类似回差的问题。
我觉得这个应该不是抖动的缘故,编码器很新且我硬件也有滤波,软件上尝试调整PWMA_CCMR1/2的滤波也没有效果。我尝试转的很慢也一样。
为排除硬件问题,我进一步测试,不转动编码器,而是将两个引脚配置为准双向模式,用代码操作引脚来模拟编码器电平,如下:
正转:
P20 = 0;
delay_ms(1);
P22 = 0;
delay_ms(1);
P20 = 1;
delay_ms(1);
P22 = 1;
delay_ms(1);
反转:
P22 = 0;
delay_ms(1);
P20 = 0;
delay_ms(1);
P22 = 1;
delay_ms(1);
P20 = 1;
delay_ms(1);
发现上述问题仍然存在,方向切换时拧的那一格计数只会改变1而不是改变4,还是有回差。
请问是我哪里配置的有问题,还是什么原因
问题已解决,是应该从PWMA_CNTRH/PWMA_CNTRL中读取计数值,而不是从PWMA_CCR1H/PWMA_CCR1L。
CCR中的数值会表现出上文描述的行为,而CNT中数值变化很正常。
看手册里的 22.10.21正交编码器模式 例程,里面在中断处理函数中是
cnt_H = PWMA_CCR1H;
cnt_L = PWMA_CCR1L;
这样读取的数据,于是我也直接这样写了,所以看起来好像在不用中断的情况下,应该去读CNT而非CCR
页:
[1]