STM32F103ZET6进行霍尔编码电机测速
使用正点原子的库,如有错误欢迎指正
霍尔编码电机
我用的电机上的霍尔编码器是这样的 两个反馈信号输出,两者相位差90° 连接示波器后显示的波形如下
测速方法
使用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; //置零
根据数据读取时间和电机的各类参数可以计算出速度