“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】

2024-03-05 18:36

本文主要是介绍“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】

    • 前言
    • 预备知识
    • 1.定时器介绍1
      • 1.1软件延时的优缺点
      • 1.2定时器工作原理
      • 1.3定时器的分类
      • 1.4 STM32F103C8T6定时器资源
      • 1.5通用定时器介绍
    • 2.定时器介绍2
      • 2.1定时器计数模式
      • 2.2定时器时钟源
      • 2.3定时器溢出计算公式:
    • 3.使用定时器中断点亮LED灯
      • 3.1实验需求
      • 3.2配置工程
      • 3.3编程实现实验需求
    • 4.PWM概述
      • 4.1 STM32F103C8T6 PWM资源
      • 4.2 PWM输出模式
      • 4.3 PWM周期与频率
      • 4.4 PWM占空比
    • 5. PWM实现呼吸灯效果
      • 5.1实验需求
      • 5.2实验原理
      • 5.3配置工程
      • 5.4编程实现实验需求
    • 结束语

前言

  本篇博文介绍的是基于STM32F103C8T6单片机第二个项目《感应开关盖垃圾桶》,包含定时器介绍1,定时器介绍2,使用定时器中断点亮LED灯,PWM概述,PWM实现呼吸灯效果。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、基本电路标识识别和接线,例如VCC,GND。
  二、电脑基本操作复制粘贴
  三、分文件编程
  四、C变量
  五、基本输入输出
  六、流程控制
  七、函数
  八、指针

  如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!

1.定时器介绍1

1.1软件延时的优缺点

  1. 优点:

  简单易实现:软件延时通常只需要编写一小段代码,通过循环或者延时函数即可实现,不需要额外的硬件资源。

  对硬件要求低:软件延时不需要专门的硬件支持,只需要有基本的CPU运算能力即可。

  灵活性高:软件延时可以根据需要进行调整,可以很容易地改变延时的时间长度。

  节省成本:由于不需要额外的硬件资源,软件延时可以在很大程度上节省硬件成本。

  1. 优点:

  占用CPU资源:在软件延时期间,CPU需要一直执行延时代码,无法执行其他任务,这会导致CPU资源的浪费。

  影响系统性能:如果大量使用软件延时,会导致系统实时性变差,因为CPU在等待延时期间无法处理其他任务。

  精度受限:软件延时的精度可能受到操作系统调度、中断等因素的影响,不如硬件延时精确。

void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}

1.2定时器工作原理

  1. 时基的定义:

  **时基是一个时间显示的基本单位,也可以理解为时间基准。**它在不同的领域有不同的应用。

  在电子线路中,时基主要用来表示数字电路中的基准时钟,例如在示波器中,时基表示示波器上横轴一大格波形所占据的时间。时基决定了示波器相对采样率的大小,也在一定程度上决定了示波器显示波形与原波形的相符合程度。

  在计算机系统中,时基是用来衡量时间的基准,用于同步和计时以实现各种功能。时基的类型有多种,如硬件时钟、系统时钟等,它们各自在计算机系统中扮演不同的角色。时基的准确性对计算机系统的稳定性和准确性至关重要,它可以用来实现操作系统对不同进程的调度、对外部事件的响应等,同时在信息传输、网络通信等方面也发挥重要作用。

  此外,时基也可以指时间词中的“年、月、日、天”等语素,这些语素标明了计时的基准。

  1. 定时器工作原理:

  使用精准的时基,通过硬件的方式,实现定时器功能。定时器核心就是计数器。

在这里插入图片描述

1.3定时器的分类

  • 基本定时器(TIM6~TIM7),STM32单片机内部数量少,也用得少
  • 通用定时器(TIM2~TIM5),STM32单片机内部数量多用得也多
  • 高级定时器(TIM1TIM8),STM32单片机内部数量少,也用得少。

在这里插入图片描述

1.4 STM32F103C8T6定时器资源

在这里插入图片描述

1.5通用定时器介绍

  1. 16 位向上、向下、向上/向下自动装载计数器TIMx_CNT)。
  2. 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的
    任意数值。
  3. 4 个独立通道TIMx_CH1~4),这些通道可以用来作为:
    A.输入捕获
    B.输出比较
    C.PWM 生成(边缘或中间对齐模式)
    D.单脉冲模式输出
  4. 可使用外部信号TIMx_ETR)控制定时器定时器互连(可以用 1 个定时器控制另外一个定时器
    的同步电路。
  5. 如下事件发生时产生中断/DMA:
    A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    B.触发事件(计数器启动、停止初始化或者由内部/外部触发计数)
    C.输入捕获
    D.输出比较
    E.支持针对定位的增量(正交)编码器霍尔传感器电路
    F.触发输入为外部时钟或者按周期的电流管理

2.定时器介绍2

2.1定时器计数模式

计数模式计数溢出值计数重装值
向上计数CNT = ARRCNT = 0
向下计数CNT = 0CNT = ARR
中心对齐计数CNT = ARR - 1CNT = ARR
CNT = 1CNT = 0

在这里插入图片描述

2.2定时器时钟源

在这里插入图片描述

2.3定时器溢出计算公式:

在这里插入图片描述

在这里插入图片描述

  例如,要定时500ms,则:PSC=7199,ARR=4999,Tclk=72M

3.使用定时器中断点亮LED灯

3.1实验需求

  使用定时器中断方法,每500ms翻转一次LED1和LED2的状态

3.2配置工程

  1. 配置RCC,如下步骤

在这里插入图片描述

  1. 配置时序框图,如下图步骤。

在这里插入图片描述

  1. 配置GPIO口,如下图步骤。

在这里插入图片描述

在这里插入图片描述

  1. 将配置PB8默认输出高电平,PB9默认输出低电平。实现LED1默认关闭,LED2默认打开。

在这里插入图片描述

在这里插入图片描述

  1. 定时器介绍,如下图。

在这里插入图片描述

  1. 配置定时器2,如下图步骤。

在这里插入图片描述

  1. 定时器溢出参数介绍。

在这里插入图片描述

  1. 配置定时器溢出参数,如下图步骤。

在这里插入图片描述

  1. 打开定时器中断,如下图步骤。

在这里插入图片描述

  1. 配置工程基本信息,如下图步骤。

在这里插入图片描述

  1. 配置生成工程必要文件,如下图步骤。

在这里插入图片描述

  1. 生成工程,如下图步骤。

在这里插入图片描述

3.3编程实现实验需求

  1. 找到MX_TIM2_Init();函数体,确认htim2中什么元素接收定时器模式。

在这里插入图片描述

  1. 找到定时器中断服务函数,实现每隔0.5秒亮灭LED灯

在这里插入图片描述

  1. 修改定时器中断服务函数,实现每隔0.5秒亮灭LED灯。
    • 修改思路看代码注释
    • 定时器中断服务函数代码
//发生定时器中断,立马进入定时器中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//一根定时器中断线上有很多中断源//检测定时器2中断源if(htim->Instance == TIM2){//检测到定时器2中断源后进行LED1和LED2状态的翻转HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);}
}
  1. 在主函数中调用启动定时器函数
HAL_TIM_Base_Start_IT(&htim2);

4.PWM概述

4.1 STM32F103C8T6 PWM资源

  • 高级定时器(TIM1):7路
  • 通用定时器(TIM2~TIM4);各4路

4.2 PWM输出模式

  1. PWM模式1:在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 在向下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。
  2. PWM模式2:在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 在向下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。

在这里插入图片描述

4.3 PWM周期与频率

在这里插入图片描述

4.4 PWM占空比

  由TIMx_CCRx寄存器决定。

5. PWM实现呼吸灯效果

5.1实验需求

  使用PWM点亮LED1和LED2实现交叉呼吸灯效果

5.2实验原理

  1. LED灯越来越亮和越来越暗的原理是:由不同的占空比决定
  2. 使用公式计算周期和频率:例如2KHz,则:PSC=71,ARR=499
  3. LED1连接到定时器4的3通道,LED2连接到定时器4的4通道。参考手册内容

在这里插入图片描述

5.3配置工程

  1. 配置SYS,如下图步骤。

在这里插入图片描述

  1. 配置RCC,如下图步骤。

在这里插入图片描述

  1. 配置时序框图,如下图步骤。

在这里插入图片描述

  1. 配置LED1相应引脚输出PWM波,如下图步骤。

在这里插入图片描述

  1. 配置LED2相应引脚输出PWM波,如下图步骤。

在这里插入图片描述

  1. 根据公式,配置定时器溢出值,使产生2000Hz的PWM波。如下图步骤。

在这里插入图片描述

  1. PWM输出参数理解

在这里插入图片描述

  1. 设置LED1和LED2相应引脚PWM输出参数有效电平为低电平,如下图步骤。

在这里插入图片描述

在这里插入图片描述

  1. 配置工程基础信息,如下图步骤。

在这里插入图片描述

  1. 配置生成工程必要文件,如下图步骤。

在这里插入图片描述

  1. 生成工程,如下图步骤。

在这里插入图片描述

5.4编程实现实验需求

  1. 定义LED1和LED2的占空比变量,定义PWM方向变量。
uint16_t pwmVal1 = 0;   //调整 LED1 PWM 占空比
uint16_t pwmVal2 = 500;   //调整 LED2 PWM 占空比
uint8_t dir = 1;        //设置改变方向。1:占空比变大;0:占空比变小
  1. 在定时器初始化函数后面打开定时器4通道3(LED1)和通道4(LED2)的PWM
//打开定时器4通道3和通道4的PWM
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);
  1. 循环实现呼吸灯效果思路请看代码注释。
while (1){/* USER CODE END WHILE *///延时1毫秒,防止灯一直灭HAL_Delay(1);//检测占空比变大方向if(dir) {pwmVal1++;  //LED1逐渐变亮pwmVal2--;  //LED2逐渐变暗}else //占空比变小方向{pwmVal1--;  //LED1逐渐变暗pwmVal2++;  //LED2逐渐变亮}if(pwmVal1 > 500)     //当LED1达到最亮,就让LED1逐渐变暗;当LED2达到最暗,就让LED1逐渐变亮{dir = 0;}else if(pwmVal1 == 0) //当LED1达到最暗,就让LED1逐渐变亮;当LED2达到最亮,就让LED1逐渐变暗{dir = 1;}//修改占空比的值,修改比较值,实现LED灯的呼吸效果__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal1);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,pwmVal2);/* USER CODE BEGIN 3 */}

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

这篇关于“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777446

相关文章

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可