STM32单片机(五)第二节:EXTI外部中断练习2(旋转编码器计次)

news2024/11/17 10:31:10

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf

链接里压缩包的解压密码:32

本大节主要学习STM32的中断系统和外部中断,包含两部分,第一小节主要学习中断系统的基础知识,第二小节是写两个程序进行练习,即对射式红外传感器计次和旋转编码器计次,最终附上所有的源代码;
本小节主要是对上一节学习的EXTI外部中断进行实战练习,编写程序进行练习,实现旋转编码器计次,并附上程序源码;

文章目录

  • 一、本节目标
  • 二、设备介绍
    • 2.1 设备介绍
    • 2.1.1 旋转编码器介绍
    • 2.1.2 旋转编码器硬件电路
  • 三、旋转编码器计次源码
    • 3.1 接线图
    • 3.2 代码

一、本节目标

目标:旋转编码器计次

转动“旋转编码器”时,OLED屏幕上的数字也跟着变化;例如当向右转动旋转编码器时,屏幕上的数字变大,向左转动旋转编码器时,屏幕上的数字变小,如下图所示,初始数字为0

在这里插入图片描述
当向右旋转时,数字逐渐变大:
在这里插入图片描述

向左旋转时,数字变小
在这里插入图片描述

二、设备介绍

2.1 设备介绍

2.1.1 旋转编码器介绍

在这里插入图片描述

  • 第一个图的旋转编码器只能测位置和速度,不能测方向
  • 第二个图是本课程使用的旋转编码器,第三张图是其内部拆解;既可以测位置和速度,也可以测方向;

2.1.2 旋转编码器硬件电路

在这里插入图片描述

三、旋转编码器计次源码

代码路径:\STM32入门教程资料\STM32入门教程资料\程序源码\程序源码\STM32Project\5-2 旋转编码器计次\User

3.1 接线图

在这里插入图片描述
左边旋转编码器模块,上面VCC和GND接正负极,下面这两个A,B相输出引脚,分别接到STM32的PB0和PB1两个引脚;

实物接线图如下所示:

在这里插入图片描述

3.2 代码

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

int16_t Num;

int main(void)
{
	OLED_Init();
	Encoder_Init();
	
	OLED_ShowString(1, 1, "Num:");
	
	while (1)
	{
		Num += Encoder_Get();
		OLED_ShowSignedNum(1, 5, Num, 5);
	}
}

Encoder.c:

#include "stm32f10x.h"                  // Device header

int16_t Encoder_Count;

void Encoder_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
	
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
}

int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = Encoder_Count;
	Encoder_Count = 0;
	return Temp;
}

void EXTI0_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line0) == SET)
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
		{
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
			{
				Encoder_Count --;
			}
		}
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}

void EXTI1_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line1) == SET)
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
		{
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
			{
				Encoder_Count ++;
			}
		}
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}

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

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

相关文章

C语言编程语法—结构

C 的令牌(Tokens) C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌: printf("Hello,World! \n"); 这五个令牌分别是&#x…

【Servlet学习六】Cookie 与Session 实现登录与上传文件

目录 一、Cookie与Session(掌握) 🌈1、Cookie是什么? 🌈2、Session是什么? 二、代码功能演示 🌈1、实现登录功能(掌握) 🌈2、实现上传文件功能&#xf…

基于深度学习的高精度扑克牌检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度扑克牌检测识别系统可用于日常生活中或野外来检测与定位扑克牌目标,利用深度学习算法可实现图片、视频、摄像头等方式的扑克牌目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

打造专属个人模型-私有独立离线模型部署-阿里云GPU服务器配置

阿里云有免费的机器学习 GPU 服务器,免费试用活动页https://free.aliyun.com只要没有申请过 PAI-DSW 资源的新老用户皆可申请 5000CU 的免费额度,3个月内使用。 选择第一个进行立即试用 可以看到试用的界面 如果遇到下面的错误,当前账号没有权…

【跳棋】跳棋游戏-多人游戏-微信小程序开发流程详解

看到跳棋游戏,一个2到6人可一起玩的游戏,于是联想起,自己上小学时候陪同学们玩过的弹珠游戏,是不是跟跳棋游戏很像呢,看了跳棋玩法,有兴趣就研究,这里把跳棋游戏给弄出来了,想知道地…

com.alibaba.druid.pool.DruidDataSource报错(显示红色)

springbootAlibaba项目,application.yml配置如下: 圈中的地方报错,pom.xml也引入了druid依赖,如图: 最后改为: 解决。

Halcon学习之一维测量(2)

在Halcon学习之一维测量(1)文章中,我们介绍了直线测量中的基于边缘对的,还有一种是不基于边缘对的,而是基于边缘的。 接下来讲解就以,Halcon自带的例子,芯片pin引脚测量为例子,主要测量引脚的数量,引脚的平均宽度,还有引脚之间的距离: 源码: * Pin Measurement…

攻防世界-Crypto-Normal_RSA

题目描述:下载附件后,附件中只有两个文件,一个是加密后的密钥,一个是公钥文件 背景知识:RSA加密算法 现在相当于给出了密文和公钥,需要我们去求解明文 1. 思路分析 既然要解密,那么必须要获取…

【数据结构与算法】树和二叉树练习题(选择填空)

【数据结构与算法】树和二叉树练习题:选择填空类型 Ⅰ.知前序和中序推理后序Ⅱ.知后序和中序推理前序Ⅲ.深度/广度遍历Ⅳ.通过遍历推理树的形状Ⅴ.树节点问题 Ⅰ.知前序和中序推理后序 题目名称: 1.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff…

ChatGPT实战:项目管理

人工智能有可能彻底改变许多行业,包括项目管理,及时了解最新技术以及它如何影响你的工作至关重要,因为学习好项目管理,不管你能不能做项目经理,在生活、工作的方面方面都会享受到懂得项目管理后带来的收益。 下面我们借…

np.averag的运算规则

今天写代码的时候,计算加权平均,一直没有搞懂np.average是怎么运算的,做个笔记记录一下: 创建一个(3,4,5)维度的np数组,然后在创建一个[1,0.5,1]的权重数组,计算他们的加权平均&…

Spring Boot Actuator实现应用监控

1、Spring Boot Actuator实现应用监控 前面的例子中,我们学习的都是 Prometheus 自身的内容,即监控的都是机器或者系统层面的指标。那么如果我 们需要对 Java 应用做监控,例如:监控 JVM 的信息,监控 Spring Bean 的信…

如何实现多 Tab 同步登陆和退出

一. 场景再现 前两天接到一个需求,要求实现类似于 B站 的那种,当我同时打开多个 Tab 标签的时候,如果我在某一个窗口退出了,那么其它窗口的登陆状态也需要同步退出。如下图,我同时打开了两个 tab 。 当我点击其中一个…

【Java】SpringBoot项目中resource目录下有多个配置文件,如何指定某个特定的配置文件生效?

在我们开发项目的时候,会有多个开发环境,比如测试环境,生产环境,开发环境,产品环境等环境,如下 怎么多的配置文件,那么哪一个配置文件会生效?我们如何指定我们需要的配置文件&…

调用office的Excel制作统计图,并保存成图片

public class CMSChart{private Chart chart;public CMSChart(Chart chart){this.chart chart;}/// <summary>/// 保存图片/// </summary>/// <param name"fullPicName"></param>public void SaveAs(string fullPicName){ChartImageFormat …

VMware 虚拟机安装 CentOS 8

一、准备 演示过程使用的软件版本如下&#xff1a; VMware 16.2.5 build-20904516 CentOS 8.5.2111-x86_64-dvd1.iso VMware 下载安装请参考&#xff1a;VMware16.x 下载与安装 CentOS 镜像下载请参考&#xff1a;CentOS 各版本镜像下载 VMware 15 及以下版本&#xff0c;不支…

nginx部署本地项目如何让异地公网访问?服务器端口映射配置!

接触过IIS或apache的小伙伴们&#xff0c;对nginx是比较容易理解的&#xff0c;nginx有点类似&#xff0c;又有所差异&#xff0c;在选择使用时根据自己本地应用场景来部署使用即可。通过一些对比可能会更加清楚了解&#xff1a; 1.nginx是轻量级&#xff0c;比apache占用更少…

C# 多数元素

169 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&…

FPGA USB FX2 数据回环试验 驱动CY7C68013A实现 提供工程源码和技术支持

目录 1、前言2、我这儿已有的 FPGA USB 通信方案3、CY7C68013A芯片解读和硬件设计FX2 简介SlaveFIFO模式及其配置 4、工程详细设计方案5、vivado工程6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 目前USB2.0的实现方案很多&#xff0c;但就简单好用的角度而言&a…

kkfileview部署使用

1.gitee下载源码 kkFileView: 使用spring boot打造文件文档在线预览项目解决方案&#xff0c;支持doc、docx、ppt、pptx、wps、xls、xlsx、zip、rar、ofd、xmind、bpmn 、eml 、epub、3ds、dwg、psd 、mp4、mp3以及众多类文本类型文件在线预览 2.去掉cad 3.替换水印字体为免费…