1. 主页
  2. 文档
  3. 双轮平衡小车
  4. 外设
  5. ENCODER

ENCODER

编码器接线图

编码器是这样一种传感器,它与电机的轴相连,电机转动,它也进行转动,从而由传感器(霍尔或光电)发出一系列的脉冲,比如转一圈发出N个脉冲,那么我们只要通过计数脉冲的个数,就能够知道电机所转圈数,再根据圈数/时间即可以得到小车的速度。

STM32定时器有编码器模式,将小车编码器的A相、B相接到有编码器模式的定时器的CH1、CH2,即可读取脉冲的个数。

编码器A相、B相间隔90°,可以根据这个进行四倍频,提高编码器精度,也可以根据这个判断小车当前所转的方向。

这里选取的是霍尔传感器的编码器,其精度为13CPR,意味着后轴转动一圈发出13个脉冲,而电机的减速比为1:34,因此转一圈单独A相或B相发出,13*34=442个脉冲。

若采取软件四倍频的方式(STM32定时器的编码器模式为四倍频),则转动一圈发出442*4=1768个脉冲。

相关代码路径:HARDWARE/ENCODER/encoder.c

初始化TIIM3、TIM4为编码器模式:

void Encoder_TIM3_Init(void){	// GPIO口初始化	GPIO_InitTypeDef GPIO_InitStructure;  	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	TIM_ICInitTypeDef TIM_ICInitStructure;		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);		GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);    	GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM3);		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;	GPIO_Init(GPIOA, &GPIO_InitStructure);	// 定时器编码器模式初始化		TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); // 这里配置了编码器模式	//TIM_SelectHallSensor(TIM3, ENABLE);	TIM_Cmd(TIM3,ENABLE); //使能定时器3}void Encoder_TIM4_Init(void){	// GPIO口初始化	GPIO_InitTypeDef GPIO_InitStructure;  	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	TIM_ICInitTypeDef TIM_ICInitStructure;		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);		GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;	GPIO_Init(GPIOD, &GPIO_InitStructure);	// 定时器编码器模式初始化		TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); // 这里配置了编码器模式	//TIM_SelectHallSensor(TIM1, ENABLE);	TIM_Cmd(TIM4,ENABLE); //使能定时器5}

读取左、右轮计数值:

int Read_Encoder_Left(void){	int encoder_num;	encoder_num =(int)((int16_t)(TIM3->CNT)); // 这里尤其需要注意数据类型	return encoder_num;}int Read_Encoder_Right(void){	int encoder_num;	encoder_num =(int)((int16_t)(TIM4->CNT)); // 这里尤其需要注意数据类型	return encoder_num;}

计算转动圈数:

//转速wheel_left=(float)Read_Encoder_Left()/1768.0;//转一圈计数器增加值wheel_right=(float)Read_Encoder_Right()/1768.0;

至于计算速度,可以在定时器中断里面进行。

这篇文章对您有用吗?

我们要如何帮助您?

发表评论

邮箱地址不会被公开。 必填项已用*标注