赞
踩
什么是编码器?
本文所讲的是带有编码器的有刷直流电机,有AB相或者ABZ相,AB相为电机转动时输出的波形,用来计数,计算电机转速,电机转动一圈还输出一个零位脉冲Z,不同电机相位有所变化,但AB相总是不变的。
定时器带有编码器模式,且只有通道1和通道2有,所以配置时要注意!!!
编码器技术规则,可详见电机控制基础——定时器编码器模式使用与转速计算 - 知乎 (zhihu.com)
以编码器5举例:从中间值32767开始计数(很多都是从0开始计数,都没关系)
- Encoder_Init_TIM5(0,65535); //编码器不分频 arr最大----main中调用
-
-
- /********************************************
- * @brief 把TIM5初始化为编码器接口模式
- * @param psc 预分频系数
- * @param arr 自动重装载值
- * @retval None
- ********************************************/
- void Encoder_Init_TIM5(uint16_t psc,uint16_t arr)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器4的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能PB端口时钟
-
- GPIO_StructInit(&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- TIM_DeInit(TIM5);
- TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
- TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频器
- TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
- TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
-
- //使用编码器模式3
- TIM_EncoderInterfaceConfig(TIM5, \
- TIM_EncoderMode_TI12, \
- TIM_ICPolarity_Rising, \
- TIM_ICPolarity_Rising);
- TIM_ICStructInit(&TIM_ICInitStructure);
- TIM_ICInitStructure.TIM_ICFilter = 10;
- TIM_ICInit(TIM5, &TIM_ICInitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel =TIM5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //0
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- //清除TIM的更新标志位
- TIM_ClearFlag(TIM5, TIM_FLAG_Update);
- TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
-
- //Reset counter
- TIM_SetCounter(TIM5,32767);
- TIM_Cmd(TIM5, ENABLE);
- }
-
-
- int Encoder_Get(u8 TIMx)
- {
- int encoder_value;
-
- case 2:
- if(Encoder2_Overflow == 0)
- encoder_value = (TIM2 -> CNT) - 32767;
- else if(Encoder2_Overflow > 0)
- encoder_value = (TIM2 -> CNT) + Encoder2_Overflow * 65535;
- else
- encoder_value = (TIM2 -> CNT) - 65535 + Encoder2_Overflow * 65535;
-
- TIM2 -> CNT=32767;
- Encoder2_Overflow = 0;
- return encoder_value;
- }
-
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。