STM32f4日记5之AB相编码器测速实验(TIM定时器的编码器模式使用)_stm32编码器ab相计数

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);

TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;                  

TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter =0;
TIM_ICInit(TIM4,&TIM_ICInitStructure);

TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;                  

TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter=0;
TIM_ICInit(TIM4,&TIM_ICInitStructure);

TIM\_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );

NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x02;
NVIC_Init(&NVIC_InitStructure);

TIM\_ITConfig(TIM4,TIM_IT_Update,ENABLE);                        
TIM\_Cmd(TIM4,ENABLE);   

}


最难配置的已经告诉大家了  
 最重要的是这个函数TIM\_EncoderInterfaceConfig(TIM4,TIM\_EncoderMode\_TI12,TIM\_ICPolarity\_Rising,TIM\_ICPolarity\_Rising );  
 配置的编码器模式,具体模式为TIM\_EncoderMode\_TI12  
 其它timer.h里代码如下



void TIM5_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC\_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);            	

TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  										TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 	
TIM_TimeBaseInitStructure.TIM_Period=arr;   										
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 

TIM\_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);

TIM\_ITConfig(TIM5,TIM_IT_Update,ENABLE); 										     
TIM\_Cmd(TIM5,ENABLE); 																           

NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; 									 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 			 
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; 						 
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC\_Init(&NVIC_InitStructure);

}

void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
{
Encoder_Timer_Overflow++;
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

}

u32 Read_Encoder(void)
{
u32 Count;
u16 Current_Count;
u16 Enc_Timer_Overflow_one;

Enc_Timer_Overflow_one=Encoder_Timer_Overflow;
Current_Count = TIM_GetCounter(TIM4);
Encoder_Timer_Overflow=0;
if((TIM4->CR1&0x0010) == 0x0010)
Count = (u32)((-1*Enc_Timer_Overflow_one)*(4*ENCODER_PPR-4) + (Current_Count - Previous_Count));
else
Count = (u32)(Current_Count - Previous_Count + (Enc_Timer_Overflow_one) * (4*ENCODER_PPR-4));

Previous_Count = Current_Count;
return(Count);
}


这里面  
 if((TIM4->CR1&0x0010) == 0x0010)  
 Count = (u32)((-1*Enc\_Timer\_Overflow\_one)*(4\*ENCODER\_PPR-4) + (Current\_Count - Previous\_Count));  
 else  
 Count = (u32)(Current\_Count - Previous\_Count + (Enc\_Timer\_Overflow\_one) \* (4乘以ENCODER\_PPR-4));  
 用来得到脉冲的数量并通过DIR位来判断给不给脉冲数量加正负号  
 主函数代码如下  
 main.c



#include "sys.h"

#include “delay.h”
#include “usart.h”
#include “led.h”
#include “key.h”
#include “timer.h”
#include “pwm.h”
#include “gpio.h”
#include “math.h”
#include “stdio.h”
#include “control.h”

int encode;
float speed,t;
extern int Encoder_Timer_Overflow;
u8 key;
int duty=50;
void keyscan(void);
int main(void)
{

delay\_init(168);		
uart\_init(115200);	
KEY\_Init();
\_GPIO\_Init();

  NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);
					
    TIM13\_PWM\_Init(8400-1,0);  // 84mhz->10khz
		TIM\_SetCompare1(TIM13,(int)(8400\*(duty/100.0)));

Encoder\_Init\_TIM4((ENCODER_PPR-1)\*4,1-1);        
TIM5\_Int\_Init(500-1,8400-1);                     
          
           
										
						while(1)
							{  
							  keyscan();
				        delay\_ms(200);

}
}

void keyscan(void)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case WKUP_PRES:
GPIO_ToggleBits(GPIOF,GPIO_Pin_6);
GPIO_ToggleBits(GPIOF,GPIO_Pin_4);
break;

				case KEY0_PRES:		
					duty+=5;
					if(duty>100)duty=0;
					TIM\_SetCompare1(TIM13,8400\*(duty/100.0));				
					break;
		 }
	}

}

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

涵盖了95%以上物联网嵌入式知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值