平衡小车——编码器原理及其使用

结合了一些帖子以及用的过程中出现的一些问题,然后归纳出来的一个贴子

一,编码器概述

编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上分,可以分为增量式编码器和绝对式编码器。

从编码器检测原理上来分,还可以分为光学式、磁式、感应式、电容式。常见的是光电编码器(光学式)和霍尔编码器(磁式)。

二,编码器原理

光电编码器是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。光电编码器是由光码盘和光电检测装置组成。光码盘是在一 定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,检测装置检测输出若干脉冲信号,为判断转向,一般输出两组存在一 定相位差的方波信号。

霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘和霍尔元件组成。霍尔码盘是在一 定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。

三,电机编码器接线

然后这下面就是讲的平衡车上的编码器啦。
车轮上有根线,最边上的两根是电机电源线,配合tb6612驱动,可用来控制电机的转速和转向。然后中间四根是编码器接口,如下图:

要注意哦~小车用的是两个编码器是反过来的,如果测试时车轮同向转,计数值互为相反数,就把AB相调换一下就好啦。或者把其中一个读到的数前面加个负号。

然后编码器供电是5v,供电问题,这是一款增量式输出的霍尔编码器。编码器有 AB 相输出,所以不仅可以测 速,还可以辨别转向。根据上图的接线说明可以看到,我们只需给编码器电源5V 供电,在电机转动的时候即可通过 AB 相输出方波信号。编码器自带了上拉电阻,所以无需外部上拉,可以直接连接到单片机 IO 读取。

当然不是说编码器就一定要用定时器做接口,有些单片机没有编码器接口的功能,也是可以用外部中断来代替。把编码器 A 相输出接到单片机的外部中断输入口,这样 就可通过跳变沿触发中断,然后在对应的外部中断服务函数里面,然后通过 B 相的电平来确定正转反转。A相当于一个跳变沿的时候,B相高电平就为是正转,低电平就为是反转。然后,普通io口也是可以处理的。

but用stm32做编码器接口的好处是计数比较智能,容许接口出现抖动而不影响结果。而且配置的代码超级多,拉过来就可以用啦。所以下面就是stm32定时器做编码器接口的介绍啦

四,定时器做编码器接口的配置方式

1,计数模式



如上两张图对应着来看呐,显然用T1,T2共同计数比较精确,也就是实现了“四倍频”

2,滤波等级

3,计数重装载值

就是对“TIM_TimeBaseStructure.TIM_Period”赋值,

这些都有写在代码的注释里面

五,stm32代码(库函数版)

void Encoder_Init_TIM2(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  TIM_ICInitTypeDef TIM_ICInitStructure;  GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);                       TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值,我设的是65536,最大只能是66536,stm32f103的寄存器只有16bitTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3,就是四分频计数模式TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;// TIMx->CCMRx的位7:4,输入捕获1滤波器 ,IC1F用来滤波¨TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);TIM_SetCounter(TIM2,0);//设置CNT的值,初始化的时候从0开始计数TIM_Cmd(TIM2, ENABLE);
}/*TIM4初始化为编码器接口*/
void Encoder_Init_TIM4(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  TIM_ICInitTypeDef TIM_ICInitStructure;  GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能定时器4的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;    //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);                         //根据设定参数初始化GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM的更新标志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM4,0);TIM_Cmd(TIM4, ENABLE);
}/*单位时间编码器计数 输入定时器 输出速度值*/
int Read_Encoder(u8 TIMX)
{int Encoder_TIM;    switch(TIMX){case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;//读数据+计数值清零case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;    case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break; default:  Encoder_TIM=0;}return Encoder_TIM;
}/*中断服务函数,计数值溢出了就会进入中断,然后又会从0开始计数*/
void TIM4_IRQHandler(void)
{                                   if(TIM4->SR&0X0001)//溢出中断{                                                   }                  TIM4->SR&=~(1<<0);//清除中断标志位
}void TIM2_IRQHandler(void)
{                                   if(TIM2->SR&0X0001)//溢出中断{                                                   }                  TIM2->SR&=~(1<<0);//清除中断标志位
}

六,注意点(这里是用的别人的~)

1.编码器有个转速上限,超过这个上限是不能正常工作的,这个是硬件的限制,原则上线数越多转速就越低,这点在选型时要注意,编码器的输出一般是开漏的,所以单片机的io一定要上拉输入状态.
2.定时器初始化好以后,任何时候CNT寄存器的值就是编码器的位置信息,正转他会加反转他会减这部分是不需要软件干预的,初始化时给的TIM_Period 值应该是码盘整圈的刻度值,在减溢出会自动修正为这个数.加超过此数值就回0.
3.如果要扩展成多圈计数需要溢出中断像楼主说的,程序上圈计数加减方向位就行了.
4.每个定时器的输入脚可以通过软件设定滤波
5.应用中如果没有绝对位置信号或者初始化完成后还没有收到绝对位置信号前的计数只能是相对计数.收到绝对位置信号后重新修改一次CNT的值就行了.码盘一般都有零位置信号,结合到定时器捕获输入就行.上电以后要往返运动一下找到这个位置.
6.即便有滤波计数值偶尔也会有出错误的情况,一圈多计一个或少计一个数都是很正常的特别是转速比较高的时候尤其明显,有个绝对位置信号做修正是很有必要的.绝对位置信号不需要一定在零位置点,收到这个信号就将CNT修正为一个固定的数值即可.
7.开启定时器的输入中断可以达到每个步计数都作处理的效果,但是高速运转的时候你可能处理不过来.

参考

https://blog.csdn.net/qq_17280755/article/details/73770598
https://blog.csdn.net/qq_38721302/article/details/83448078

平衡小车——编码器原理及其使用相关推荐

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

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

  2. 平衡小车从0开始stm32带源码

    平衡小车为鸭脖智能的,但不推荐购买,太垄断了,一般零件只能买他们家的,而且还贵,不开源.做的不错,不如原子好. 一.电机.编码器介绍 电机使用的是JGB37-520(带有霍尔编码器),属于价格中等性能 ...

  3. 两轮自平衡小车双闭环PID控制设计

                                                                                            两轮自平衡小车的研究意义 ...

  4. 零基础制作平衡小车【连载】12---平衡小车控制原理

    前言 截止目前,初代小车已经调试完毕,功能上只能直立,后期还会加上更多功能. 前面关于pid的内容也已经更新完毕,如果你是跟着我的教程走的话,那么现在的你最起码对PID已经有所了解了,那么后面我就主要 ...

  5. 平衡小车制作系列之二——模块原理解析

    文章目录 一. 模块概述 二. 直流电机 2.1 直流电机介绍 2.2 直流电机外围设备介绍 2.2.1 减速器 2.2.2 控制PWM的单片机 2.2.3 编码器 三. 编码器 3.1 编码器介绍 ...

  6. 直立代码分析__两轮平衡小车原理

    本文依据网上资源整理而来,适用于初学直立车者. 一.原理 平衡小车是通过两个电机运动下实现小车不倒下直立行走的多功能智能小 车,在外力的推拉下,小车依然保持不倒下.这么一说可能还没有很直观的了解 究竟 ...

  7. 编码电机测速(stm32f1/HAL库/CubeMX/编码器模式/平衡小车/直流减速电机/超详细)

    系列文章目录(STM32常用外设/HAL库版) 一.HC-SR04超声波模块的使用 二.OLED的HAL库代码介绍及使用 三.直流减速电机的测速以及电机驱动的使用(本篇) 文章目录 系列文章目录(ST ...

  8. Arduino平衡小车

    Arduino平衡小车 1.概述 此Arduino平衡小车在主控方面由Arduino UNO R3和Arduino sensor shield v5.0传感器扩展板组成.采用TB6612FNG作为电源 ...

  9. 基于stm32的两轮自平衡小车3(硬件篇)

    此篇为硬件篇,接上一篇"基于stm32的两轮自平衡小车2(原理篇)".包含自行设计电路板原理图与PCB电路图的过程.详见目录. 目录 stm32管脚分配 硬件原理图 PCB电路图 ...

  10. 基于stm32的两轮自平衡小车4(软件调试篇)

    本篇是软件调试篇,接上一篇硬件篇:基于stm32的两轮自平衡小车3(硬件篇),本篇内容是对硬件部分的软件实现,具体模块详见目录.这里先上效果:转B站 目录 定时器PWM驱动程序 定时器编码器模式驱动程 ...

最新文章

  1. 03基于python玩转人工智能最火框架之TensorFlow介绍
  2. java域对象_javaWeb域对象
  3. 打开pix4d无有效许可_我市两家企业通过危险废物综合经营许可证专家核查
  4. 幽暗统领 树的重心 牛客白月赛44
  5. SDOI2016 生成魔咒
  6. session与cookie的简单使用
  7. 代码jit_但这是不可能的,或者无法发现JIT破坏了您的代码。
  8. [react] 写个例子说明什么是JSX的内联条件渲染
  9. nginx访问页面 中文乱码 解决方案
  10. Logistic Regression(LR) 算法原理简介
  11. win10 JDK的安装及环境变量的配置
  12. Linux环境批量下载阿里云盘资源
  13. 软件测试面试101问(附答案)
  14. Iceberg在袋鼠云的探索及实践
  15. win10+VS2012+opencv2.4.11的安装和配置
  16. 2020计算机夏令营+预推免统计
  17. 基于java springboot租房平台设计,公寓租赁系统
  18. 一分钟看懂Python中的 // 和 / 和 % 的用法区别
  19. 对微机用户来说 为了防止计算机意外故障,对于微机用户来说,为了防止计算机意外故障而丢失重要数据,对重要数据应定期进行备份。下列移动存储器中,最不常用的一种是...
  20. webrtc代码走读二十一(InterArrival::ComputeDeltas)

热门文章

  1. Android JS交互-记录我所遇到的
  2. 企业服务的定义、分类与特点
  3. 算法:计算股票的最大收益(动态规划经典案例)
  4. Android实现思维导图功能,Android打造思维导图
  5. android ios 逆向工程,iOS逆向工程之砸壳
  6. python数字大小写转换代码_把金额小写转换成大写的Python代码
  7. 自定义词库扩展和停止
  8. 第三方支付接口开发原理
  9. fences 桌面整理,超赞,强烈推荐
  10. yarn的安装及使用教程