stm32单片机个人学习笔记10(TIM编码器接口)

news2024/11/23 18:46:29

前言

本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

一、编码器接口简介

二、正交编码器

 

检测一个相的边沿,然后再检测另一个相的电平状态,得到编码器的正转还是反转 

三、编码器接口基本结构

 

GPIO口借用的就是输入捕获的通道1和通道2 产生TIFP1和TI2FP2后就接到编码器接口,后续输入捕获的结构与它无关

四、工作模式

仅在TI1计数即仅检测TI1的边沿和TI2的电平状态,不检测TI2的边沿

在TI1和TI2上计数就是同时检测TI1和TI2的边沿

一般使用在TI1和TI2上计数,因为这个精度高

一个电平不变,另一个电平持续变化,就是产生了毛刺,这次计数器就会执行加减加减的操作,最终的计数值不会变化,上图是两个信号都不反相

 

上图的TI1通过极性选择后反相了,给编码器的信号应该对TI1信号取反再查表 

五、实例(编码器接口测速) 

Encoder.c

输入捕获通道使用结构体初始化函数,其它参数不需要,只需要通道和滤波即可

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	//开启内部时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	//GPIO口初始化
	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_ICInit(TIM3, &TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	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;
}

 

 main.c

使用定时器每隔1s来取计数器的值,1s即为闸门时间

 

#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(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)
	{
		Speed = Encoder_Get();
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

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

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

相关文章

简单实现手机投屏到电脑代码

1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载图片 4、开启定时器 1、 private static void takeScreenshot(String path) {long t1 System.currentTimeMillis();String command "adb devices"; // 替换为你需要执行的shell命令String command1 "…

氧化锆ZrO2纳米颗粒50nm|L-ZrO2@mSiO2|Ir1-N-C/ZrO2|AuPd/HB-ZrO2

氧化锆ZrO2纳米颗粒50nm|L-ZrO2mSiO2|Ir1-N-C/ZrO2|AuPd/HB-ZrO2 氧化锆(ZrO₂)纳米颗粒,特别是直径为50纳米(nm)的颗粒,是一种具有多种应用前景的功能材料。这种材料因其独特的物理和化学性质&#xff0c…

大一计算机课程之线性代数

《大一计算机课程之线性代数》 在大一的计算机课程中,线性代数是一门极为重要的基础学科,它就像一把神奇的钥匙,为计算机科学领域的诸多方面开启了智慧之门。 线性代数主要研究线性方程组、向量空间、线性变换等内容。对于计算机专业的学生…

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。 注释的分类及语法 注释分为两类:单行注释 和 多行注释。 单行注释 只能注释一行内容,语法如下…

LabVIEW提高开发效率技巧----事件触发模式

事件触发模式在LabVIEW开发中是一种常见且有效的编程方法,适用于需要动态响应外部或内部信号的场景。通过事件结构(Event Structure)和用户自定义事件(User Events),开发者可以设计出高效的事件驱动程序&am…

深度探索:Linux CentOS 7内核的奥秘与管理之道

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Linux简介 2、CentOS 7简介 3、什么是内核 …

【3dgs】总结3DGS与NeRF如何重塑SLAM(24年4月最新进展)

【3dgs】总结3DGS与NeRF如何重塑SLAM! 1. 摘要2. 简洁3. 背景3.1 Existing SLAM Surveys3.2 progress in Radiance Field Theory3.3.1 NeRF3.3.2 3dgs3.4 数据集 4 数据集4.1 SLAM3.1 RGB-D SLAM方法3.1.1 基于NeRF风格的RGB-D SLAM3.1.2 基于3DGS风格的 RGB-D SLAM…

PHP政务招商系统——高效连接共筑发展蓝图

政务招商系统——高效连接,共筑发展蓝图 🏛️ 一、政务招商系统:开启智慧招商新篇章 在当今经济全球化的背景下,政务招商成为了推动地方经济发展的重要引擎。而政务招商系统的出现,更是为这一进程注入了新的活力。它…

【C++】踏上C++学习之旅(一):初识C++和命名空间

文章目录 前言1. 初识C2. C的发展阶段2. 命名空间2.1 为什么要有命名空间?2.2 命名空间的语法2.3 命名空间的原理2.4 使用命名空间的三种方式2.4.1 加命名空间名称及作用域限定符( :: )2.4.2 使用using关键字将命名空间中某个成员 引入2.4.3 使用using namespace 命…

注意力机制篇 | 清华大学提出Focused Linear Attention取代Self-Attention成为ViT的新宠

前言:Hello大家好,我是小哥谈。Focused Linear Attention(聚焦线性注意力)是一种用于视觉Transformer模型的注意力机制,旨在提高效率和表现力,它解决了传统线性注意力方法的两个主要问题:聚焦能力和特征多样性。🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.…

网络安全学习路线-适合入门小白

首先说明,我是一名CTF的web手,这是我自己亲身学习网络安全的路线,希望能够帮到大家,我虽然不是大牛,但我也希望能够帮助一些网安小白找到自己学习的方向,后面有就业的详细安全技术要求,如果真想…

大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

基于知识图谱的宁夏非遗问答系统

八维视角探索宁夏非遗文化——基于知识图谱的非遗问答系统 作为一名程序员,能将大数据与文化传承结合,赋予历史新的生命,是件多么振奋的事!今天给大家介绍的是一款基于知识图谱技术的宁夏非物质文化遗产问答系统。无论你是学术研…

数字化转型最佳实践与实施技巧:理论指导与企业应用路径

数字化转型中的最佳实践与实施技巧 企业在实施数字化转型时,面对的最大挑战之一是如何将理论转化为实际可操作的行动。成功的转型不仅依赖于新技术的引入,还涉及如何确保架构蓝图与业务目标一致,如何在确保合规的基础上进行创新,…

重磅!博世「入局」Chiplets,汽车芯片格局或迎来新「拐点」

汽车行业似乎并不想重复PC、手机时代的老路。 在过去几年时间里,由于消费类芯片巨头(包括英伟达、高通、AMD、英特尔等)大举进军汽车行业,导致传统Tier1和汽车芯片厂商逐步失去了市场控制权。如今,chiplets技术或许将重…

PHP实现OPENSSL的EVP_BytesToKey

使用PHP和nodejs进行通讯时候遇到双方加解密结果不一致的问题。 注意到crypto.createCipher(algorithm, password[, options])方法有如下的提示。 The implementation of crypto.createCipher() derives keys using the OpenSSL function EVP_BytesToKey with the digest alg…

Springboot整合抖音小程序获取access-token图片检测V3

抽取配置文件 appId以及secret需要自行在抖音开放平台获取 dy:appId: ttb0xxxxxsecret: 12a19a426xxxxxxxxxxxxx获取access-token 参照文档我们调用此接口需要先获取access-token 获取access-token官方文档地址 注意事项 client_token 的有效时间为 2 个小时,重复获…

基于Matlab使用蚁群算法寻找最优路径

基于Matlab使用蚁群算法寻找最优路径 与Dijkstra算法使用相同的地图。 每只蚂蚁都从起点出发,直到抵达终点。这与Example5_1.m 中解决旅行商问题不一样,旅行商问题中每一代的蚂蚁都是随机从一个节点出发。 文件说明 Example5_1.m 简单对参考资料2中的…

重启Windows远程的复制粘贴功能

有些时候远程Windows电脑偶尔会出现复制粘贴失效的情况 打开任务管理器,进程搜索RDP 剪贴板监视程序右键关闭任务。 因为远程剪切板程序位于C:\Windows\System32,所以直接winr输入rdpclip.exe执行即可启动。

Java项目实战II基于Java的医院急诊系统设计与实现(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在现代医疗…