外观
QY1503 正交旋转编码器示例
2026-09-14
本文将详细介绍如何使用 PWM 双相计数器读取 QY1503 正交旋转编码器,包含硬件连接、测试命令和测试结果,帮助开发者快速完成编码器功能验证。
PWM 双相计数器
RK3506 PWM1 外设支持 Biphasic Counter,可使用两路相位相差 90° 的脉冲信号进行硬件加减计数。双相计数通道 0 的输入映射如下:
A 相:PWM1_BIP_CNTR_A0
B 相:PWM1_BIP_CNTR_B0
计数器寄存器:PWM1_CH0
RT-Thread 设备:pwm@ff170000A、B 两路输入由硬件自动解码,不需要在应用层分别打开两个 PWM 设备。正反转方向由 A、B 两相的先后关系决定。
QY1503 正交旋转编码器
QY1503 是增量式正交旋转编码器模块,输出 A、B 两路相位相差 90° 的方波。编码器每转一圈会产生固定数量的脉冲,PWM 双相计数器根据两路信号的相位先后关系自动判断旋转方向并累加或递减计数。
本示例使用 4 倍频模式(PWM_BIPHASIC_MODE_4X),A、B 两路的上升沿和下降沿都会参与计数,因此每个编码器脉冲周期对应四个计数变化。计数器由硬件保存 32 位有符号计数值,应用程序只需周期性读取即可。
系统已预先注册 pwm@ff170000 设备并完成对应引脚复用,应用程序通过 PWM_CMD_BIPHASIC_CONFIG 配置双相计数模式即可。
硬件连接
断电后使用杜邦线连接 QY1503 与开发板。 首次接线建议先手动缓慢转动旋钮,确认计数方向和信号电平正常后再提高转速。
QY1503 RK3506 开发板
VCC ------------------ 3.3V
GND ------------------ GND
A ------------------ P0A0
B ------------------ P0A1核心示例代码
#define BIPHASIC_PWM_DEVICE "pwm@ff170000"
static int encoder_qy1503_example(void)
{
struct rt_device_pwm *pwm;
struct rt_pwm_biphasic_config config;
struct rt_pwm_biphasic_count value;
rt_err_t err;
const int mode = PWM_BIPHASIC_MODE_4X;
int i;
pwm = (struct rt_device_pwm *)rt_device_find(BIPHASIC_PWM_DEVICE);
if (!pwm)
{
rt_kprintf("PWM device %s not found\n", BIPHASIC_PWM_DEVICE);
return -RT_ENOSYS;
}
config.mode = mode;
config.continuous = RT_TRUE;
config.filter_enable = RT_FALSE;
config.filter_number = 0;
config.timer_value = 0;
err = rt_device_control(&pwm->parent, PWM_CMD_BIPHASIC_CONFIG, &config);
if (err != RT_EOK)
{
rt_kprintf("biphasic config failed: %d\n", err);
return err;
}
err = rt_device_control(&pwm->parent, PWM_CMD_BIPHASIC_START, RT_NULL);
if (err != RT_EOK)
{
rt_kprintf("biphasic start failed: %d\n", err);
return err;
}
rt_kprintf("biphasic mode %d started, sample for 10 seconds\n", mode);
for (i = 0; i < 10; i++)
{
rt_thread_mdelay(1000);
err = rt_device_control(&pwm->parent, PWM_CMD_BIPHASIC_GET_COUNT,
&value);
if (err != RT_EOK)
{
rt_kprintf("read count failed: %d\n", err);
return err;
}
rt_kprintf("[sync count=%d]\n", value.count);
}
rt_kprintf("test finished; counter remains enabled by hardware design\n");
return RT_EOK;
}运行示例
操作步骤
开发板运行程序后,在终端输入 encoder_qy1503_example 命令。程序启动 4 倍频双相计数,并每秒读取一次当前计数值,共采样 10 秒;测试期间缓慢顺时针、逆时针转动编码器即可观察计数变化。
msh />encoder_qy1503_example
biphasic mode 4 started, sample for 10 seconds
[sync count=0]
[sync count=0]
[sync count=302]
[sync count=476]
[sync count=678]
[sync count=180]
[sync count=-440]
[sync count=-579]
[sync count=-579]
[sync count=-579]
test finished; counter remains enabled by hardware design结果判断
- 编码器静止时,计数值保持不变。
- 一个方向旋转时,计数值持续递增。
- 反方向旋转时,计数值持续递减,跨过零点后可以显示为负数。
- 计数变化量取决于编码器分辨率、旋转速度和倍频模式。
顺时针对应递增还是递减由 A/B 接线顺序决定。交换 A、B 两相可以反转正方向。
故障排查
- 提示
PWM device pwm@ff170000 not found:确认当前固件已启用 PWM 双相计数功能,并通过list device命令检查设备是否注册。 - 计数始终为 0:检查编码器供电、地线、A/B 接线,以及开发板对应引脚是否已完成 PWM 双相计数复用。
