江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次

1.原理

 

2.硬件连接

3.程序

CountSensor.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void)
{//配置RCC时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//EXTI和NVIC时钟一直是打开的//配置GPIO,端口为输入模式:GPIO_InitTypeDef GPIO_InitStruture;GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,可参考手册建议选择GPIO_InitStruture.GPIO_Pin = GPIO_Pin_14;GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruture);//配置AFIO,选择用上一步的GPIO,连接到后面的EXTI:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//配置AFIO的数据选择器//将PB14号引脚的电平信号通过AFIO进入到EXTI//配置EXTI(选择边沿触发方式,选择触发响应方式):EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//配置NVIC(选择优先级):NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2 bits for pre-emption priority,2 bits for subpriority//pre-emption抢占优先级 subpriority响应优先级NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);
}uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}void EXTI15_10_IRQHandler(void)//中断函数
{if(EXTI_GetITStatus(EXTI_Line14)==SET)//进行中断标志位的判断{Delay_ms(300);//消抖//开始中断函数:CountSensor_Count ++;EXTI_ClearITPendingBit(EXTI_Line14);//将中断标志位清除,以防无限中断}
}

CountSensor.h:

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);#endif

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1,1,"Count:");//显示字符串while(1){OLED_ShowNum(1,7,CountSensor_Get(),5);}
}

二.旋转编码计次

1.硬件连接

2.程序

Encoder.c:

#include "stm32f10x.h"                  // Device headerint16_t Encoder_Count;void Encoder_Init(void)
{//配置RCC时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//EXTI和NVIC时钟一直是打开的//配置GPIO,端口为输入模式:GPIO_InitTypeDef GPIO_InitStruture;GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,可参考手册建议选择GPIO_InitStruture.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruture);//配置AFIO,选择用上一步的GPIO,连接到后面的EXTI:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//配置AFIO的数据选择器//将PB0号引脚的电平信号通过AFIO进入到EXTIGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//配置AFIO的数据选择器//将PB1号引脚的电平信号通过AFIO进入到EXTI//配置EXTI(选择边沿触发方式,选择触发响应方式):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(选择优先级):NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2 bits for pre-emption priority,2 bits for subpriority//pre-emption抢占优先级 subpriority响应优先级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);}
}

 Encoder.h:

#ifndef __ENCODER_H
#define __ENCODER_H
void Encoder_Init(void);
int16_t Encoder_Get(void);
#endif

main.c:

#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);}
}

四.调试

出现了两个问题:

1.旋转无反应,调试发现因为有的面包板中间不相连,所以要用跳线相连。

2.旋转太慢时记不上数,最后在中断代码那里加了一个if语句防抖

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI Triton 入门教程

文章目录 Triton 简介背景Triton 与 CUDA 的关系 Triton 开发样例样例一:Triton vector addition 算子Triton kernel 实现kernel 函数封装函数调用性能测试 样例二:融合 Softmax 算子动机Triton kernel 实现kernel 封装单元测试性能测试 样例三&#xff…

【知识整理】Git Commit Message 规范

一. 概述 前面咱们整理过 Code Review 一文,提到了 Review 的重要性,已经同过gitlab进行CodeReview 的方式,那么本文详细说明一下对CodeReivew非常重要的Git Commit Message 规范。 我们在每次提交代码时,都需要编写 Commit Mes…

会声会影2024出来了吗?

近年来,随着人们对于娱乐和创意的需求不断增长,视频编辑软件也越来越受到大众的关注。其中,会声会影是一款备受欢迎的视频编辑软件,许多用户都在关注其新版本——会声会影2024。 然而,目前并没有官方宣布会声会影2024的…

如何制作一款建材商城微信小程序

现在,微信小程序已经成为了很多企业和商家开展线上业务的重要渠道之一。对于建材商城而言,制作一款专属的微信小程序可以帮助企业更好地展示产品、提供服务,并增加销售额。下面将介绍如何制作一款建材商城微信小程序。 首先,登录【…

C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题(Gold Mine Problem) 给定一个N*M尺寸的金矿,每个点都有一个非负数表示当前点所含的黄金数目,最开始矿工位于第一列,但是可以位于任意行。矿工只能向右,右上,右下三个方向移动。问该…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机( EVM )智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能:区块链项⽬⼤部分是开源的,如果你能读懂代码,就可以 规避很多亏钱项⽬。…

javaweb学习(day04-XML)

一、介绍 1 官方文档 地址: https://www.w3school.com.cn/xml/index.asp 2 为什么需要 XML 需求 1 : 两个程序间进行数据通信需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名…

php基础学习之错误处理(其一)

一,错误处理的概念 错误处理指的是系统(或者用户)在执行某些代码的时候,发现有错误,就会通过错误处理的形式告知程序员,俗称报错 二,错误分类 语法错误:书写的代码不符合 PHP 的语法规范,语法错…

Qt Android sdk配置报错解决

使用的jdk8总是失败,报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17,就配置生效了。Android sdk路径可以选用Android Studio自带的,但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后,点击‘测试连接’,若提示成功,则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数: mail.catchall.alias: 收件服…

300分钟吃透分布式缓存(拉钩教育总结)

开篇寄语 开篇寄语:缓存,你真的用对了吗? 你好,我是你的缓存老师陈波,可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚,经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…

代码随想录算法训练营 Day29 | LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II

LeetCode491.递增子序列 该题强调与之前的题目的不同在于给的数组顺序不能变换,这就导致了不能用used数组判断与前一个元素是否相同的方法进行去重的操作,因此该题加入了一个set,不和前一个元素比,而是判断之前有没有处理过这个值…

网工内推 | 项目经理,软考证书优先,最高26K,加班补贴

01 龙盈智达 招聘岗位:项目经理 职责描述: 1 根据业务员需求,完成生态圈下账簿中心系统的开发管理工作。 2 负责账簿中心实施过程中的需求调研分析、方案设计、开发测试、系统上线等工作的计划、组织协调、沟通等方面管理工作。 3 完成系统核…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

RabbitMQ的常见工作模式

Work queues 工作队列模式 模式说明 通过Helloworld工程我们已经能够构建一个简单的消息队列的基本项目,项目中存在几个角色:生产 者、消费者、队列,而对于我们真实的开发中 ,对于消息的消费者通过是有多个的。 比如在实现用户注册功能时&…

社区团购小程序有哪些功能 怎么制作开通

​随着社区团购的兴起,越来越多的人开始关注社区团购小程序的制作。社区团购小程序是一种基于移动互联网的新型购物方式,通过小程序,用户可以在社区内方便地参与团购活动,享受到更优惠的价格和更方便的购物体验。下面具体介绍社区…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 🦁 一. 前言🦁 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 🦁 一. 前言 各位好!我是&#x1…

【分布式事务 XA模式】MySQL XA模式详解

MYSQL中的XA事务 写在前面1. XA事务的基本原理2. MySQL XA事务操作 写在前面 MySQL 的 5.0.3 版本开始支持XA分布式事务,并且只有innoDB存储引擎支持XA事务。 1. XA事务的基本原理 XA事务本质上是一种基于两阶段提交的分布式事务,分布式事务可以理解成…

R语言数学建模(二)—— tidymodels

R语言数学建模(二)—— tidymodels 文章目录 R语言数学建模(二)—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …

redis启动错误

错误: Creating Server TCP listening socket 127.0.0.1:6379: bind: No error redis-server.exe redis.windows.conf redis-cli.exe shutdown auth "yourpassword"