RVMCU课堂「17」: 手把手教你玩转RVSTAR—正交编码器接口篇
扫描二维码
随时随地手机看文章
系统环境Windows 10-64bit
软件平台NucleiStudio IDE 202102版或 PlatformIO IDE
硬件需求RV-STAR开发板旋转编码器
正交编码器
正交编码器(Quadrature Encoder)是一种用于测量旋转速度和方向的传感器。常见的正交编码器有两个输出信号:A信道和B信道。每个信道可以对运动进行测量并产生数字脉冲,这两个脉冲的相位相差90度(因此称为“正交”),这使得你可以根据它们判断运动的方向,通过积分(累加)运算后,还可以用来测算距离。
上图中,A和B分别连接到两个传感器单元上,黑白相间的圆环称之为「栅格」。传感器单元和栅格的实现方式有很多种,包括「反射式传感器 反光率不同的栅格」「对射式传感器 镂空光栅」「霍尔传感器 磁极圆环」「触点 导轨」等。本次实验中,我们使用的是下图所示的市面上常见的旋转编码器(数字电位器):
GD32VF103的正交译码器
正交译码器功能使用TIMERx_CH0和TIMERx_CH1引脚生成的CI0和CI1正交信号各自相互作用产生计数值。通过设置SMC=0x01、0x02或0x03来选择是仅由CI0、仅由CI1、或者由CI0和CI1来决定定时器的计数方向。在每个方向选择源的电平改变期间,DIR位是由硬件自动改变的。计数器计数方向改变的机制如下方的图表所示。正交译码器可以当作一个带有方向选择的外部时钟,这意味着计数器会在0和自动加载值之间连续地计数。因此,用户必须在计数器开始计数前配置TIMERx_CAR寄存器。
实验部分
首先需要参照如下的示意图,对RV-STAR开发板和旋转编码器进行连线:
然后在集成开发环境中创建一个新工程,开始编写代码。首先需要对定时器的编码器接口进行配置,我们使用的是TIMER2的编码器接口,对应的是PA6和PA7引脚,首先要使能它们的外设时钟和复用时钟,然后配置为浮空输入模式。接着需要创建定时器初始化参数结构体,对定时器的功能进行配置,其中需要注意的是要将结构体参数的预分频系数设为0,周期设为10000(即定时器的自动加载值,也可以设为其他值),然后需要将定时器的模式设置为TIMER_ENCODER_MODE2(编码器模式,使用CI0和CI1计数),然后将定时器的计数值配置为5000(这样读取定时器计数的初值就是5000),最后使能TIMER2。相关代码实现如下:
void encoder_init()
{
/* TIMER2_CH0 - PA6, TIMER2_CH1 - PA7 */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
rcu_periph_clock_enable(RCU_TIMER2);
timer_deinit(TIMER2);
/* initialize TIMER init parameter struct */
timer_parameter_struct timer_initpara;
timer_struct_para_init(