STM32——编码器测速原理及STM32编码器模式

1. 编码器概述在这里插入图片描述

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

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

2. 编码器原理

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

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

可以看到两种原理的编码器目的都是获取 AB 相输出的方波信号,其使用方法也是一样,下面是一个简单的示意图。
在这里插入图片描述

3. 编码器接线说明

具体到我们的编码器电机,我们可以看看电机编码器的实物。
在这里插入图片描述
在这里插入图片描述

4. 编码器软件四倍频技术

下面我们说一下编码器倍频的原理。为了提高大家下面学习的兴趣,我们先明确,这是一项实用的技术,可以真正地把编码器的精度提升 4 倍。作用可类比 于单反相机的光学变焦,而并非牺牲清晰度来放大图像的数码变焦。OK,先看看下面编码器输出的波形图。在这里插入图片描述
这里,我们是通过软件的方法实现四倍频。首先可以看到上图编码器输出的AB 相波形,正常情况下我们使用 M 法测速的时候,会通过测量单位时间内 A 相输出的脉冲数来得到速度信息。常规的方法,我们只测量 A 相(或 B 相)的上升 沿或者下降沿,也就是上图中对应的数字 1234 中的某一个,这样就只能计数 3次。而四倍频的方法是测量 A 相和 B 相编码器的上升沿和下降沿。这样在同样的 时间内,可以计数 12 次(3 个 1234 的循环)。这就是软件四倍频的原理。

5. STM32编码器模式

在STM32中,编码器使用的是定时器接口,通过数据手册可知,定时器1,2,3,4,5和8有编码器的功能,而其他没有。编码器输入信号TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
在这里插入图片描述
STM32编码器有三种工作模式,其中模式三即为上文中提到的四倍频模式。
在这里插入图片描述
在使用编码器模式时需要注意以下几点:

  • 编码器有个转速上限,超过这个上限是不能正常工作的,这个是硬件的限制,原则上线数越多转速就越低,这点在选型时要注意。
  • 定时器初始化好以后,任何时候CNT寄存器的值就是编码器的位置信息,正转他会加反转他会减这部分是不需要软件干预的,初始化时给的TIM_Period 值应该是码盘整圈的刻度值,在减溢出会自动修正为这个数.加超过此数值就回0.
  • 计数值偶尔也会有出错误的情况,一圈多计一个或少计一个数都是很正常的特别是转速比较高的时候尤其明显,有个绝对位置信号做修正是很有必要的.绝对位置信号不需要一定在零位置点,收到这个信号就将CNT修正为一个固定的数值即可.

6. STM32编码器模式例程

此例程用于初始化定时器2和定时器3为编码器模式,得到小车底盘上两个直流电机的运转速度。

#.c文件
#include "encoder.h"

/**************************************************************************
*  函数功能:把TIM2初始化为编码器接口模式
*
*  入口参数:无
*
*  返 回 值:无
**************************************************************************/
void Encoder_Init_TIM2(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
	TIM_ICInitTypeDef TIM_ICInitStructure;  
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能PA PB端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	//端口配置 PA15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);					      //根据设定参数初始化GPIOA
  
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;	//端口配置 PB3
	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_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  //初始化定时器2
	
	TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
	
	TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一个参数按缺省值填入
	TIM_ICInitStructure.TIM_ICFilter = 10;  //设置滤波器长度
	TIM_ICInit(TIM2, &TIM_ICInitStructure);//根据 TIM_ICInitStruct 的参数初始化外设	TIMx
 
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能定时器中断
	
	TIM_SetCounter(TIM2,0);
	TIM_Cmd(TIM2, ENABLE); //使能定时器2
}

/**************************************************************************
函数功能:把TIM3初始化为编码器接口模式
入口参数:无
返回  值:无
**************************************************************************/
void Encoder_Init_TIM3(void)
{
  	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  	TIM_ICInitTypeDef TIM_ICInitStructure;  
  	GPIO_InitTypeDef GPIO_InitStructure;
	
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器3的时钟
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口时钟
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	//端口配置 PA6 PA7
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  	GPIO_Init(GPIOA, &GPIO_InitStructure);					      //根据设定参数初始化GPIOA
  	
  	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_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  //初始化定时器3
	
  	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3(TIM_ICPolarity_Rising或者TIM_ICPolarity_Falling效果相同,都是4倍频)
	
  	TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一个参数按缺省值填入
  	TIM_ICInitStructure.TIM_ICFilter = 10;  //设置滤波器长度
  	TIM_ICInit(TIM3, &TIM_ICInitStructure);//根据 TIM_ICInitStruct 的参数初始化外设	TIMx
 
  	TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位
  	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//使能定时器中断
  	TIM_SetCounter(TIM3,0);
  	TIM_Cmd(TIM3, ENABLE); //使能定时器
}

/**************************************************************************
函数功能:单位时间读取编码器A计数
入口参数:无
返回  值:计数值
**************************************************************************/
float Read_EncoderA(void)
{
	int Encoder_TIM = 0;  
	float Speed = 0.0;  
	Encoder_TIM= (short)TIM2 -> CNT;   
	TIM2 -> CNT=0;
	return -Encoder_TIM;
}
/**************************************************************************
函数功能:单位时间读取编码器B计数
入口参数:无
返回  值:计数值
**************************************************************************/
float Read_EncoderB(void)
{
	int Encoder_TIM = 0;  
	float Speed = 0.0;  
	Encoder_TIM= (short)TIM3 -> CNT;   
	TIM3 -> CNT=0;
	return Encoder_TIM;
}

/**************************************************************************
*  函数功能:TIM2中断服务函数
*
*  入口参数:无
*
*  返 回 值:无
**************************************************************************/
void TIM2_IRQHandler(void)
{ 		    		  			    
	if(TIM2->SR&0X0001)//溢出中断
	{    				   				     	    	
	}				   
	TIM2->SR&=~(1<<0);//清除中断标志位 	    
}


/**************************************************************************
*  函数功能:TIM3中断服务函数
*
*  入口参数:无
*
*  返 回 值:无
**************************************************************************/
void TIM3_IRQHandler(void)
{ 		    		  			    
	if(TIM3->SR&0X0001)//溢出中断
	{    				   				     	    	
	}				   
	TIM3->SR&=~(1<<0);//清除中断标志位 	    
}

#.h文件
#define __ENCODER_H
#include <sys.h>	 
#include "init.h" //include了所有需要的头文件
#define ENCODER_TIM_PERIOD (u16)(65535)   //不可大于65535 因为F103的定时器是16位的。

void Encoder_Init_TIM2(void);
void Encoder_Init_TIM3(void);
	
float Read_EncoderA(void);
float Read_EncoderB(void);

void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);

#endif
### 回答1: stm32四倍频电子细分电路是将stm32单片机的时钟频率经过细分电路处理后得到四倍频的输出信号。通常情况下,stm32的主时钟频率为8 MHz。通过细分电路的处理,可以将主时钟频率提升至32 MHz,即四倍频。 细分电路的实现通常包括两个步骤:锁相环(PLL)产生高频信号和除频器进行频率分频。首先,通过PLL电路将stm32主时钟频率扩大四倍,得到32 MHz的高频信号。PLL电路由相频比、低通滤波器和电流源等组成,通过调节相频比和滤波器参数来实现稳定的频率倍增。其次,将32 MHz的高频信号输入到除频器中,通过除以4的分频操作,得到8 MHz的四倍频输出信号。 stm32四倍频电子细分电路的主要作用是提高stm32单片机的运行速度和性能。通过提升时钟频率,可以加快stm32单片机的指令执行速度,提高数据处理能力。同时,四倍频电子细分电路还能提供更高的时钟频率给其他外设模块以满足系统需求,例如高速通信、定时器、ADC和DAC等。此外,四倍频电子细分电路还可以应用于各种嵌入式系统中,提升设备的整体性能和响应速度。 总之,stm32四倍频电子细分电路是一种将主时钟频率扩大四倍的电路设计,通过锁相环和除频器的协作,将stm32单片机的时钟频率提升至32 MHz,以提高系统的运行速度和性能。 ### 回答2: STM32四倍频电子细分电路是指在STM32微控制器中使用四倍频技术实现步进电机的精确细分控制。步进电机常用于需要精确定位和控制的应用中,如3D打印机、CNC机床等。 STM32微控制器具备丰富的外设资源和强大的处理能力,可以使用其中的定时器和增量编码器接口来实现步进电机的控制。然而,步进电机的旋转角度是离散的,无法实现精确的位置和速度控制。为了解决这一问题,可以使用四倍频技术进行电子细分。 四倍频电子细分电路通过改变步进电机的驱动信号的频率,在一个步进角度周期内将步进电机细分为更小的微步。通常,步进电机的一个步进角度为1.8°,而电子细分可以将这个角度进一步分为更小的角度,如0.9°、0.45°等,从而实现更高的控制精度。 在STM32微控制器中,可以使用定时器的PWM输出信号来驱动步进电机。通过调整PWM信号的频率和占空比,可以实现步进电机的不同细分模式。例如,设置PWM信号的频率为四倍步进电机基本频率,占空比为25%时,可以实现四倍频电子细分,将一个步进角度细分为4个角度。 在实际应用中,可以根据具体需求选择不同的细分模式,如二倍频、四倍频、八倍频等,来实现更精准的步进电机控制。同时,还可以根据步进电机的特性和控制要求,结合STM32微控制器的其他功能和外设资源,如模拟比较器、ADC等,实现更加复杂的控制算法和功能。 总之,STM32四倍频电子细分电路通过改变步进电机的驱动信号的频率,实现步进电机的精确细分控制。这种电子细分技术可以提高步进电机的控制精度和定位精度,广泛应用于各种需要精确定位和控制的应用中。 ### 回答3: STM32四倍频电子细分电路是一种用于将输入信号的频率调整为原信号的四倍的电路。在STM32微控制器中,使用四倍频电子细分电路可以实现更高的步进电机控制精度。 这样的电路通常包括相位锁定环(PLL)和分频器。首先,输入信号经过PLL锁定到一个固定的频率源,这个频率通常比输入信号的频率要高。然后,通过分频器将这个固定频率的信号分频为原信号的四倍频率。 在步进电机控制中,使用STM32四倍频电子细分电路可以提高步进电机的精度和细分能力。通过增加电子细分,可以将每个步进电机的步数细分为更小的角度,从而实现更精细的控制。这对于需要高精度定位和运动控制的应用非常重要。 同时,STM32四倍频电子细分电路还可以减少电机驱动器的噪声和振动。通过将步进电机的输入信号频率提高到四倍,可以减小驱动器的电流脉冲宽度,减少电机的振动和噪声,提高整个系统的稳定性和可靠性。 总的来说,STM32四倍频电子细分电路在步进电机控制中起着重要的作用。通过将输入信号频率提高到四倍,可以实现更高的步进电机控制精度和细分能力,并降低噪声和振动。这使得STM32微控制器在工业自动化、机器人、精密仪器等领域得到广泛应用。
评论 91
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值