本次选用的编码器电机为13线的霍尔编码器电机,电机减速比为30:1,转动一圈输出13*30=390个脉冲。轮胎直径为75mm,轮胎周长为pi*d=3*75=225mm.定时器采用四倍频计数,则一圈输出390*4=1560个脉冲。具体编码器知识这里就不多说了。

根据测速原理:假设编码器输出的脉冲数为N,而电机转动一圈输出1569个脉冲,转动一圈轮子将前进225mm。那输出脉冲数为N时前进的距离就应该为225*(N/1560)mm,再除以时间及可得速度。

下面为具体代码:

encoder.c文件

#include "encoder.h"void Encoder_TIM2_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);      //开时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;                          //配置IO口GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_Init(GPIOA, &GPIO_InitStruct);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;                //定时器初始化TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 65535;TIM_TimeBaseInitStruct.TIM_Prescaler = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//定时器编码器模式初始化TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICInitTypeDef TIM_ICInitStruct;                        //输入捕获单元配置TIM_ICStructInit(&TIM_ICInitStruct);TIM_ICInitStruct.TIM_ICFilter = 10;TIM_ICInit(TIM2, &TIM_ICInitStruct);TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);TIM_SetCounter(TIM2, 0);TIM_Cmd(TIM2, ENABLE);
}void Encoder_TIM4_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_Init(GPIOB, &GPIO_InitStruct);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 65535;TIM_TimeBaseInitStruct.TIM_Prescaler = 0;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICInitTypeDef TIM_ICInitStruct; TIM_ICStructInit(&TIM_ICInitStruct);TIM_ICInitStruct.TIM_ICFilter = 10;TIM_ICInit(TIM4, &TIM_ICInitStruct);TIM_ClearFlag(TIM4, TIM_FLAG_Update);TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);TIM_SetCounter(TIM4, 0);TIM_Cmd(TIM4, ENABLE);
}int Read_Spead(int TIMx)           //读取编码器输出脉冲数
{int value_1;switch(TIMx){case 2:value_1 = (short)TIM_GetCounter(TIM2);TIM_SetCounter(TIM2, 0);break;case 4:value_1 = (short)TIM_GetCounter(TIM4);TIM_SetCounter(TIM4, 0);break;default:value_1 = 0;}return value_1;
}void TIM2_IRQHander(void)
{if(TIM_GetITStatus(TIM2, TIM_IT_Update) == 1){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}void TIM4_IRQHander(void)
{if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1){TIM_ClearITPendingBit(TIM4, TIM_IT_Update);}
}

我使用的是简单的delay一下来采集定时器捕获的编码器脉冲数,不过我建议使用定时器中断来处理编码器采集。此函数只采集右轮脉冲进行计算

主函数循环体内函数:

while(1){delay_s(1);{uint16_t right = Read_Spead(2);//采集右轮脉冲数displacement = 0.225 * (right / 1560);//计算位移speed = displacement;//由于我设置的为延时一秒就不用除时间OLED_Float(0, 0, speed, 4);//通过OLED显示速度set_PWM(999);//设置电机PWMTIM_SetCounter(TIM2, 0);//下一次一秒计数前再一次将计数清零}}

stm32霍尔编码器电机测速原理相关推荐

  1. STM32 CubeMax 编码器电机测速 原理与实现

    编码器电机测速 部分参考:https://blog.csdn.net/lzzzzzzm/article/details/119416134 其他参考部分见图片水印 1. 编码器种类及原理 常见的编码器 ...

  2. stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速. 编码器被广泛应用于电机测速,实现电机闭环控制.所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速. 一.参数 编码电机其实就是一个带有编码 ...

  3. STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机

    文章目录 1.L298N电机驱动 1.1 产品参数 1.2 实物图和接线 2.编码器 2.1 编码器简介 2.2 常用编码器分类 2.3 霍尔编码器实物图接线!!!! 2.4 编码器倍频原理 3.控制 ...

  4. STM32之增量式编码器电机测速

    STM32之增量式编码器电机测速 编码器 编码器种类 按监测原理分类 光电编码器 霍尔编码器 按输出信号分类 增量式编码器 绝对式编码器 编码器参数 分辨率 精度 最大响应频率 信号输出形式 编码器倍 ...

  5. STM32C8T6编码器电机测速与arduino光电模块测速

    文章目录 前言 一.STM32编码器测速 定时器配置 配置四倍频 二.arduino光电测速 前言 前面也是只学习了四倍频测速的原理,并没有真正实验过,今天正好看到编码器电机了,就尝试一下 一.STM ...

  6. 51单片机电机测速程序c语言,单片机仿真编码器电机测速程序

    /***********头文件声明************/ #include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器 /***********数据类型声明 ...

  7. linux直流电机测试,带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)...

    查看: 14294|回复: 83 带霍尔传感器编码器的直流减速电机测速原理讲解(附源码) 高级会员, 积分 891, 距离下一级还需 109 积分 积分金钱891 注册时间2019-4-22 在线时间 ...

  8. 平衡小车—编码器使用教程与测速原理

    文章目录 1.编码器概述 2.编码器原理 3.编码器接线说明 4.编码器软件四倍频技术 5.单片机如何采集编码器数据 6.获取方式 来自平衡小车之家,与大家一起学习编码器使用与测速原理. 1.编码器概 ...

  9. STM32定时器捕获编码器模式测速和方向测不准问题

    ** STM32定时器捕获编码器模式测速和方向测不准问题 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮 ...

  10. STM32应用开发实践教程:智能小车电机测速模块的应用开发

    3.4.1 任务分析 本任务要求设计一个可实现智能小车电机测速的应用程序,具体要点如下. ① 取一个电机作为测速对象. ② 支持按键控制,使用 4 个按键,功能描述如下:  Key1 控制电机正转, ...

最新文章

  1. python中__dict__与dir()区别
  2. 你需要知道的requestAnimationFrame
  3. 分布式存储Ceph 快速安装手册
  4. VC6.0 中的默认操作系统版本的问题
  5. struts2 如何跳转html5,在线HTML编辑器——ueditor,跟struts2结合
  6. linux 硬软链接区别
  7. CMOS图像传感器——TOF 图像传感器
  8. P5518-[MtOI2019]幽灵乐团【莫比乌斯反演,欧拉反演】
  9. vue监听对象某一个属性
  10. java中contains的用法_好程序员Java教程分享Java中this的几种用法
  11. MS SQL入门基础:创建和使用约束
  12. 用python来开发webgame服务端(1)
  13. 詹姆斯——永远的皇帝
  14. 如何判断网线连接状态
  15. 一分钟了解”matlab对数函数log“
  16. VB编程:SelectCase多分支选择结构实例测试生肖运势-13
  17. 关于locahost:8080一直在等待却不报错
  18. android 滑动取值_Android中滑屏实现
  19. python中库是什么意思,python中的库、包、模块和脚本是什么意思
  20. Java实现-五子棋

热门文章

  1. MySQL下载与安装
  2. java制作主页,JSP教程基础篇之简单首页制作
  3. 详解ASR语音转写场景下的应用
  4. redis主从故障自动切换IP漂移
  5. echarts柱状图铺满_echarts 柱状图多种样式设置
  6. 物联网平台开发接口http/mqtt,支持部标808/1078协议对接
  7. 点餐系统ip地址_教你一步一步做无线点餐项目(登录篇)
  8. istio搭建testbed 补充(指令汇集)
  9. Vue 动态加载子组件
  10. 嵌入式软件工程师总结(1)