LandE 发表于 2024-5-2 10:42:34

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,还是有回差。
请问是我哪里配置的有问题,还是什么原因

LandE 发表于 2024-5-2 17:10:18

问题已解决,是应该从PWMA_CNTRH/PWMA_CNTRL中读取计数值,而不是从PWMA_CCR1H/PWMA_CCR1L。
CCR中的数值会表现出上文描述的行为,而CNT中数值变化很正常。
看手册里的 22.10.21正交编码器模式 例程,里面在中断处理函数中是
cnt_H = PWMA_CCR1H;
cnt_L = PWMA_CCR1L;
这样读取的数据,于是我也直接这样写了,所以看起来好像在不用中断的情况下,应该去读CNT而非CCR
页: [1]
查看完整版本: STC8H8K编码器模式有回差的问题 | 已解决