六、HAL_Timer的PWM功能

news2024/11/16 11:32:03

1、开发环境

(1)Keil MDK: V5.38.0.0

(2)STM32CubeMX: V6.8.1

(3)MCU: STM32F407XGT6

2、PWM简介

2.1、什么是PWM

(1)PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

(2)PWM信号仍然是数字的,因为在给定的任何具体时刻,满幅值的直流供电要么完全有,要么完全无。就像单片机的引脚,要么是输出高电平,要么是输出低电平。

(3)PWM波本质是是一种方波,一段高电平,一段低电平,如此循环。

(4)举例说明。现在有一颗灯,该灯只能打开或者关闭。在足够高的频率下,固定周期的开灯关灯(假设周期是10uS,开灯x微妙,关灯10-x微妙);这种情况下,是感受不到灯熄灭的,开灯所占时间越多,灯的亮度就越大。

2.2、PWM相关的概念

(1)占空比:也就是输出的PWM中,高电平保持的时间与该PWM的周期的时间比。

(2)分辨率:例如要表示0-100的模拟量,12为的PWM,分辨率就是100/0xFF。

(3)频率:PWM波的周期的倒数。

(4)模拟量:连续变化的量。例如自然界中的温度,有2℃,2.1℃,2.1335...℃。

(5)数字量:计算机中存储的温度,假设用4个bit位来表示0-100的温度,温度的分辨率就是100/0xFF,温度值不可能非常精确到小数点后一百万位。

3、使用Timer实现PWM输出

3.1、没有PWM输出的定时器

(1)没有PWM输出的定时器只能自己定时设置中断,在中断中翻转电平。

(2)这样的缺点是比较麻烦,因为还要有ISR(Interrupt Service Routines: 中断服务程序)。

(3)这样的PWM周期没有那么精准,因为中断的跳转和执行本身需要消耗一定时间。

3.2、有PWM输出的定时器

(1)高性能的单片机定时器都有PWM输出功能,以前的51单片机就没有,现在的晓不得。

(2)例如定时器的计数值比如是0~100,设定一个比较值X。

(3)计数值大于比较值X,某引脚输出高电平;计数值小于比较直X,某引脚输出低电平。

(4)这个引脚大部分单片机是内部绑定了的,少部分可以通过软件进行设置。

(5)通过定时器的计数值和设定的比较值进行比较,输出不同的电平,这就是输出比较功能。

(6)输出比较功能是不需要中断的,时间到了电平是自动翻转的,在内部硬件的电路逻辑已经定好了。

(7)STM32中,使用PWM功能自动绑定了一个引脚。单片机设计的时候,每一路PWM输出都绑定了一个GPIO引脚。

4、示例程序目的&原理图

4.1、示例程序目的

(1)使用PWM输出,控制LED灯亮度,LED由灭逐渐变为LED最亮。

(2)PWM周期100uS。

(3)默认LED灯度50%。

(4)不是所有的GPIO都支持PWM输出。

4.2、原理图

(1)LED1,接PF9引脚。

5、STM32CubeMX创建工程及配置

5.1、创建工程

(1)打开STM32CubeMX软件。

(2)点击File→NewProject。

(3)Commercial Part Number(商用部件号)处输入MCU型号,然后选择正确的单片机型号,点击Start Project(开始项目)。

(4)配置工程名、工程存放文件等。

点击Project Manager(项目经理)进行如下配置。

点击Code Generator(代码生成器)进行如下配置。 

(5)点击GENERATE CODE生成KeilMDK工程。

5.2、配置时钟源和GPIO

(1)HSE、LSE时钟源头选择

  • HSE:高速外部时钟源
  • LSE:低速外部时钟源
  • Disable:禁用
  • BYPASS Clock Source:旁路时钟源
  • Crystal/Ceramic Resonator :水晶/陶瓷共振器
  • 一般选择水晶陶瓷共振器
  • 旁路时钟源就是由外部给定一个时钟信号,一般用于作为同步时钟。
  • 水晶/陶瓷共振器:指外接晶振,经过内部振荡电路产生时钟。

(2)LED1引脚配置,配置定时器后会变绿的。

(3)时钟树配置

5.3、配置定时器

(1)使能定时器并选择通道功能。

  • 勾选Activated,不能选择时钟源的时钟源为内部时钟。
  • PWM Generation CH1:配置通道1为PWM生成

(2)定时器Parameter Settings(参数设置)。

  • PWM周期100微秒,也就是定时时长100微秒。
  • 占空比:50%。也就是LED_PWM输出有效电平占比50%。
  • Prescler(PSC -16 bits value): 分频系数,选择72-1,进行72分频,即定时时钟变为72MHz/72 = 1MHz=1000000Hz。
  • Counter Mode: 计数器模式,选择Up,向上计数。
  • Counter Period (AutoReload Register-32 bits value): 计数器周期,16位自动加载值。
  • 时钟频率1000000Hz表示1秒钟时钟振荡1000000次。
  • Counter Period = 100us/(1/1000000Hz) =100uS/(1/1000000S) =100 。
  • Mode:PWM mode 1。递增计数时,当计数值 < 比较值,输出为有效电平,否则为无效电平。
  • Pulse:比较值,设置50%有效电平。设为50。
  • CH Polarity:有效电平是高电平还是低电平。
  • PWM Generation Channel 1配置详解见后文。

6、Keil MDK软件的编写

6.1、程序编写

/************************************
 *PWM输出有效电平为低电平。
 *定时器计数值 < 比较值,输出低电平;
 *定时器计数值 >=比较值,输出高电平。
 *比较值设置越大,LED灯越亮。
 *定时器计数值范围:0-99
 *比较值范围:0-100;0,LED灯灭;99,LED最亮。
 *LED亮50%,计数值为50。
 ************************************/
 
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1);

while (1)
{
    /*比较值越大,LED越亮;LED逐渐变亮*/
	for(uint8_t i = 0; i <= 99; i++)
	{
        __HAL_TIM_SetCompare(&htim14, TIM_CHANNEL_1, i);    /*设置比较值*/
		HAL_Delay(30);
	}
	
 }

6.2、完整工程下载地址

(1)完整工程存储再码云。

(2)STM32_CSDN: CSDN中STM32专栏的所有示例代码

7、定时器PWM配置详解

7.1、PWM mode 1和PWM mode 2

(1)在进行PWM信号输出时,有两种PWM模式:PWM1模式和PWM2模式。这两种PWM模式和输出有效电平的极性共同决定了PWM信号的波形。

(2)PWM1模式。递增计数时,当TIMx_CNT(计数值)<  TIMx_CCR(比较值)时,输出为有效电平,否则为无效电平。递减计数模式则刚好相反。

(3)PWM2模式。递增计数时,当TIMx_CNT(计数值)  <  TIMx_CCR(比较值)时,输出为无效电平,否则为有效电平。递减计数模式则刚好相反。

(4)更多细节可参考相应芯片的参考手册。应为参考手册可搜索TIMx_CNT<TIMx_CCR1
找到相应内容。

 

7.2、PWM占空比和比较值

(1)占空比: 高电平保持的时间与该PWM的周期之比。

(2)STM32中输出的有效电平不一定是高电平,是可以设置的。

(3)PWM输出有效电平比举例:配置50%的有效输出,定时器计数周期9。比较值为5时,0、1、2、3、4输出有效电平。5、6、7、8、9输出有效电平的相反电平。

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

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

相关文章

Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

感想&#xff1a;由于看不懂官方代码的原因&#xff0c;自己这方面耽误了一段时间&#xff0c;一方面&#xff0c;在AI与经济学之间犹豫了许久&#xff0c;另一方面&#xff0c;工作 了半年&#xff0c;也没发工资&#xff0c;没空找培训代码的课程&#xff0c;所以停止更新了三…

Nginx-代理服务器详解

本文已收录于专栏 《中间件合集》 目录 概念说明Nginx代理 提供服务总结提升 概念说明 Nginx Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它具有很多非常优越的特性&#xff1a;在连接高并发的情况下&#xff0c;Nginx是Aoache服…

机器学习算法之决策树(decision tree)

1 决策树算法介绍 决策树(Decision Tree,又称为判定树)算法是机器学习中常见的一类算法&#xff0c;是一种以树结构形式表达的预测分析模型。决策树属于监督学习&#xff08;Supervised learning&#xff09;&#xff0c;根据处理数据类型的不同&#xff0c;决策树又为分类决策…

html 模板

模板王 - 10000免费网页模板&#xff0c;网站模板下载大全 (mobanwang.com)http://www.mobanwang.com/

C++ string中内置的字符串操作和标准库中常用字符处理函数

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

Qt之QDialog 自定义标题栏

简述 Qt自带标题栏功能还是很强大的&#xff0c;但是确实不能百分百满足需求&#xff0c;除了丑以外还不能随意更改标题栏字体&#xff0c;也不能更改样式&#xff1b;所以为了满足自己的虚荣心让标题栏变得更加好用看好看&#xff0c;特地花时间做了以下测试&#xff1b; 支持…

SpringBoot通过获取请求参数或者Headers上的特殊标识实现i18n国际化

实现效果 我们大部分都是把i18n的标识放在Headers上面&#xff1b;而把标识放在参数上的话比较少&#xff0c;放参数上的话一般是在使用a标签下载某些文件不好配置请求头的时候才使用上 配置在Headers上面&#xff1a; 配置在params上面&#xff1a; 配置代码&#xff1a; /**…

Django_类视图(五)

目录 类视图优点 使用方法 定义类视图 添加类视图路由 类视图原理 类视图的二次封装 类视图二次封装代码如下 编写视图 配置路由 访问url结果 源码等资料获取方法 类视图优点 使用django的函数视图&#xff0c;如果要让同一个视图实现不同的请求方式实现不同的逻辑…

Android Studio实现内容丰富的安卓社交论坛平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号085 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.视…

静态路由介绍

目录 静态路由配置方法&#xff08;基本配置&#xff09;&#xff1a; 静态路由的拓展配置 负载均衡 1.环回接口——测试 2.手工汇总——子网汇总 3.路由黑洞&#xff08;黑洞路由) 4.缺省路由 5.空接口——NULL 0 静态路由配置方法&#xff08;基本配置&#xff09;&#xff1…

【Linux】Linux下的项目自动化构建工具——make和makefile

❤️前言 大家好&#xff0c;好久不见&#xff01;今天小狮子为大家带来的文章是一篇关于Linux下的项目自动化构建工具——make和makefile的博客&#xff0c;希望能帮助到大家。 正文 当我们进行涉及多文件的工程开发时&#xff0c;我们需要对很多不同类型、不同功能&#xff…

如何查看论文被引用情况

Dimensions上汇聚了多种类型的学术成果&#xff08;期刊、图书、专利、临床试验&#xff09;&#xff0c;它好的地方在于可将论文与被引用情况、研究资金来源、相关临床试验、专利信息以及政策文件全部关联起来&#xff0c;从而对一项研究进行了从起源到结果的全方位描述。 网…

第九十九天学习记录:C++核心:类和对象Ⅴ(五星重要)友元运算符重载

友元 在程序里&#xff0c;有些私有属性也能让类外特殊的一些函数或者类进行访问&#xff0c;就需要用到友元的技术 友元的目的就是让一个函数或者类访问另一个类中私有成员 友元的关键字为frirend 友元的三种实现 1、全局函数做友元 #include<iostream> using namespa…

vue 使用百度地图记录

参考文档 https://lbsyun.baidu.com/index.php?titlejspopular3.0/guide/infowindow https://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html#a0b0 1.百度地图标注点点击出现infoWindow信息窗口添加点击事件 var opts {width: 200, // 信息窗口宽度height:…

【TS】学习笔记

1、所有的JavaScript代码都是有效的Typescript代码&#xff0c;用TypeScript编译器编译TypeScript里的Javascript代码&#xff0c;编译后的结果与原始的Javascript代码一模一样&#xff0c;即文件扩展名从.js改为.ts&#xff0c;不会造成任何负面的影响 2、JavaScript代码迁移…

idea将代码片段提取成一个方法快捷方式

CtrlAltM 今天写代码发现有的方法太长了&#xff0c;为了使我们的代码更加简洁&#xff0c;就可以使用idea的这个功能 效果如图 改造前&#xff1a; 提取出两个方法 如何使用

Bootloader Design of PIC18 series MCU - 进阶篇

1.遭遇到问题 在&#xff1a;PIC18 Bootloader 设计基础 一文中&#xff0c;我们讨论了Bootloader与上层应用APP各自编译的方法。在ROM上的空间分配、以及跳转、中断的处理等内容。那篇文章包含了所有与PIC单片机Bootloader设计相关的技术问题。但是距离一个真正可用的Bootloa…

python接口自动化(二十一)--unittest简介(详解)

简介 前边的随笔主要介绍的requests模块的有关知识个内容&#xff0c;接下来看一下python的单元测试框架unittest。熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和 TestNG&#xff0c;这个招聘的需求上也是经常见到的。python 里面也有单元 测试框架-unitt…

element table列表根据数据设置背景色

效果 页面代码 通过:cell-class-name动态绑定类名 <el-table :data"tableData" style"width: 100%" :cell-class-name"myclass"><el-table-column prop"date" label"日期" width"180"> </el-ta…

pytest测试框架的基本使用与介绍

pytest介绍 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 1、简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b; 2、支持参数化&#xff0c;可以细粒度地控制要测试的测试用例&#xff1b; 3、能够支持简单的单元测…