Albsm 发表于 2025-7-31 16:17:21

求助,8h8k64u的PWMA、B两相能否做一路输出一路输入检查

如题,当前状况是使用PWMB_6输出了一路可配置频率及占空比的PWM信号,能否使用PWMA_1p+2p用作编码器输入检测,虽然在低频率的机械编码器上如EC11,使用普通的中断检测会更方便,但PWM有滤波和抖动处理,在使用更高线数的编码器时对时序的影响更小。

我遇到的问题是先行配置了PWMB输出了一路方波信号,但无法完成对PWMA的配置,当我取消PWMB的配置语句时   编码器可以正常使用。
相关代码稍后上传

Albsm 发表于 2025-7-31 16:47:04

************************************EC11初始化**************************************
void EC11_init(void)
{
      P1M0 &= ~0x05; P1M1 &= ~0x05;
        P5M0 &= ~0x10; P5M1 &= ~0x10;
       
        //当前初始化使用P1.0为A端口,P5.4为B端口
        PWMA_PSCR = 0;
        PWMA_ARR = 0xffff;
        PWMA_CNTR = 0;
        PWMA_ENO = 0;
        //PWMA_CCER1 = 0x00; //关闭通道以配置
       
        PWMA_CCMR1 = 0xA1;                                         // 通道模式配置为输入,接编码器 , 滤波器 80 时钟
        PWMA_CCMR2 = 0xA1;                                         // 通道模式配置为输入,接编码器 , 滤波器 80 时钟
        PWMA_CCER1 |= 0x55;                                        // 使能捕获/比较通道1、通道2
       
        //        PWMA_SMCR = 0x01;                                 // 编码器模式 1
        //        PWMA_SMCR = 0x02;                                 // 编码器模式 2       
        PWMA_SMCR = 0x03;                                         // 编码器模式 3
       
        PWMA_PS = 0;
        PWMA_IER = 0x02;                                                 // 使能中断
        PWMA_CR1 |= 0x01;                                         // 使能计数器
      EA = 1;

}
************************************中断26**************************************
void PWMA_ISR() interrupt 26
{
        if (PWMA_SR1 & 0X02)                                // 当捕获中断标志置1
        {
                //cnt_H = PWMA_CCR1H;                                // 读取计数值高8位
                cnt_L = PWMA_CCR1L;                                // 读取计数值低8位
                PWMA_SR1 &= ~0x02;                                // 清零捕获中断标志
                EC11_Handle();                                                        // 处理EC11数据
                P21=~P21;
        }
}
***********************************PWM输出初始化***************************************
void pwm_init(void)
{
        PWMB_CCER1 = 0x00;        //非捕获/比较输出,清零CCER1捕获比较寄存器
        PWMB_CCMR2 = 0x60;        //配置PWM6通道CCMR寄存器
        PWMB_CCER1 |= 0x30;        //使能cc6e cc6p输出通道
       
        PWMB_ARRH = (u8)(PWM_Period >> 8);
PWMB_ARRL = (u8)PWM_Period;
       
        PWMB_ENO = 0x00;        //清空PWMB输出使能
        PWMB_ENO |= 0x06;        //使能PWMB6输出
       
        PWMB_PS = 0x00;//高级 PWM 通道输出脚选择位
PWMB_PS |= Pwm_IO; //选择 PWMB输出通道
       
        //PWMB_BKR = 0x80;        //PWMB通道输出使能
        PWMB_CR1 |= 0x01; //开始计时
}
***********************************PWM输出设置***************************************
void Pwm_set(u16 cc)
{
        if(cc){
                PWMB_BKR = 0x80;
                lighth*=70;        //100均分周期Pwm_period   Pwm_period = 6999;
                PWMB_CCR6H = (u8)(cc >> 8); //设置占空比时间
                PWMB_CCR6L = (u8)(cc);
        }else PWMB_BKR = 0x00;//关闭PWMB输出使能
}

DebugLab 发表于 2025-7-31 17:57:28

PWMA和PWMB是相互独立的,互不影响,唯一的区别是PWMA支持互补输出,PWMB不支持

神农鼎 发表于 2025-7-31 18:28:32

可以

Albsm 发表于 2025-7-31 23:53:10

那我的代码应该怎么修改呢,我现在还不清楚是哪里出了问题

王昱顺 发表于 2025-8-2 10:57:35

Albsm 发表于 2025-7-31 23:53
那我的代码应该怎么修改呢,我现在还不清楚是哪里出了问题

能否给出完整的工程?
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1779&highlight=pwm%20%E7%A8%8B%E5%BA%8F&page=1&extra=#pid11526
或者参考这部分生成方波的程序进行移植,按道理讲PWMA和PWMB的寄存器都是分开的,不会相互影响。
页: [1]
查看完整版本: 求助,8h8k64u的PWMA、B两相能否做一路输出一路输入检查