首页 > 其他分享 >10_TIM编码器接口

10_TIM编码器接口

时间:2024-02-08 14:12:27浏览次数:25  
标签:TIM2 10 编码器 void NVIC TIM TimeBaseInitStruct GPIO

TIM编码器接口

编码器接口简介

image-20240205190002648

正交编码器

image-20240205192950615

旋转编码器简介

image-20240206181812450

编码器接口基本结构

image-20240206183710635

工作模式

image-20240206184156542

实例(均不反相)

image-20240206190536184

实例(TI1反相)

image-20240207120958521

编码器接口测速

选择接口和定时器

image-20240207121701601

接线图

image-20240207155310471

代码

Encoder.c

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//时基单元配置
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=65536-1; //ARR 自动装载值
	TIM_TimeBaseInitStruct.TIM_Prescaler=1-1; //PSC 预分频器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&	TIM_TimeBaseInitStruct);
	
	//输入捕获单元配置
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICStructInit(&TIM_ICInitStruct);
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_1 | TIM_Channel_2; 
	TIM_ICInitStruct.TIM_ICFilter=0xF; //值越大效果越好
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	//配置编码器接口
	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;
}

Encoder.h

#ifndef __ENCODER_H__
#define __ENCODER_H__

void Encoder_Init(void);
int16_t Encoder_Get(void);

#endif

Timer.c

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能时钟
	TIM_InternalClockConfig(TIM2); //配置内部时钟
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_Period=10000-1; //自动重装器
	TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1; //预分频器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); //配置时基单元
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除中断标志位,防止初始化时就会进一次中断
	
	//中断配置
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //更新中断
	
	//NVIC配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

/*
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}
*/

Timer.h

#ifndef __TIMER_H__
#define __TIMER_H__

void Timer_Init(void);

#endif

main.c

#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();
	Encoder_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Speed:");
	while(1)
	{
		OLED_ShowSignedNum(1,7,Speed,5);
	}
}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Speed = Encoder_Get();
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

标签:TIM2,10,编码器,void,NVIC,TIM,TimeBaseInitStruct,GPIO
From: https://www.cnblogs.com/mzx233/p/18011767

相关文章

  • 09_TIM输入捕获
    TIM输入捕获输入捕获简介频率测量输入捕获通道主从触发模式输入捕获基本结构PWMI基本结构输入捕获模式测频率接线图引脚选择代码IC.c#include"stm32f10x.h"//DeviceheadervoidIC_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Per......
  • 08_TIM输出比较
    TIM输出比较输出比较简介CNT:计数器CCR:捕获/比较寄存器PWM简介输出比较通道(高级)输出比较通道(通用)输出比较模式PWM基本结构参数计算舵机简介舵机硬件电路直流电机及驱动简介硬件电路PWM驱动LED呼吸灯接线图参数计算产生一个频率为1KHz,占空比......
  • 07_TIM定时中断
    TIM定时中断TIM简介定时器类型基本定时器通用定时器高级定时器基本定时器仅支持向上计数:0->重装值->发起中断通用定时器和高级定时器支持向上计数,向下计数,中央对齐计数向下计数:重装值->0->发起中断中央对齐计数:0->重装值->发起中断->0->发起中断基本定时器只......
  • 一个命令行 让你的Windows 10/11重回Windows 7
    尽管Windows10、Windows11加起来占了94%以上的市场份额,但依然还有3%左右的用户在坚守Windows7。如果你也想回顾一下Windows7当年的体验,不妨试试下面这个方法。Win+R打开“运行”框,只需要输入以下命令:powershellirmrevert8plus.gitlab.io|iex按“确定”,脚本就会开始工作......
  • P2986 [USACO10MAR] Great Cow Gathering G
    原题链接题解很简单想到暴力,但是\(O(n^2)\)显然不行所以要减少计算量,如何利用已经计算过的值而不是重新算一遍呢?这道题最好看成有中心点的网状图,而不是树状图随便取一个点\(A\)作为根节点,很容易计算其答案,如何计算以其他点为根节点的答案呢?对于以根节点的邻边节点\(B\)......
  • PAT乙级-1008(数组元素循环右移问题)
    一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯A**N−1)变换为(A**N−M⋯A**N−1A0A1⋯A**N−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:每个输入包......
  • 代码随想录算法训练营第十五天| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2
    层序遍历  102.二叉树的层序遍历-力扣(LeetCode)思路:结合了昨天学到的标记法,每当一层遍历完,向队列中添加一个NULL标记。遍历到NULL节点表示该层遍历完了,将结果存入结果集中。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNo......
  • UVA10225 Discrete Logging 题解
    题目传送门前置知识大步小步算法题意多组询问,每次询问依次给定\(p,a,b\),求\(a^{x}\equivb\pmod{p}\)的最小非负整数解,其中\(a,p\)互质。解法BSGS板子题,不做过多介绍。貌似本题比P3846[TJOI2007]可爱的质数/【模板】BSGS和BZOJ3239DiscreteLogging数据较强......
  • LocalDateTime判断时间段归属
    //v2024-02-0207:52:572024-02-0214:39:14//DateinTime=Date.from(Instant.ofEpochMilli(1707150614000L));//LocalDateTimeinTimeLocalDateTime=DateUtil.dateToLocalDateTime(inTime);LocalDateTimeinTime=LocalDateTime.parse("2024-02-01......
  • Go语言的100个错误使用场景(30-40)|数据类型与字符串使用
    目录前言4.控制结构4.1忽视元素在range循环中是拷贝(#30)4.2忽略在range循环中如何评估表达式(#31)4.3忽略在range中使用指针元素的影响(#32)4.4对map遍历的错误假设(#33)4.5忽略break的作用(#34)4.6在循环中使用defer(#35)5.字符串5.1不理解rune的概念(#36)5.2不准确的字......