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

结束语

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

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

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

相关文章

实战:从Oracle standby数据库端备份数据库并在异机恢复一个新的数据库

导读 为减少主库的备份压力&#xff0c;在standby备库备份数据库&#xff0c;由于测试需要&#xff0c;现在在异机恢复一个数据库的测试环境&#xff0c;即利用standby数据库的备份恢复一个新的数据库。 1、查看standby 数据库备份脚本 #!/bin/sh . ~/.bash_profile DATEdate …

【VTKExamples::PolyData】第四十六期 Reflection

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Reflection,并解析接口vtkReflectionFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Reflection …

Docker容器详解

一、概述 1.1 基本概念&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚…

SpringCloud 各自组件的停更/升级/替换

一、停更不停用 现在 SpringCloud 不再修复 bug&#xff0c;也不再接收合并请求&#xff0c;也不再发布新版本&#xff0c;但是目前还是可以继续使用的。 二、以前的组件 以前 SpringCloud 常用的组件如下图&#xff0c;服务的注册和发现使用 Eureka&#xff0c;服务的负载和调…

深入理解c指针(七)

目录 十、回调函数和qsort函数 1、回调函数 2、简单介绍size_t 数据类型 3、qsort 排序函数 3.1 qsort函数简单举例1&#xff08;升序排序&#xff09; 3.2 qsort函数简单举例2&#xff08;字符串长度排序&#xff09; 3.3 简单讲解 -> 操作符 3.4 常见符号的ASCII…

如何利用会话式AI提升你的工作效率?

会话式AI如何改变我们的生活和工作 在当今时代&#xff0c;内容策略的重要性日渐凸显&#xff0c;良好的内容策略能够与流量及转化率紧密相连&#xff0c;成为企业在内容策略领域不容忽视的营销工具之一。 然而&#xff0c;目前内容同质化现象严重&#xff0c;企业若想在内容营…

iPaas数据传输的方式

一、iPaas平台概述 iPaas&#xff08;Integration Platform as a Service&#xff09;平台&#xff0c;作为一种先进的云计算服务模式&#xff0c;为开发者和企业提供了一种全面且灵活的应用集成解决方案。它构建在PaaS&#xff08;Platform as a Service&#xff09;基础之上…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 再谈构造函数1.1 …

WiFi模块赋能智能手表:拓展功能与提升连接性

随着科技的不断进步&#xff0c;智能手表正逐渐成为现代人生活中不可或缺的智能配饰。其中&#xff0c;WiFi模块的应用为智能手表带来了更多强大的功能和更高的连接性&#xff0c;为用户提供了更为便捷、智能化的使用体验。本文将深入探讨WiFi模块在智能手表中的应用。 远程通信…

RK DVP NVP6158配置 学习

NVP6158简介 NVP6158C是一款4通道通用RX&#xff0c;提供高质量图像的芯片。它接受来自摄像机和其他视频信号的独立4通道通用输入来源。它将4通道通用1M至8M 7.5P视频格式数字化并解码为代表8位ITU-R BT.656/1120 4:2:2格式的数字分量视频&#xff0c;并将单独的BT.601格式与27…

牛客小白月赛84_C-k级序列

这道题的思路还是很好想的,前一个的值,一定要<当前值范围的最大值 非常有意思的一个点就是,在保证上面的条件成立后,这个pre该怎么给? 刚开始想以为是贪心,就-k,往少了给,但写着写着发现不对劲,这个k>pre, 而这个-k可没保证>pre啊 其实,这个pre给值的范围是[a-k,…

机器学习介绍

机器学习是人工智能领域的一个重要分支&#xff0c;它利用算法和统计模型使计算机系统能够从数据中“学习”并改进其性能&#xff0c;而无需进行明确的编程。在过去的几十年里&#xff0c;机器学习技术取得了显著的进步&#xff0c;并在许多领域产生了深远的影响。本文将对机器…

输出控制符 %s 的理解

首先%s是控制输出字符串的。其输出成员的本质是指针&#xff01;&#xff01;&#xff01;&#xff01; 从当前指针开始&#xff0c;到/0停止 char* p "abcd"; printf("%s\n", p); //会输出abcd 其次printf支持直接输出字符串 printf("abc…

Vitual Box虚拟机打开后,键盘鼠标失效

Vitual Box虚拟机打开后&#xff0c;键盘鼠标失效 作者在使用Vitual Box虚拟机软件时&#xff0c;偶然发现打开VitualBox后&#xff0c;鼠标和键盘均无法使用。 你以为是“主机热键”引起的&#xff1f;NO&#xff01; 废话少说 直接上干货&#xff1a; 在VitualBox设置下有…

40个Python字符串实例

Python 字符串是 Python 编程语言中最常用的数据类型之一&#xff0c;它可以表示文本或一组字符。Python 中的字符串是不可变的序列&#xff0c;意味着一旦创建&#xff0c;其值就不能被修改。下面是一些关于 Python 字符串的介绍。 概述 创建字符串&#xff1a;可以使用单引…

面向服务的架构SOA

随着信息技术的不断发展和企业业务的日益复杂化&#xff0c;传统的应用架构已经难以满足现代企业的需求。为了应对这一挑战&#xff0c;面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;简称SOA&#xff09;应运而生&#xff0c;它以其独特的优势和特性&a…

如何找回删除的文件?5个数据恢复方法

电脑已经成为我们生活和工作不可或缺的一部分。然而随着电脑使用频率的增加&#xff0c;误删文件的情况也时有发生。一旦重要的文件被误删&#xff0c;很多人会感到惊慌失措。实际上只要掌握了一些有效的数据恢复方法&#xff0c;就有可能找回那些被误删的文件。本文将为你介绍…

指针中的回调函数与qsort的深度理解与模拟

今天给大家在更新一下指针类型的知识&#xff0c;这里讲到了一个库函数sqort&#xff0c;以及回调函数的理解。 望喜欢 目录 回调函数 qsort函数 qsort模拟实现 回调函数 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数…

scrapy分布式爬虫的部署,调度,与管理(scrapy + scrapy-redis + scrapyd + gerapy)

使用到的框架及软件包介绍 Github Gerapy 提供主机管理,爬虫项目管理,爬虫任务管理的web管理后台。Github Scrapy-redis 提供中心化的任务队列,任务指纹队列,供分布式爬虫共享爬取任务队列。Github Scrapyd 提供通过api方式单机部署爬虫的功能,爬虫状态查询等。Github Scr…

Mac清理电脑垃圾工具CleanMyMac X4.15中文免费版下载

嘿&#xff0c;亲爱的Mac用户们&#xff0c;你们是否曾经想象过你的电脑是一座美丽的城市&#xff0c;而垃圾文件则是那些不速之客&#xff0c;悄悄堆积&#xff0c;影响着城市的整体美观。今天&#xff0c;我们就来聊聊Mac为什么会产生垃圾文件&#xff0c;这些垃圾文件会对你…