“每一次的感应,都是对环境的温柔拥抱。”#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

相关文章

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对