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