深圳湾 发表于 2026-3-20 11:10:04

请教关于使用PWM5&PWM6驱动EC11旋转编码

<p>使用的是EC11旋转编码器,之前使用PWMA是可以的,现在改到PWMB就驱动不起来了,请高手帮忙看下,是有哪里配置不正确,</p>
<pre><code class="language-c">void init_pwm()
{

/* 1.【时钟源选择】*/
/* STC8H1K08 默认使用系统时钟,此处无需额外配置 */

/* 2.【时基单元配置】*/
PWMB_ARR = 0xFFFF; /* 自动重装载值,设置为最大值 */
PWMB_CNTR = 10000; /* 计数器初始值,设为中间值防止溢出 */

/* 3.【PWM 引脚配置】*/
PWMB_ENO = 0x00; /* 关闭所有输出通道(配置前需清空)*/
PWMB_PS = 0x05;/* 配置引脚:PWMB5_2→P1.7, PWMB6_2→P5.4 */
/* PWMB_PS 位定义:
   * bit0: PWMB5_2 输入使能(EC11-A相)
   * bit2: PWMB6_2 输入使能(EC11-A相)
   */

/* 4.【捕获/比较模式配置】*/
PWMB_CCER1 = 0x11; /* 关闭捕获/比较使能寄存器 1*/
PWMB_CCER2 = 0x00; /* 关闭捕获/比较使能寄存器 2*/

/* 配置通道为输入捕获模式,并设置输入滤波器 */
/* 滤波器值 10 对应 64 个时钟周期,可有效消除编码器抖动 */
PWMB_CCMR1 = 0x01 + (10 &lt;&lt; 4); /* 通道 1:输入模式 + 滤波 */
PWMB_CCMR2 = 0x01 + (10 &lt;&lt; 4); /* 通道 2:输入模式 + 滤波 */
PWMB_SMCR = 2;               // 编码器模式, 模式1或模式2: 每个脉冲两个边沿加减2.   模式3: 每个脉冲四个边沿加减4.

/* 5.【死区时间配置】*/
PWMB_DTR = 0; /* 编码器模式无需死区时间 */

/* 6.【中断配置】*/
PWMB_SR1 = 0;    /* 清除中断标志位 1*/
PWMB_SR2 = 0;    /* 清除中断标志位 2*/
PWMB_IER = 0x02; /* 使能捕获/比较中断 */

/* 7.【启动 PWM 模块】*/
// PWMB_BKR = 0x80;/* 使能主输出 */
PWMB_CR1 |= 0x01; /* 启动计数器 */
}
</code></pre>

狂热主宰 发表于 2026-3-20 13:55:29

参考官方手册和例程可靠
其它渠道次之

深圳湾 发表于 2026-3-20 16:16:16

是改自官方例程,原代码用的是P2.0&P2.1,我改用P1.7&P5.4,用的STC8H1K17 QFN20 没有P2端口

深圳湾 发表于 2026-3-20 17:27:30

从P1.7和P5.4能读取到旋转时的电平信号
页: [1]
查看完整版本: 请教关于使用PWM5&PWM6驱动EC11旋转编码