达成目标:测出电机的转速以及位置
单片机:stm32F4
主要详细配置以下部分:
(1)定时器中断及中断配置(定时器中断中转化电机转动速度与位置参数)
(2)外部中断及外部中断配置
1)定时器中断配置及中断函数
定时器中断配置
TIM3_Int_Init(1000-1,8400-1);
定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms
1)定义中断及抢占优先级名称
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure;
2)使能TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
3)设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Period = arr;
4)设置时钟频率除数的预分频值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
5)设置向上计数模式
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
6)设置时钟分割
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
7)初始化TIM3
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
8)允许定时器3更新中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
9)使能定时器3
TIM_Cmd(TIM3,ENABLE);
配置中断优先级
1)定时器3中断
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
2)配置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
3)配置子优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
4)定时器3使能
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
5)中断优先级初始化
NVIC_Init(&NVIC_InitStructure);
定时器中断函数
1)判断是否溢出中断
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
2)求出电机转动速度
eg:四倍频 500线编码器
v=±1(正转或反转)/(500(线数)*转一线所需要的时间)
eg:a1=a/50;//Speed a:foward/reverse=1/(500*0.1)
3)求出变化位置
变化位置=V*转一线所需时间*一线周长
eg:a2=(a/50)*0.1*3.14*0.0762;//Position speed*time/线*π*D
4)最终位置
最终位置+=变化位置
eg:a3+=a2;
5)浮点型转换并且LCD显示
6)正反向参数归0
7)清除中断标志位
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
2)外部中断配置及外部中断函数
外部中断配置
1)定义中断与中断优先级名称
2)初始化IO口
3)使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
4)EXIT_LineX具体指向的IO口(External Interrupt Line0-15 is GPIO_X PIn_X)
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOG, EXTI_PinSource2);
5)配置EXIT_LineX
①确定中断线Line_X
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
②配置模式
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
③触发条件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
④使能中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
⑤配置
EXTI_Init(&EXTI_InitStructure);
6)配置中断优先级
①确定外部中断线中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
②抢占优先级
③子优先级
④使能外部中断通道
⑤中断优先级初始化
外部中断函数
1)读取IO口状态判断,AB相是否相同(同相则反转,反相则正转)
if(A==B) a--;//Reverse else a++;//Forward
2)清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
文章来源: 编码器学习笔记(1)