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

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建