4.3 TIM编码器

1、编码器简介

  1. Encoder Interface 编码器接口
  2. 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  3. 每个高级定时器和通用定时器都拥有1个编码器接口
  4. 两个输入引脚借用了输入捕获的通道1和通道2

2、正交编码器

极性判断,假设定义正向,则A相领先于B相90°,反转,则相反。

3、 

4、编码器接口基本结构

 

5、工作模式

 常用第三种,精度较前两种高。

6、实例(均不反向)

毛刺即为噪声,不影响计数,表现出其抗噪声特性 

主程序

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed;
int main(void)
{
	OLED_Init();
	Timer_Init();
	Encoder_Init();
	
	OLED_ShowString(1,1,"Speed:");
	while (1)
	{
		OLED_ShowSignedNum(1, 7,Speed, 5);
	}
}


void TIM2_IRQHandler ()
{
	if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET )//获取中断标志位
	{
		Speed=Encoder_Get();
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清楚TIM2中断标志位
	}
}

Encoder

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //模式选择应当与外部默认电平一致
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//时基单元的配置
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	//输入捕获单元配置
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICStructInit(&TIM_ICInitStructure);//结构体不完整,所以需要初始化结构体参数
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	//TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
	//未需要,不需配置
//	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	//TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	
	TIM_Cmd(TIM3,ENABLE);
}
int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return Temp;
}

Timer

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启APB1时钟函数
	TIM_InternalClockConfig(TIM2);//选择时基单元的时钟(内部)
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructInit;
	TIM_TimeBaseStructInit.TIM_ClockDivision=TIM_CKD_DIV1 ;//选择1分频,主要作用,滤波处理
	TIM_TimeBaseStructInit.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseStructInit.TIM_Period = 10000 -1;//周期,ARR自动重装器的值(同PSC取值范围0~65535)
	TIM_TimeBaseStructInit.TIM_Prescaler= 7200 -1;//PSC预分频器的值
	TIM_TimeBaseStructInit.TIM_RepetitionCounter=0;//重复计数器的值(高级定时器才有用)
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructInit);//初始化时基单元
	
	TIM_ClearFlag(TIM2,TIM_IT_Update);//清除标志位,防止一上电就进入中断
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断到NVIC
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
	
	NVIC_InitTypeDef NVIC_Initstructure;
	
	NVIC_Initstructure.NVIC_IRQChannel= TIM2_IRQn ;//中断通道
	NVIC_Initstructure.NVIC_IRQChannelCmd= ENABLE;
	NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority= 2;
	NVIC_Initstructure.NVIC_IRQChannelSubPriority= 1; 
	NVIC_Init(&NVIC_Initstructure);
	
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
	
}

实物

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值