查看: 1160|回复: 0
收起左侧

教你玩转[17]_RVSTAR—正交编码器接口篇

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-6-9 18:24:56 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-6-9 19:30 编辑

    上期内容我们介绍了定时器的PWM输出功能,本期内容来介绍一下定时器的正交译码器功能(编码器接口)。正交译码器是和正交编码器外设配合使用的,可对编码器输入的脉冲进行计数进而实现速度测量,本期内容我们通过一个使用旋转编码器的计数小实验,来初步了解它的应用方法。

    • 系统环境: Windows 10-64bit
    • 软件平台: NucleiStudio IDE 202102版 或 PlatformIO IDE
    • 硬件需求: RV-STAR开发板 和 旋转编码器


    一、正交编码器

    正交编码器(Quadrature Encoder)是一种用于测量旋转速度和方向的传感器。常见的正交编码器有两个输出信号:A信道和B信道。每个信道可以对运动进行测量并产生数字脉冲,这两个脉冲的相位相差90度(因此称为“正交”),这使得你可以根据它们判断运动的方向,通过积分(累加)运算后,还可以用来测算距离。
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(1)

    上图中,A和B分别连接到两个传感器单元上,黑白相间的圆环称之为「栅格」。传感器单元和栅格的实现方式有很多种,包括「反射式传感器+反光率不同的栅格」「对射式传感器+镂空光栅」「霍尔传感器+磁极圆环」「触点+导轨」等。

    本次实验中,我们使用的是下图所示的市面上常见的旋转编码器(数字电位器):
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(2)


    二、GD32VF103的正交译码器

    正交译码器功能使用TIMERx_CH0和TIMERx_CH1引脚生成的CI0和CI1正交信号各自相互作用产生计数值。通过设置SMC=0x01、0x02或0x03来选择是仅由CI0、仅由CI1、或者由CI0和CI1来决定定时器的计数方向。在每个方向选择源的电平改变期间,DIR位是由硬件自动改变的。计数器计数方向改变的机制如下方的图表所示。

    正交译码器可以当作一个带有方向选择的外部时钟,这意味着计数器会在0和自动加载值之间连续地计数。因此,用户必须在计数器开始计数前配置TIMERx_CAR寄存器。
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(3)
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(4)


    三、实验部分

    首先需要参照如下的示意图,对RV-STAR开发板和旋转编码器进行连线:
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(5)
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(6)

    然后在集成开发环境中创建一个新工程,开始编写代码。

    首先需要对定时器的编码器接口进行配置,我们使用的是TIMER2的编码器接口,对应的是PA6和PA7引脚,首先要使能它们的外设时钟和复用时钟,然后配置为浮空输入模式

    接着需要创建定时器初始化参数结构体,对定时器的功能进行配置,其中需要注意的是要将结构体参数的预分频系数设为0,周期设为10000(即定时器的自动加载值,也可以设为其他值),然后需要将定时器的模式设置为TIMER_ENCODER_MODE2(编码器模式,使用CI0和CI1计数),然后将定时器的计数值配置为5000(这样读取定时器计数的初值就是5000),最后使能TIMER2。

    相关代码实现如下:
    1. void encoder_init()
    2. {
    3.     /* TIMER2_CH0 - PA6, TIMER2_CH1 - PA7 */
    4.     rcu_periph_clock_enable(RCU_GPIOA);
    5.     rcu_periph_clock_enable(RCU_AF);
    6.     gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);

    7.     rcu_periph_clock_enable(RCU_TIMER2);
    8.     timer_deinit(TIMER2);

    9.     /* initialize TIMER init parameter struct */
    10.     timer_parameter_struct timer_initpara;
    11.     timer_struct_para_init(&timer_initpara);
    12.     /* TIMER2 configuration */
    13.     timer_initpara.prescaler = 0;
    14.     timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
    15.     timer_initpara.counterdirection = TIMER_COUNTER_UP;
    16.     timer_initpara.period = 10000; /* set auto-reload value */
    17.     timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
    18.     timer_init(TIMER2, &timer_initpara);

    19.     /* select the encoder mode */
    20.     timer_slave_mode_select(TIMER2, TIMER_ENCODER_MODE2);
    21.     timer_counter_value_config(TIMER2, 5000); /* config the initial value */

    22.     timer_enable(TIMER2);
    23. }
    复制代码

    本次实验,我们通过串口的打印输出来查看编码器的计数值,因此在主程序中需要对串口进行初始化,然后在循环体中,每次读取依次定时器的计数值,再打印输出到串口。
    1. int main()
    2. {
    3.     encoder_init();
    4.     gd_com_init(GD32_COM0);

    5.     int counter = 0;
    6.     while (1) {
    7.         counter = timer_counter_read(TIMER2);
    8.         printf("Counter: %d\n", counter);

    9.         delay_1ms(500);
    10.     }
    11. }
    复制代码

    代码编写完成后,进行编译和上传,然后打开串口终端(波特率115200),可以查看到在串口终端中输出定时器的初值为5000:

    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(7)

    然后顺时针旋转编码器的旋钮,观察到计数值增加,并且每转动一个单位计数值增加4,符合芯片数据手册中的功能描述:
    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(8)

    逆时针旋转,计数值减少:

    GD32VF 单片机芯片及应用-教你玩转[17]_RVSTAR—正交编码器接口篇risc-v单片机中文社区(9)

    获取实验源码
    https://github.com/Nuclei-Software/nuclei-board-labs/tree/master/rvstar/timer/timer_encoder_counter






    上一篇:教你玩转[16]_RVSTAR—PWM使用篇
    下一篇:教你玩转[18]_RVSTAR—DMA数据传输篇
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-3-28 16:37 , Processed in 0.963512 second(s), 48 queries .

    快速回复 返回顶部 返回列表