平衡车不用编码器可以吗_编码器结构及工作原理

平衡车不用编码器可以吗_编码器结构及工作原理感觉用在平衡小车上的编码器相关的博文和资料都超级多的,不慌不慌

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

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

一,编码器概述

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

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

二,编码器原理

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

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

三,电机编码器接线

然后这下面就是讲的平衡车上的编码器啦。
车轮上有根线,最边上的两根是电机电源线,配合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的寄存器只有16bit
	TIM_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);					      //根据设定参数初始化GPIOB

	TIM_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);//使用编码器模式3
	TIM_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 counter
	TIM_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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187054.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 解二元微分通解和特解的关系,量子力学中的奇异点分析与高数中通解与特解的关系

    解二元微分通解和特解的关系,量子力学中的奇异点分析与高数中通解与特解的关系解二元微分通解和特解的关系,量子力学中的奇异点分析与高数中通解与特解的关系

  • zabbix短信报警_手机短信监听

    zabbix短信报警_手机短信监听zabbix短信监控

    2022年10月31日
  • 最佳路径分析_最佳路径选择

    最佳路径分析_最佳路径选择最佳路径分析(作者:吴东梅,撰写时间:2019年1月17日)学习了GIS技术,让我们对地理信息系统有了一定的了解,也让我们知道了我们平时常用的导航系统里面的导航最佳路径里面的一些奥妙。现在就让我们了解一下如何制出最佳路径的方法并应用在我们自己的项目中吧!1、 先在SuperMapiDesktop9D把你的地图打开,然后点击上方导航条上面的交通分析,里面有一个拓扑构网,鼠标移到拓扑构网上…

  • Spring Cloud Eureka详解

    Spring Cloud Eureka详解SpringCloudEureka详解一Eureka服务治理体系1.1服务治理服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。SpringCloudEureka是SpringCloudNetflix微服务套件中的一部分,它基于NetflixEureka做了二次封装。主要负责完成微服务架构中的服务治理功能。E…

  • 海思Hi3798MV300_Hi3798MV300H_Datasheet-系统[通俗易懂]

    海思Hi3798MV300_Hi3798MV300H_Datasheet-系统[通俗易懂]Hi3798MV300/Hi3798MV300H处理器子系统Hi3798MV300/Hi3798MV300H采用ARMCortex-A53MPCore四核处理器,Cortex-A53MPCore具有以下特点:处理器集成了256KBL2cache。支持ARMv8-A架构。支持DVFS自动调频调压和AVS自适应调压。安全子系统具有以下特性:…

  • 工作量证明(PoW)的内部攻击模型「建议收藏」

    工作量证明(PoW)的内部攻击模型「建议收藏」虽然,POW算法其实并没有协调选择博弈论中的安全性,因为多数联盟可以形成和有益的审查和回复块。但是当我们考虑PoW的攻击时,通常不会考虑到矿工联合攻击,而是想到购买矿工设备或者对更重链进行挖矿。这篇文章主要是谈论PoW对抗控制半数哈希力攻击的能力,不允许租用,或贿赂矿工,或与矿工进行任何其他形式的合作。外部攻击外部攻击者购买足够的GPU或者ASIC直到完成对可信网络的“51%攻击”,或者至少…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号