TIM编码器接口(编码器测速)

news2025/3/15 11:24:48

定时器编码器接口自动计次--------->对应手册14.3.12编码器接口模式

应用场景:

电机控制PWM驱动电机,编码器测电机速度,PID算法闭环控制

---------------------------------------------------------------------------------------------------------------------------------

一、结构分析

 

 

 

 

 

*输入 :CH1/CH2 -->边沿检测-->编码器接口

*输出:控制CNT计数时钟和计数方向

逻辑:A相边沿检测+B相状态 =CNT增/减

正转向上计数,反转都向下计数 

 

 解释反相:

输入捕获那里,极性选择决定上升沿有效还是下降沿有效;但是这里我们知道上升沿下降沿都有用,这里就不是边沿的极性选择,是高低电平极性选择

选择上升沿参数,高低电平极性不反转;选择下降沿参数,经过一个非门,高低电平反转

 

二、编码器测位代码分析

新函数学习:

/*****定时器编码器接口配置*****/
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

STEP1 RCC开启时钟

STEP2 配置GPIO为输入模式

STEP3 配置时基单元:PSC不分频,ARR 65535,CNT执行计数

STEP4 输入捕获单元:滤波器、极性

STEP5 配置编码器接口模式:调用库函数

STEP6 TIM_Cmd

ENCODER.C

#include "stm32f10x.h"                  // Device header
void Encoder_Init(void)
{
	/*****STEP1 开启时钟*****/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	/*****STEP2 配置GPIO*****/
	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);
	
	/*****STEP3 配置时基单元*****/	
	
	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);

	/*****STEP 4 输入捕获配置*****/
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICStructInit(&TIM_ICInitStructure);//赋一个初始值
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                    
	//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_ICPolarity = TIM_ICPolarity_Rising;          //高低电平极性不反转,不反相
	TIM_ICInit(TIM3,&TIM_ICInitStructure);
	
/*****STEP 5 配置编码器接口*****/
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);

/*****STEP 6 定时器使能*****/
	TIM_Cmd(TIM3,ENABLE);
}

int16_t Encoder_Get(void)
{
	return TIM_GetCounter(TIM3);

}

实现反转负数(补码原理):int16_t 如果用uint16_t 就是65535递减 

main.c

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





int main(void)
{
	OLED_Init();

	Encoder_Init();
	
	OLED_ShowString(1,1,"CNT:");
	
	while(1)
	{
		OLED_ShowSignedNum(1,5,Encoder_Get(),5);
		
	}
	
}

目前向右转增,向左减,若不是想要的增减方向,更改极性

更改极性

硬件:AB相接线换一下

软件:修改输入通道的极性,把任意一个极性反转一下

三、编码器测速代码分析

固定的闸门时间读一次CNT再清零

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

void TIM2_IRQHandler(void)//减少使用DELAY
{
	if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Speed = Encoder_Get();
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}	

ENCODER 改动部分:

 

int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return Temp;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1453318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lv15 I2C背景知识(裸机I2C、linux对I2C支持、MPU6050)4

一、I2C总线背景知识 SOC芯片平台的外设分为: 一级外设:外设控制器集成在SOC芯片内部 二级外设:外设控制器由另一块芯片负责,通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit: 字面意思是用于“集成电路之…

在面试中,如何回复擅长 Vue 还是 React

目录 一、Vue.JS 二、React 三、Vue和React的区别 四、前端开发框架 一、Vue.JS Vue.js(通常简称为Vue)是一个用于构建用户界面的开源JavaScript框架。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动…

74HC373使用方法

74HC373属于D锁存器 OC:输出控制,低电平输出使能 LE:锁存使能输入,低电平直通,高电平锁存 Q:数据输出引脚 D:数据输入引脚

[VulnHub靶机渗透] Fowsniff

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

外包干了3个多月,技术退步明显。。。。

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

linux 网络服务小实验

实验图和要求: 1)网关服务器:ens36:12.0.0.254/24,ens33:192.168.44.254/24;Server1:192.168.44.20/24;PC1和Server2:自动获取IP;交换机无需配置。…

[职场] 优质简历怎么做 #学习方法#笔记

优质简历怎么做 简历是求职的“敲门砖”,直接影响着求职成败。然而,不少求职者对简历不太重视,认为简历就是写自己的经历。因此,在招聘现场,常会看到这样的简历:有的是从某招聘网站直接下载而来&#xff0c…

基于SFLA算法的神经网络优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 SFLA的基本原理 4.2 神经网络优化 5.完整程序 1.程序功能描述 基于SFLA算法的神经网络优化。通过混合蛙跳算法,对神经网络的训练进行优化,优化目标位神经网络的…

第13章 网络 Page744~746 asio核心类 ip::tcp::endPoint

2. ip::tcp::endpoint ip::tcp::socket用于连接TCP服务端的 async_connect()方法的第一个入参是const endpoint_type& peer_endpoint. 此处的类型 endpoint_type 是 ip::tcp::endpoint 在 在 ip::tcp::socket 类内部的一个别名。 libucurl 库采用字符串URL表达目标的地…

【Unity】【VR开发】针对VR项目的优化版Unity Build Settings

【背景】 编辑器中做了功能后,打包后却总会画面不满意,所以到处学习,总结成本篇,希望有用。 【准备】 本篇总结基于Unity 2021 LTS。 模板选择3D(URP) 如果URP不支持所用的部分Assets,那么也可以选择Built-in管线,不过URP肯定画面效果上要胜过Built-in。 HDRP不适用…

火绒(显示病毒HEUR:Trojan/AvKiller.c),误删explore.exe,导致电脑白屏,解决方法

桌面程序explore.exe被火绒当病毒清理了 对,就是火绒导致的,如果按照操作依然黑/白屏,直接找到火绒安装目录打开火绒在右上角设置区找到隔离区里把explorer全部恢复,然后根据提示加到白名单,最后关闭程序后重启或者直接…

《汇编语言》- 读书笔记 - 实验9 根据材料编程

《汇编语言》- 读书笔记 - 实验9 根据材料编程 需求所需的相关知识属性字节每一位的含义 分析字符位置属性 解答思路代码 效果 需求 在屏幕中间分别显示 绿色、绿底红色、白底蓝色 的字符串 welcome to masm!。 所需的相关知识 80x25 彩色字符模式显示缓冲区(以下简称为显示…

C语言-----函数功能实现---strcpystrlen

1.函数功能参数介绍 该函数的功能就是把一个字符串复制到另外的一个数组,包括\0; 2.首先我们要明确字符串的复制也是包括最后的\0的; void mystrcpy(char* dest, char* src) {while (*src!\0){*dest *src;dest;src;}*dest *src;} int mai…

VMwareWorkstation17.0虚拟机安装搭建Windows 11虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建Windows 11虚拟机(完整图文详细步骤教程) 一、下载Windows11二、配置Windows11虚拟机机器环境三、启动Windows11系统 一、下载Windows11 【点击打开最全面的Windows 11原版系统镜像下载地址】 https://blog.csdn.ne…

STM32——OLED菜单

文章目录 一.补充二. 二级菜单代码 简介:首先在我的51 I2C里面有OLED详细讲解,本期代码从51OLED基础上移植过来的,可以先看完那篇文章,在看这个,然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

目录 一、GPIO 概述二、GPIO模块相关API三、实例四、GPIO HDF驱动开发4.1、LED驱动程序(待续...)4.2、LED驱动配置(待续...) 坚持就有收获 轻量系统设备通常需要进行外设控制,例如温湿度数据的采集、灯开关的控制,因此在完成内核开发后,需要进…

【无标题】Matlab 之axes函数——创建笛卡尔坐标区

**基本用法:**axes 在当前图窗中创建默认的笛卡尔坐标区,并将其设置为当前坐标区。 应用场景1:在图窗中放置两个 Axes 对象,并为每个对象添加一个绘图。 要求1:指定第一个 Axes 对象的位置,使其左下角位于…

精工电联:定制精工线缆,赋能科技互联---致力于为客户提供卓越的连接线缆和连接器产品

精工电联 “定制精工线缆 ,赋能科技互联”,精工电联致力于为高科技产业提供全方位、多维度的集成线缆解决方案。凭借深厚的研发实力和丰富的行业经验,精工电联已经成功地在工控设备、医疗设备、人工智能、新能源领域、轨道交通和超声波设备等…

TCP三次握手、四次挥手(简易版)

TCP是面向连接的:在真正通讯之前,必须先建立一条通讯线路,必须先完成连接。 TCP完成连接的过程:(保证通讯线路畅通) 建立连接: 三次握手基本过程 ①客户端首先向服务器发送一个建立连接的…

中科星图——LANDSAT_8/02/T1/TOA的Landsat8_C2_TOA类数据集

简介 数据名称: Landsat8_C2_TOA 数据来源: USGS 时空范围: 2020年1月-2023年3月 空间范围: 全国 数据简介: Landsat8_C2_TOA数据集是将数据每个波段的辐射亮度值转换为大气层顶表观反射率TOA,是…