电机编码器的使用
- 1.编码器的分类
- 2.旋转编码器原理
- 3.编码器的数据读取
1.编码器的分类
1.1按检测原理分类
1.1.1光电编码器:
使用光电头来检测光栅的位置变化。
特点:精度高,寿命长,难以在恶劣条件下使用。
1.1.2磁编码器:
利用霍尔元件来检测磁场的变化。
特点:在灰尘大,有污染的条件下能够正常工作。里面的永磁体在高温,强冲击,高频振动时,会发生退磁,使磁性减弱。电磁干扰和比较强的磁场会产生较大的影响,而电机工作时,恰恰创造了这种环境。
1.1.3感应式编码器:放出磁力线来检测齿轮上的刻度变化。
特点:特殊的条件下能正常工作,价格贵。
1.2按运动方式分类
线性编码器
旋转编码器
1.3按编码类型分类
增量式
绝对式
混合式
2.旋转编码器原理
2.1增量式-旋转编码器
码盘周期性旋转时,光源的光线会周期性地透过和被遮挡。当透过时,光敏装置会产生微弱的信号,信号通过放大电路处理,最后将这些信号输出。
增量式: 只输出位置变化和运动方向
我们可以通过A B两个波形的相位来判断正反转
Z相可以用于一圈之后对A B相计数的清空2.2绝对式-旋转编码器
2.3混合式
3.编码器的数据读取
我们一般接触到的都是增量式的旋转编码器。
3.1倍频计数
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为高电平
情况二:此时为向下计数
TI1 是下降,TI2为低电平
TI1 是上升,TI2为高电平
3.2.2同时在TI1和TI2处计数(四倍频)
把TI1和TI2两个通道都用来计数
3.3总结
总结来说,就是参考手册中的这张表
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