芯片是STM32F407VGT6,采用定时器TIM4.
void ENCODER_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM3_ICInitStructure;
TIM_ICInitTypeDef TIM4_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //使能PORTD时钟
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; //GPIOD12/GPIOD13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //管脚复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //管脚速度100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //管脚悬空
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化 GPIO
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4); //PC6复用定时器4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4); //PC7复用定时器4
TIM_DeInit(TIM4);
TIM_TimeBaseStructure.TIM_Period= 511 * 4; //自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler= 0x00; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure); //初始化 TIM3
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM4_ICInitStructure);
TIM3_ICInitStructure.TIM_ICFilter = 0x06; //IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM3_ICInitStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //允许更新中断
TIM4->CNT=0;
TIM_Cmd(TIM4,ENABLE ); //使能定时器4
NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
}
void TIM4_IRQHandler(void)
{
if(TIM4->SR&0x0001)//溢出中断
{
}
TIM4->SR&=~(1<<0);//清除中断标志位
}
TIM3->CNT就是增量编码盘的脉冲值,其值范围是0-编码盘线数(重装载值我这里是2044)。
电机转速获得可以通过该脉冲值获得。
当前转速大小=(当前一扫描周期脉冲值-上一扫描周期脉冲值)*k(比例系数)
要想获得精确的rpm,需要综合考虑执行周期,编码盘线数,减速比,计算获得。
若只需获得大概反应电机速度变化的数值,可默认为1.
至此,电机速度环已形成。
尾声
有时间写一下编码盘电机角度控制.
这里获得了脉冲值,也就是相对角度,电机在不同位置的脉冲值不同。
一般来说编码器线数的意思是,当编码盘旋转一周变化的脉冲值(如2044)
若定义起始位为脉冲值为0 ,角度也为0 ,则当旋转180度时,脉冲值应为1022.
可以通过这个实现电机角度位置控制。具体来说要对相对角度处理,转化为绝对角度。
https://blog.csdn.net/qq_40696002/article/details/105487992