我的用户名 发表于 2025-2-21 12:36:33

求助:8H1K08 SOP16接编码器读不到脉冲数字 [已解决]

请教各位前辈:我用8H1K08 SOP16接一个编码器,按照手册上范例程序“23.10.22使用高级PWM实现编码器”,编码器A相接P1.0,编码器B相应该接P1.2,但是这个MCU没有P1.2,根据手册描述P1.2在P5.4口上,编码器B相接到P5.4,但是始终读取不到脉冲数字,模拟数码管显示一直是0,后来把编码器B相改接到P1.6,脉冲数字还是0,不知何故,还望各位前辈帮忙指正,谢谢!
串口通讯正常,因为我把pulse改成数值888后模拟数码管显示数值888正常,所以怀疑是PWM配置部分有问题。
中断是正常的,能进中断,能串口发送数据,只是pulse = PWMA_CNTR一直是0
想知道STC8H1K08 SOP16的P1.2是不是在P5.4?如果这个MCU没有P1.2、P5.4也不能用的话,用P1.6是否可以?我尝试B相接P5.4、P1.6,都不行,脉冲数值都是0

void PWMA_config(void)
{
      PWMA_PSCR = 0;// 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1)
      PWMA_ARR= 0xffff;// 自动重装载寄存器,控制PWM周期
      PWMA_CNTR         = 0;//清零编码器计数器值
      PWMA_ENO    = 0;      // IO输出禁止
      PWMA_CCMR1= 0x01+(10<<4);      // 通道1模式配置, 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
      PWMA_CCMR2= 0x01+(10<<4);      // 通道2模式配置, 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
      PWMA_SMCR   = 2;                        // 编码器模式, 模式1或模式2: 每个脉冲两个边沿加减2.   模式3: 每个脉冲四个边沿加减4.
      PWMA_CCER1= 0x55;                        // 配置通道输入使能和极性, 允许输入, 下降沿
      PWMA_CCER2= 0x55;                        // 配置通道输入使能和极性, 允许输入, 下降沿      
      PWMA_PS   = 0;                        // 选择IO,0:选择P1.0 P1.2
      PWMA_IER    = 0x02;      //设置允许通道1~4中断处理
      PWMA_CR1    = 0x01;                        // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}

void PWMA_ISR(void) interrupt 26
{
      if(PWMA_SR1 & 0x02)      //通道1 编码器中断
      {
                pulse = PWMA_CNTR;
                B_Change = 1;                //标志已有捕捉值
      }
      PWMA_SR1 =0;
}







编码器接线是按照梁老师的这个图接线的



正转或者反转编码器旋钮,串口都能看到有数据发送过来,模拟数码管显示的数值是0










我的用户名 发表于 2025-2-21 12:45:31

还望各位前辈不吝赐教,谢谢!

Yim_Hom 发表于 2025-2-21 13:22:22

官方有出专门的PWM使用例程的,你可以参考。
我的实测你也可以参考下:





官方例程中每次+=2,我选择了一个讨巧的办法实现+=1,实现从0-180控制舵机的demo,希望对你有用。
视频为实测结果:
616

Yim_Hom 发表于 2025-2-21 13:31:20

配置上你对照看一下,但是进中断后,你得在检测到中断后清中断啊
void PWMB_ISR(void) interrupt PWMB_VECTOR
{
        if(PWMB_SR1 & 0x02)        //编码器中断
        {
                PWMB_SR1 &= ~0x02;
                pulse = PWMB_CNTR;        //读取当前编码器计数值
                B_Change = 1;                //标志已有捕捉值
        }
}

我的用户名 发表于 2025-2-21 15:42:39

有清中断的,估计是配置不对,读不到脉冲数值,我没有STC32的MCU,我用的是STC8H1K08 SOP16,估计是PWM配置不对,但是我是按照手册上照抄的啊

我的用户名 发表于 2025-2-21 15:47:43

STC8H系列的应该都支持编码器的吧,我看手册上没明确说明哪些型号有这个功能、哪些型号没这个功能

我的用户名 发表于 2025-2-21 16:19:02

{:weixiao:}

我的用户名 发表于 2025-2-21 16:26:35

中断是正常的,能进中断,能串口发送数据,只是pulse = PWMA_CNTR一直是0

我的用户名 发表于 2025-2-21 16:29:50

想知道STC8H1K08 SOP16的P1.2是不是在P5.4?如果这个MCU没有P1.2、P5.4也不能用的话,用P1.6是否可以?我尝试B相接P5.4、P1.6,都不行,脉冲数值都是0

我的用户名 发表于 2025-2-21 16:46:18

还望各位前辈不吝赐教,谢谢!
页: [1] 2 3
查看完整版本: 求助:8H1K08 SOP16接编码器读不到脉冲数字 [已解决]