dwwzl 发表于 2026-1-23 10:39:55

STC32G12K128的PWMA编码器模式支持PWM3P,PWM4P吗

线路板是之前绘制的,现在增加了编码器输入,只能如下配置引脚:

/*************功能说明    **************
PWMA模块工作于编码器模式
编码器A相输入: P2.4 PWM3P
编码器B相输入: P1.0 PWM1P
编码器模式, 模式3: 每个脉冲两个边沿加减

void PWMA_config(void)
{
    u8ps;

    // 高阻输入 P1.0,P1.1
    P1M0 = 0x00; P1M1 = 0x03;
    // 高阻输入 P2.2,P2.3,P2.4
    P2M0 = 0x00; P2M1 = 0x1c;

    P_SW2 |= 0x80;      //SFR enable   
    PWMA_ENO    = 0;    // IO输出禁止
    PWMA_IER    = 0;    // 禁止中断
    PWMA_SR1    = 0;    // 清除状态
    PWMA_SR2    = 0;    // 清除状态
    ps    = 0;
    PWMA_ISR_En = 0;

    PWMA_PSCRH = 0;   // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR
    PWMA_PSCRL = 0;
    PWMA_ARRH= 0x7f;// 自动重装载寄存器,控制PWM周期
    PWMA_ARRL= 0xff;
    PWMA_CNTRH= 0;    //清零编码器计数器值
    PWMA_CNTRL= 0;

    PWMA_CCMR1= 0x01+(10<<4); // 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
    PWMA_CCMR2= 0x01+(10<<4); // 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
    PWMA_SMCR   = 3;            // 编码器模式, 模式1或模式2: 每个脉冲两个边沿加减2.   模式3: 每个脉冲四个边沿加减4.
    PWMA_CCER1= 0x55;         // 配置通道输入使能和极性, 允许输入, 下降沿
    PWMA_CCER2= 0x55;         // 捕获/比较使能寄存器2
    ps    |= 0;               // PWM1P选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
    //ps    |= (1<<2);          // PWM2P选择IO, 0:选择P5.4 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3,
    ps    |= (1<<4);            // PWM3P选择IO, 0:选择P1.4 P1.5, 1:选择P2.4 P2.5, 2:选择P6.4 P6.5,
    //ps    |= (0<<6);          // PWM4P选择IO, 0:选择P1.6 P1.7, 1:选择P2.6 P2.7, 2:选择P6.6 P6.7, 3:选择P3.4 P3.3
    PWMA_PS   = ps;         // 选择IO

    PWMA_ISR_En |= 0x02;      // 使能中断
    PWMA_IER    = PWMA_ISR_En;// 设置允许通道1~4中断处理
    PWMA_CR1    = 0x01;         // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}
//PWMA_PS   = (0<<6)+(0<<4)+(0<<2)+0; //选择IO, 4项从高到低(从左到右)对应PWM1 PWM2 PWM3 PWM4, 0:选择P1.x, 1:选择P2.x, 2:选择P6.x,
//PWMA_PS    PWM4N PWM4P    PWM3N PWM3P    PWM2N PWM2P    PWM1N PWM1P
//    00       P1.7P1.6   P1.5P1.4   P1.3P5.4   P1.1P1.0
//    01       P2.7P2.6   P2.5P2.4   P2.3P2.2   P2.1P2.0
//    02       P6.7P6.6   P6.5P6.4   P6.3P6.2   P6.1P6.0
//    03       P3.3P3.4      --    --       --    --       --    --


void PWMA_ISR(void) interrupt PWMA_VECTOR
{
    u8sr1, sr2;
    sr1 = PWMA_SR1; //为了快速, 中断标志用一个局部变量处理
    PWMA_SR1 = 0;   //清除中断标志
    sr2 = PWMA_SR2; //为了快速, 中断标志用一个局部变量处理
    PWMA_SR2 = 0;   //清除中断重复标志
    sr1 &= PWMA_ISR_En; //每个通道可以单独允许中断处理

    if(sr1 & 0x02)//通道1 编码器1B边沿中断

    {
      Pulse = ((u16)PWMA_CNTRH << 8) + (u16)PWMA_CNTRL;   //读取当前编码器计数值
      B_Change = 1;       //标志已有捕捉值
    }   

}

结果是,Pulse一直为0,不知道是哪里的问题?
我用示波器测量,P1.0,P2.4端口脉冲输入正常
请教大家帮忙看看,是不是PWMA编码器模式不支持PWM3P,PWM4P呀?


DebugLab 发表于 2026-1-23 12:13:45

编码器:
PWM1P、PWM2P
PWM5、PWM6

dwwzl 发表于 2026-1-23 12:40:44

DebugLab 发表于 2026-1-23 12:13
编码器:
PWM1P、PWM2P
PWM5、PWM6

明白了,谢谢

王昱顺 发表于 2026-1-23 13:40:59

编码器模式只能固定几个引脚,具体可以查看从模式控制寄存器(PWMx_SMCR)的定义


所以PWMA只能在PWM1P,PWM2P上
PWMB只能在PWM5,PWM6上

dwwzl 发表于 2026-1-23 14:09:45

王昱顺 发表于 2026-1-23 13:40
编码器模式只能固定几个引脚,具体可以查看从模式控制寄存器(PWMx_SMCR)的定义




谢谢,目前只能改为端口中断方式计数了
页: [1]
查看完整版本: STC32G12K128的PWMA编码器模式支持PWM3P,PWM4P吗