编码器学习笔记(1)

匿名 (未验证) 提交于 2019-12-02 22:56:40

达成目标:测出电机的转速以及位置

单片机: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上的中断标志位 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!