美文网首页STM32cubeMX&HAL库&MDK
STM32CUBEMX F103 HAL库开发 两路定时器的En

STM32CUBEMX F103 HAL库开发 两路定时器的En

作者: yltzdhbc | 来源:发表于2019-11-29 21:21 被阅读0次

    机器人开发过程中,对于直流电机来说,编码器至关重要,它不仅可以使我们对电极进行精确的速度闭环,位置闭环,还可以通过时间积分,根据运动学关系,获得速度、位置等信息

    STM32的定时器有编码器模式,大大的方便我们的开发

    使用STM32cubeMX配置工具,使得这个过程变得无比简单

    我使用STM32cubeMX 开发一个机器人中 使用两个定时器TIM3 和TIM4编码器模式读取编码器的值,做闭环控制

    STM32定时器编码器模式(Encoder Mode)

    CubeMX配置过程

    选择芯片过程不再赘述

    RCC: HSE高速总线始终改为外部晶振

    在这里插入图片描述

    SYS: DEBUG选择 SW模式

    在这里插入图片描述

    TIM3 TIM4 配置成定时器模式 Combined Channels: Encoder Mode

    encode_tim3.png
    encoder_tim4.png

    TIM3 TIM4 定时器分频配置: 这里分频数要注意一下,Prescaler 直接给0 ,Counter Period给65535,下面的Encoder Mode 如果是TI1的话就是只计数上升沿的脉冲,如果是TI2 andTI2 就是上下沿都计,脉冲是前一个的两倍

    tim_192.png tim_382.png

    TIM Encoder GPIO上拉模式配置,两个定时器四个引脚,全部改成 Pull-Up,即上拉模式,主要用于没有外部上拉的编码器读取时,可以确定引脚电平,防止出错

    GPIO.png

    时钟树配置

    时钟树

    工程配置 IDE选择 MDK V5

    project

    第一栏里选择复制必要的库文件 第二栏里勾选将文件分为.c和.h

    codegen

    最后点击生成文件
    注意 !
    工程路径绝对不能有中文名,否则会报错,无法复制stm32的库文件到你的工程

    keil中添加处理函数

    打开生成的文件,在main.c中初始化的时候开启编码器计数

    HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
    HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
    

    在循环中调用 __HAL_TIM_IS_TIM_COUNTING_DOWN 可以获得当前电机的转向 0为正、1为负

    DirectionA = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);     
    DirectionB = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4);  
    

    在循环中调用 __HAL_TIM_GET_COUNTER 获取计数器的计数值,即编码器的脉冲数

    CaptureNumberA=__HAL_TIM_GET_COUNTER(&htim3);
    CaptureNumberB=__HAL_TIM_GET_COUNTER(&htim4);
    

    脉冲计算:

    我的电机编码器是AB相位差90度,栅格数是96,无减速器,码盘转一圈,A相和B相分别输出96个矩形脉冲,总共输出192个脉冲。
    如果使用 Encoder Mode TI1 或者Encoder Mode TI2,码盘转一圈得到的计数值为192。
    如果使用Encoder Mode TI1 andTI2 那么得到的脉冲数为384。

    ti1_192.png 384.png
    电机转过的角度
    如果使用Encoder Mode TI1 andTI2 那么
    电机真实方向= 0为正、1为负
    电机真实角度= 得到的脉冲数 / 384 * 360
    

    相关文章

      网友评论

        本文标题:STM32CUBEMX F103 HAL库开发 两路定时器的En

        本文链接:https://www.haomeiwen.com/subject/ggxnwctx.html