STM32F103ZET6进行霍尔编码电机测速

使用正点原子的库,如有错误欢迎指正

霍尔编码电机

我用的电机上的霍尔编码器是这样的
两个反馈信号输出,两者相位差90°
STM32F103ZET6进行霍尔编码电机测速_第1张图片
连接示波器后显示的波形如下
STM32F103ZET6进行霍尔编码电机测速_第2张图片

测速方法

使用STM32F103ZET6通用定时器的编码器模式对反馈信号进行计数。
代码:

  //结构体声明
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  TIM_ICInitTypeDef TIM_ICInitStructure;  
  GPIO_InitTypeDef GPIO_InitStructure;
  //时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  
  //GPIO(根据所选的TIM)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);     
	
  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(TIM4, &TIM_TimeBaseStructure);  
	
	//***编码器接口模式***//
	//***编码器接口TIM4、模式选择IC1+IC2、IC1反相、IC2反相(电机反装)
    //***正装的话TIM_ICPolarity_Falling---->TIM_ICPolarity_Rising(正相)
  TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling,   TIM_ICPolarity_Falling);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 9;//指定输入捕获滤波器
  TIM_ICInit(TIM4, &TIM_ICInitStructure);
	
  TIM_ClearFlag(TIM4, TIM_FLAG_Update);
  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  TIM_Cmd(TIM4, ENABLE); 

数据读取

VL = TIM_GetCounter(TIM4); //***将计数器寄存器值给VL
TIM4 -> CNT=0;                      //置零

根据数据读取时间和电机的各类参数可以计算出速度

你可能感兴趣的:(信息存留)