电机编码器的使用

  • 1.编码器的分类
  • 2.旋转编码器原理
  • 3.编码器的数据读取


1.编码器的分类

1.1按检测原理分类

esp32 无刷电机 编码器_esp32 无刷电机 编码器

1.1.1光电编码器

使用光电头来检测光栅的位置变化。

特点:精度高,寿命长,难以在恶劣条件下使用。

1.1.2磁编码器
利用霍尔元件来检测磁场的变化。
特点:在灰尘大,有污染的条件下能够正常工作。里面的永磁体在高温,强冲击,高频振动时,会发生退磁,使磁性减弱。电磁干扰和比较强的磁场会产生较大的影响,而电机工作时,恰恰创造了这种环境。

1.1.3感应式编码器:放出磁力线来检测齿轮上的刻度变化。
特点:特殊的条件下能正常工作,价格贵。

1.2按运动方式分类
线性编码器
旋转编码器

1.3按编码类型分类
增量式
绝对式
混合式

2.旋转编码器原理

2.1增量式-旋转编码器

码盘周期性旋转时,光源的光线会周期性地透过和被遮挡。当透过时,光敏装置会产生微弱的信号,信号通过放大电路处理,最后将这些信号输出。

esp32 无刷电机 编码器_stm32_02


esp32 无刷电机 编码器_esp32 无刷电机 编码器_03

增量式: 只输出位置变化和运动方向

esp32 无刷电机 编码器_esp32 无刷电机 编码器_04

esp32 无刷电机 编码器_stm32_05

我们可以通过A B两个波形的相位来判断正反转

Z相可以用于一圈之后对A B相计数的清空2.2绝对式-旋转编码器

esp32 无刷电机 编码器_stm32_06

2.3混合式

esp32 无刷电机 编码器_编码器_07

3.编码器的数据读取

我们一般接触到的都是增量式的旋转编码器。

3.1倍频计数

esp32 无刷电机 编码器_stm32_08


1倍频(×1)即为只检测A或B通道的高电平数量

2倍频(×2)即为只检测A或B通道的上升沿与下降沿的数量

4倍频(×4)即为同时检测A和B通道的上升沿与下降沿的数量

注意:我们只是对采集到的信号进行了处理,原来A和B通道的信号是没有发生任何变化的。

3.2 STM32的编码器接口

TI1和TI2分别连接着编码器的AB相

3.2.1仅在TI1处计数(二倍频)

情况一:此时是向上计数

TI1 是上升,TI2为低电平

TI1 是下降,TI2为高电平

esp32 无刷电机 编码器_编码器_09

情况二:此时为向下计数

TI1 是下降,TI2为低电平

TI1 是上升,TI2为高电平

esp32 无刷电机 编码器_stm32_10


3.2.2同时在TI1和TI2处计数(四倍频)

把TI1和TI2两个通道都用来计数

esp32 无刷电机 编码器_单片机_11

3.3总结

总结来说,就是参考手册中的这张表

esp32 无刷电机 编码器_esp32 无刷电机 编码器_12


stm32f1的编码器配置代码

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);//使能PB端口时钟
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	//端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);					      //根据设定参数初始化GPIOB
  
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 
  TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD-1; //设定计数器自动重装值
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数  
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 10;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM_SetCounter(TIM3,0);
  TIM_Cmd(TIM3, ENABLE); 
}

计数值在TIM3计时器的CNT寄存器中

Encoder_TIM= (short)TIM3 -> CNT