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

第七十三章:CH32V103应用教程——TIM-编码器模式

[复制链接]

  离线 

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

    [LV.4]

    发表于 2021-5-1 00:15:06 | 显示全部楼层 |阅读模式

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

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

    x
    本帖最后由 草帽王子 于 2021-9-10 18:04 编辑

    编码器,是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。定时器可配置成编码器模式,本章教程主要对定时器编码器模式进行基本配置。


    1、TIM简介及相关函数介绍

    编码器模式是定时器的一个典型应用,可以用来接入编码器的双相输出,核心计数器的计数方向和编码器的转轴方向同步,编码器每输出一个脉冲就会使核心计数器加一或减一。使用编码器的步骤为:将SMS域置为001b(只在TI2边沿计数)、010b(只在TI1边沿计数)或者011b(在TI1和TI2双边沿计数),将编码器接到比较捕获通道1、2的输入端,给重装值寄存器设一个值,这个值可以设的大一点。在编码器模式时,定时器内部的比较捕获寄存器,预分频器,重复计数寄存器等都正常工作。下表表明了计数方向和编码器信号的关系。

    CH32V CH573单片机芯片-第七十三章:CH32V103应用教程——TIM-编码器模式risc-v单片机中文社区(1)


    2、硬件设计

    本章教程将TIM2配置成编码器模式,需要用到PA0(TIM2_CH1)和PA1(TIM2_CH2)两个引脚。这两个引脚与编码器的连接方式如下:
    • PA0连接编码器的B相输出;
    • PA1连接编码器的A相输出;

    注意:本章教程所用编码器为增量式旋转编码器。


    3、软件设计

    本章教程主要进行定时器TIM编码器模式的基本配置,具体程序如下:
    encoder.h文件
    1. #ifndef __ENCODER_H
    2. #define __ENCODER_H

    3. #include "ch32v10x_conf.h"

    4. void Encoder_Init_TIM2(void);
    5. void TIM2_IRQHandler(void);

    6. #endif
    复制代码
    encoder.h文件主要进行函数的声明;
    encoder.c文件

    1. #include "encoder.h"

    2. void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

    3. //TIM编码器模式配置函数
    4. void Encoder_Init_TIM2(void)
    5. {
    6.     GPIO_InitTypeDef        GPIO_InitStructure;
    7.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    8.     TIM_ICInitTypeDef       TIM_ICInitStructure;

    9.     //使能相应时钟
    10.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   //使能AFIO复用功能模块时钟

    13.     //GPIO初始化配置 TIM2_CH1(PA0)  TIM2_CH2(PA1)
    14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    15.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    16.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    17.     //定时器初始化配置
    18.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    19.     TIM_TimeBaseStructure.TIM_Period = 0xFFFF;                  //计数器自动重装载值
    20.     TIM_TimeBaseStructure.TIM_Prescaler = 1;                    //预分频器值
    21.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频
    22.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
    23.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数器值
    24.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);             //初始化结构体

    25.     TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //使用编码器模式3

    26.     //输入捕获配置
    27.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_1|TIM_Channel_2;
    28.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //输入捕获极性设置,可用于配置编码器正反相
    29.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;             //输入捕获预分频器设置
    30.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   //输入捕获通道选择,编码器模式需选用此配置
    31.     TIM_ICInitStructure.TIM_ICFilter = 10;                            //输入捕获滤波器设置
    32.     TIM_ICInit(TIM2, &TIM_ICInitStructure);
    33.    
    34.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);        //清除TIM更新标志位
    35.     TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);   //使能开启TIM中断
    36.     //Reset counter
    37.     TIM_SetCounter(TIM2,0);

    38.     TIM_Cmd(TIM2, ENABLE);
    39. }

    40. //中断服务函数
    41. void TIM2_IRQHandler(void)
    42. {
    43.     if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)    //是否产生更新(溢出)中断
    44.     {
    45.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清空TIM5中断标志位
    46.     }
    47. }
    复制代码
    encoder.c文件主要进行定时器的编码器模式配置,与应用教程第九章输入捕获类似。
    main.c文件
    1. int main(void)
    2. {
    3.         Delay_Init();
    4.         USART_Printf_Init(115200);
    5.     Encoder_Init_TIM2();

    6.         printf("SystemClk:%d\r\n",SystemCoreClock);
    7.         printf("This is encoder example\r\n");

    8.     while(1)
    9.     {
    10.         enc = TIM_GetCounter(TIM2);

    11.         TIM_SetCounter(TIM2,0);

    12.         printf("enc = %d\r\n", enc);

    13.         Delay_Ms(500);
    14.     }
    15. }
    复制代码
    main.c文件主要进行函数初始化以及计数器值的打印输出。


    4、下载验证

    将编译好的程序下载到开发板并复位,转动编码器,串口打印如下(其中正负代表方向):
    正转:
    CH32V CH573单片机芯片-第七十三章:CH32V103应用教程——TIM-编码器模式risc-v单片机中文社区(2)
    反转:
    CH32V CH573单片机芯片-第七十三章:CH32V103应用教程——TIM-编码器模式risc-v单片机中文社区(3)

    72、TIM-编码器模式配置.rar
    CH32V CH573单片机芯片-第七十三章:CH32V103应用教程——TIM-编码器模式risc-v单片机中文社区(4) 72、TIM-编码器模式配置.rar (485.25 KB, 下载次数: 13)
    链接:https://pan.baidu.com/s/1ee2QREm0XmiMmqFDseW5uw
    提取码:rr9b
    复制这段内容后打开百度网盘手机App,操作更方便哦








    上一篇:第七十二章:CH32V103应用教程——PWM输出-8路
    下一篇:第七十四章:CH32V103应用教程——按键控制LED灯
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-4-20 18:52 , Processed in 0.605243 second(s), 46 queries .

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