STM32CubeIDE基础学习-定时器PWM实验

STM32CubeIDE基础学习-定时器PWM实验


文章目录

  • STM32CubeIDE基础学习-定时器PWM实验
  • 前言
  • 第1章 硬件介绍
  • 第2章 工程配置
    • 2.1 基础工程配置部分
    • 2.2 生成工程代码部分
  • 第3章 代码编写
    • 3.1 查看PWM波
    • 3.2 设置单个比较值
    • 3.3 呼吸灯
  • 第4章 实验现象
  • 总结


前言

在平时单片机开发时,需要用到单片机输出一个固定占空比,那么就可以采取PWM脉冲调制技术了。

PWM在STM32的应用中还是比较常用的,比较多的设备是需要用PWM来驱动的,比如舵机、步进电机等。

STM32CubeIDE基础知识学习回顾

实验目的:
学习使用定时器输出PWM功能,实现定时器输出占空比从而可以在开发板的LED灯看效果功能。

注意:查看本实验现象要要用到示波器工具,这个要懂得示波器基础使用才行。


第1章 硬件介绍

LED灯的连接原理图如下:

在这里插入图片描述
由上图硬件连接原理图可知,LED接到主控芯片的PA8引脚上,想要看输出的PWM波,可以直接选择LED所在的引脚作为定时器输出通道就可以看到具体现象了。

实验过程中,用肉眼单纯看PWM的占空比是看不出来的,那么需要借助工具才行,我查看波形采用正点原子的DS100示波器,这个示波器的性能用在本实验是足够了,可以查看占空比、周期、时间宽度和占空比对应的电压等。

接着打开芯片数据手册,下拉找到PA8引脚所在的位置,如下图所示:

在这里插入图片描述

该PA8引脚所在定时器1的通道1上,所以后面配置这个定时器通道输出PWM即可。

当然,如果手上有示波器,就不一定要选LED所在的输出通道了,直接选一个定时器输出通道即可,直接用示波器来看输出的波形或占空比也是很方便的。

第2章 工程配置

2.1 基础工程配置部分

本实验采用LED实验的工程作为模板,直接在上面添加定时器PWM的功能配置即可。

第一步:配置定时器时钟源。

在这里插入图片描述
按照标号步骤依次选择即可,定时器1使用的是内部时钟源,通道1输出。

第二步:配置定时器相关参数。

在这里插入图片描述
根据定时器公式,PSC取7199,ARR取99,向上计数模式。

第三步:配置PWM参数。

在这里插入图片描述

采用PWM1模式,极性为高电平有效,这里参数Pulse的值就是CCRx的值,用来设置初始占空比的值,在初始化时,可以设置也可以不设置,让其默认为0,这里问题不大,后面在实际使用时还是会改变该值的。那么为了查看初始PWM的情况这里就初始化设置为ARR值的一半,即初始为50%的占空比。输出比较默认为使能即可。

到此,定时器及PWM功能配置完成之后,可以看到芯片的PA8引脚被配置为了TIM1_CH1了,如下图所示:

在这里插入图片描述

2.2 生成工程代码部分

配置完功能之后就可以点击生成工程代码了。

可以看到main文件多了一个定时器的初始化函数和tim.c文件,如下图所示:

在这里插入图片描述
进入定时器初始化函数后如下图所示:

在这里插入图片描述

里面主要是设置定时器相关参数等。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
到此,检查生成初始化代码部分没有问题后就可以编写完成后面的控制功能代码就可以了。

第3章 代码编写

3.1 查看PWM波

在输出PWM之前,需要使能输出通道才可以,即使能CC1E位,使能之后就可以输出PWM了,不然是无法正常输出的。main函数调用使能函数如下图所示:

在这里插入图片描述

到此,前面设置PWM参数时,已经设置了Pulse的值为50了,那么使能输出通道之后不用写其它代码就可以正常输出一个50%占空比的PWM波了。

下面就用示波器来查看该波形情况,效果如下图所示:

在这里插入图片描述

根据公式计算和结合示波器输出参数,可以看到占空比是50%,周期是10ms,频率100Hz。经过示波器的参数显示分析,它们参数一致则说明代码的设置是正确的。

3.2 设置单个比较值

使能初始化正常之后,就可以调用函数来设置CCRx的值来设置指定PWM占空比了。

HAL库提供了一个设置比较值函数,__HAL_TIM_SET_COMPARE(HANDLE, CHANNEL, COMPARE);
该函数的第一个参数是定时器句柄、第二个是定时器输出通道、第三是比较值。

函数具体定义如下所示:

在这里插入图片描述

在while循环里面调用该函数,然后传入相关参数,如下图所示:

在这里插入图片描述
这里传入100则是占空比为100%了。下面以传入30为例演示:

代码片示例如下:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 30);
      /* USER CODE END WHILE */
  }

下载代码后,示波器检测波形如下图所示:

在这里插入图片描述
函数比较值传入30,即占空比为30%,高电平电压为1.07接近1.1了。说明这个函数设置的比较值是没有问题的。

3.3 呼吸灯

能正常独立设置单个比较值之后,就可以把该变量设置为实时动态变化的数值,按规律递增或递减改变,这样就可以实现一个类似呼吸灯的效果了。

代码片示例如下:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_Delay(30);       /* 控制速度 */
      if(dir)
      {
          pwm_val++;
          if(pwm_val >= 99)
          {
              dir = 0;
          }
      }
      else
      {
          pwm_val--;
          if(pwm_val == 0)
          {
              dir = 1;
          }
      }
	  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_val);
      /* USER CODE END WHILE */
    }

定义局部变量如下图所示:

在这里插入图片描述

在这里插入图片描述

下载代码后,就可以看到开发板的LED逐渐变亮,再由最亮逐渐变暗了,类似呼吸灯效果。要是想要显示呼吸的快慢不一样,设置延时参数即可,时间越短,速度越快。

注意:这个比较值最大是100,实际测试时发现到80时LED基本可以达到最亮了,所以会看到亮的时间会比较长些,如果要亮的时间和灭的时间差不多,可以设置最大的值限制为80,而不用到99了,根据实际情况设置即可。

第4章 实验现象

看上面具体内容介绍即可。


总结

定时器输出PWM功能还是比较好玩的,能弄懂这个功能的使用,可以应用到很多的场景了,可以控制输出固定的电压,STM32的IO最大输出是3.3v的,按照前面的例子来等分就可以得到相应的电压值了。呼吸灯的效果也很有意思,类似手机的消息提示了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Midjourney艺术家分享|By Moebius

Moebius,本名让吉拉德(Jean Giraud),是一位极具影响力的法国漫画家和插画师,以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价,也为电影、时尚和广告等多个领域提供了灵感。…

MATLAB多级分组绘图及图例等细节处理 ; MATLAB画图横轴时间纵轴数值按照不同sensorCode分组画不同sensorCode的曲线

平时研究需要大量的绘图Excel有时候又臃肿且麻烦 尤其是当处理大量数据时可能会拖死Windows 示例代码及数据量展示 因为数据量是万级别的折线图也变成"柱状图"了, 不过还能看出大致趋势! 横轴是时间纵轴是传感器数值图例是传感器所在深度 % data readtable(C:\U…

Vue依赖注入,详细解析

Prop 逐级透传问题​ 通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。…

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 ,而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…

RedHat9中KVM虚拟机的配置与管理

KVM虚拟技术介绍 Linux的KVM(Kernel-based Virtual Machine)虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机,每个虚拟机都有自己的操作系统和应用程序,就像运行在独立的物理…

互联网轻量级框架整合之JavaEE基础II

编写本篇代码并实际执行之前请仔细阅读前一篇互联网轻量级框架整合之JavaEE基础I Servlet 在Servlet容器中,Servlet是最基础的组件,也可以把JSP当做Servlet,JSP的存在意义只在于方便编写动态页面,使Java语言能和HTML相互结合&…

【数据结构(一)】初识数据结构

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你学更多数据结构知识 目录 1.前言2.集合架构3.时间和空间复杂度3.1算法效率3.2时间复杂度3.2.1大O的渐进…

Docker 安装 | 部署MySQL 8.x 初始设置

1、准备工作 如果不想看前面的废话请直接右边目录跳到 运行容器 处 默认你已经有 docker 环境。 Windows 推荐 Docker Desktop (下载地址)并基于 WSL2 运行 Docker 环境 mac 推荐 Orbstack (下载地址)(这个很节省资源&…

Codeforces Round 836 (Div. 2) D. Range = √Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

Codeforces Round 837 C. Hossam and Trainees 【欧拉筛加速大数素因子分解】

C. Hossam and Trainees 题意 给定一个长度为 n n n 的正整数数组 a a a&#xff0c;问是否能找到两个不同的位置 i , j ( i ≠ j ) i,j(i \neq j) i,j(ij)&#xff0c;使得 a i a_i ai​&#xff0c; a j a_j aj​ 不互质&#xff0c;即 g c d ( a i , a j ) > 1 gc…

算法设计与分析实验报告java实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、排序算法…

数据挖掘中的PCA和KMeans:Airbnb房源案例研究

目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步&#xff1a;确定 PCA 组件的最佳数量 10.2 第 2 步&#xff1a;使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…

小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 如何理解UDP 是面向报文的协议如何理解字节流如何解决粘包固定长度的消息 特殊字符作为边界自定义消息结构 如何理解UDP 是面向报文的…

Linux系统中的高级动态链接器技术

Linux系统中的高级动态链接器技术是当今软件开发中不可或缺的一部分。其中&#xff0c;ELF格式&#xff08;Executable and Linkable Format&#xff09;和动态链接库&#xff08;Dynamic Linking Library&#xff09;是两个核心概念。本文将详细介绍Linux系统中的这些技术&…

【数据结构】顺序表的实现——动态分配

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

从C到C++过渡知识 中(为什么C++支持函数重载,而C不支持函数重载)

感谢大家的阅读&#xff0c;这篇文章我们接着了解C对于C的一些优化。 函数重载 了解C这个特殊用法之前&#xff0c;我们先考虑一个问题&#xff0c;如何交换两个整数。相信大家一定信手捏来&#xff0c;实参传地址而非变量&#xff0c;于是可以写出如下函数。 void Swap(int*…

轻薄本没有独立显卡如何运行stable diffusion

众所周知&#xff0c;Stable Diffusion WebUI 使用 GPU 模式运行。 一&#xff1a;检查自己显卡 打开任务管理器或者winR 输入dxdiag 查看自己显卡状态 很明显一般轻薄本只会带有集显&#xff0c;不能满足stable diffusion要求所以我们可以使用cup来运行stable diffusion 在…

计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密流程步骤

随着网络技术的不断应用&#xff0c;企业的生产运营得到了快速发展&#xff0c;越来越多的企业开始利用服务器数据库存储企业的重要信息文件&#xff0c;数据库为企业的生产运营提供了极大便利&#xff0c;但网络技术的不断发展也为企业的数据安全带来严重威胁。近日&#xff0…

用于推荐系统的自监督超图Transformer 笔记

1 Title Self-Supervised Hypergraph Transformer for Recommender Systems&#xff08;Lianghao Xia, Chao Huang, Chuxu Zhang&#xff09;【KDD 2022】 2 Conclusion User behavior data in many practical recommendation scenarios is often noisy and exhibits skewed d…

模糊控制对应关系

一. 基本的一些对应关系 1.论域&#xff1a;X&#xff0c;一般来说取得变量∀x∈X 2.隶属函数&#xff1a;μ( x ) 3.误差&#xff1a;e 4.误差变化率&#xff1a;c&#xff0c;这是对误差求导得到的 5.模糊集常用的量&#xff1a; PL/PB&#xff08;Positive Large/Posi…