使用cubemx配置stm32单片机显示编码电机速度

一,原件介绍

编码电机和直流电机最大的不同就是,编码电机侧面多了一个电路板,这个电路板通过两个霍尔原件输出相位差90度的方波,通过单片机中定时器的编码器模式通道输入,获取速度以及转向。

上面两个黑块就是霍尔元件了,电机主轴转一圈,这个小圈转33圈。

二,引脚配置

点击TIME4,找到最下面的组合通道,配置为编码器模式

在下方encoder mode里面选择Encode TI1 and Encode TI2这样在编码器的两个通道里面产生上升沿就都会计数了,等于是灵敏度翻倍了

这里挺有意思的概念是,这个定时器的输入“时钟源”就是霍尔传感器产生的方波,方波频率很小,就用不到分频器了,定时器的本质就是计数器,在这里很能体现。我每隔10ms(用另一个定时器)就读取记录方波上升沿的计数器的值,这样就可以算出速度了,这里TIM4定时器的作用就是数数,数方波上升沿的个数。

三,编写代码

代码思路:1.开启编码器模式,捕获霍尔传感器产生的方波,开始计数

                  2.每隔10ms读取计数值,并且将它清零,等下一个10ms读取他

                  3.显示出来。

      1.开启编码器模式,这一步在外设使用里面很容易遗忘,以为用cubemx配置完端口就可以正常使用了,其实并不是,配置完端口只是设置好了这些端口工作时的一些参数,就好像我们要出门,告诉了cubemx我们要什么颜色的,什么型号的车,然后cubemx把车停在我们面前,但是真正要启动,还是我们来,如何启动?就是sart函数了,这里是HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);函数

注意不要和HAL_TIM_IC_Start(&htim4,TIM_CHANNEL_ALL);这个函数搞混,这个是启动输入捕获的,而我们在cubemx里面配置的是编码器模式,所以用上面那个函数,车钥匙得找对了。

      2.每隔10ms读取计数器的值,这里我选用uwTick这个自带的滴答定时器来计时,uwTick在HAL_Delay函数定义里面可以找到,他每隔1ms加一
 

void read()

{

        if(uwTick-systick<10)

        return;//不满足if条件就返回

        get=speed_get();//注意get定义为int型,这样才能显示负转

       systick=uwTick    

}

void speed_get(HAL_TIM_IC_Start(&htim4,TIM_CHANNEL_ALL)
{
    int temp; 
    temp=(short)__HAL_TIM_GetCounter(htim);    //这里强制转换short是为了取出负数,转速有正有负
    __HAL_TIM_SetCounter(htim,0);
    return temp;    
}

    3.显示出来。

  sprintf((char *)display_buf,"Encoder_R:%d   ",get);
   OLED_ShowString(0,6,display_buf,16);

完成

        

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值