Yim_Hom 发表于 2025-2-22 00:38:30

没用过你这个芯片,但是专门帮你看了手册,功能是有的:

那使用P5.4口的时候,你得在下载选择里确认 “复位脚用作IO口”


下面的是验证过的:


void PWMA_config(void)
{
      P_SW2 |= 0x80;                //SFR enable   

      PWMA_PSCR = 0;      // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
      PWMA_DTR= 0;      // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
                                        //                              0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
      PWMA_ARR    = 0xffff;      // 自动重装载寄存器,控制PWM周期
      PWMA_CNTR         = 0;                //清零编码器计数器值
      PWMA_SR1    = 0;
      PWMA_SR2    = 0;
      PWMA_PS   = 0;
      PWMA_ENO    = 0;                //IO禁止输出PWM,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P

      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_PS    |= 0;                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
      PWMA_PS    |= (0<<2);      // 选择IO, 0:选择P1.2 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3,
      PWMA_IER    = 0x02;                // 使能中断
      PWMA_CR1    = 0x01;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}




//========================================================================
// 函数: void PWMA_ISR(void) interrupt PWMA_VECTOR
// 描述: PWMA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-6-1
//========================================================================
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
      if(PWMA_SR1 & 0x02)      //编码器中断
      {
                PWMA_SR1 &= ~0x02;
                pulse = PWMA_CNTR;      //读取当前编码器计数值
                B_Change = 1;                //标志已有捕捉值
      }
}

Yim_Hom 发表于 2025-2-22 00:46:53

我的用户名 发表于 2025-2-21 15:42
有清中断的,估计是配置不对,读不到脉冲数值,我没有STC32的MCU,我用的是STC8H1K08 SOP16,估计是PWM配置 ...

我这个也是8h系列,不是stc32.

梁工 发表于 2025-2-22 11:50:22

8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器了。
使用PWMB的P1.7、P5.4可以接编码器,你试试。

我的用户名 发表于 2025-2-22 15:00:16

Yim_Hom 发表于 2025-2-22 00:46
我这个也是8h系列,不是stc32.
非常感谢前辈不厌其烦的帮助,谢谢!

我的用户名 发表于 2025-2-22 15:02:20

梁工 发表于 2025-2-22 11:50
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器 ...

感谢梁老师的指导,我去试试,谢谢!

Yim_Hom 发表于 2025-2-22 15:30:39

梁工 发表于 2025-2-22 11:50
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器 ...

梁工,我是一点点抠手册看的回答这个问题,没在手册里看到这句备注。。。

Yim_Hom 发表于 2025-2-22 15:31:06

我的用户名 发表于 2025-2-22 15:00
非常感谢前辈不厌其烦的帮助,谢谢!

正好写过这个。。。这不,还没帮上忙。。。

我的用户名 发表于 2025-2-22 15:37:47

Yim_Hom 发表于 2025-2-22 15:30
梁工,我是一点点抠手册看的回答这个问题,没在手册里看到这句备注。。。 ...

我看了手册加上实验不行之后有点怀疑这个,但是不敢确认,所以才发帖求助的

我的用户名 发表于 2025-2-22 15:41:09

Yim_Hom 发表于 2025-2-22 15:31
正好写过这个。。。这不,还没帮上忙。。。

您客气了,您这份热心肠就值得感谢!我们新人学习“最绕人的PWM”确实需要像您这样热心肠的前辈的帮助,可以少走一些弯路{:baoquan:}

我的用户名 发表于 2025-2-22 16:01:07

梁工 发表于 2025-2-22 11:50
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器 ...

试过了,OK了,多谢梁老师的指导,谢谢!
页: 1 [2] 3
查看完整版本: 求助:8H1K08 SOP16接编码器读不到脉冲数字 [已解决]