STM32单片机输出频率及占空比可调的PWM波

一、测试用环境

STM32F103C8T6,HAL库。
只考虑PWM的频率和占空比两个参数,死区、极性、对齐方式等不做讨论。

二、STM32Cube MX配置

1.PWM原理

在这里插入图片描述
上图中,定时器向上计数,当CNT<CCRx时,输出0,当CNT>CCRx时输出1,当CNT达到ARR值的时候,重新归零,再次向上计数,如此循环。改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的的频率。计算频率和占空比的公式如下:

f p w m = f_{pwm}= fpwm= f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) f_{TIM} \over (PSC+1)*(ARR+1) (PSC+1)(ARR+1)fTIM

D u t y C y c l e DutyCycle DutyCycle = C C R A R R CCR\over ARR ARRCCR *100%
由以上两公式可知,时钟频率确定后,频率与分频系数PSC和自动重装载值ARR都有关系,占空比是CCR和ARR的比值;

2.CubeMX配置

以通用定时器TIM3的通道1为例,时钟为72MHz,主要配置如下图,因为频率和占空比我们需要可改变,在程序运行过程中需要修改参数,所以在CubeMX里,这些参数可以不配置;为了方便,我们配置PSC为72-1,这样当ARR从0~65535变化时,可以得到约15Hz-1MHz的频率,如果想要其他频率,则可以修改PSC的值。
在这里插入图片描述

三、主要代码

生成代码以后,在stm32f1xx_hal_tim.h头文件中,有开启或停止PWM的函数:

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

因为我们使用的是TIM3、通道1,因此可通过如下代码开启PWM功能:

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

同样,停止PWM功能代码如下:

HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);

接下来,需要写一个修改PWM频率及占空比的函数,在stm32f1xx_hal_tim.h头文件中

#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \do{                                                    \(__HANDLE__)->Instance->ARR = (__AUTORELOAD__);  \(__HANDLE__)->Init.Period = (__AUTORELOAD__);    \} while(0)

用来设置ARR的的值,而__HAL_TIM_SET_AUTORELOAD在stm32_hal_legacy.h中又有如下宏定义:

#define __HAL_TIM_SetAutoreload         __HAL_TIM_SET_AUTORELOAD

同样,设置CCR的功能定义如下:

#define __HAL_TIM_SetCompare            __HAL_TIM_SET_COMPARE

利用这两个宏我们可以写出配置频率和占空比的函数:

/******************************************************************************** 函数名:PWM_Config* 功  能:PWM配置,设置频率和占空比* 参  数:Freq频率,HzDuty占空比,*100* 返回值:无* 说  明:TIM3,Channel1;时钟72MHz,PSC=72-1,f=72M/((PSC+1)*(ARR+1)),PSC不变;Duty=ccr/arr*100%; 取值0~100,所以计算ccr要除以100         
*******************************************************************************/
void PWM_Config(uint32_t Freq, uint8_t Duty)
{uint32_t arr = 1000000 / Freq - 1;uint32_t ccr = (uint32_t)Duty * arr / 100;__HAL_TIM_SetAutoreload(&htim3, arr);__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, ccr);    
}

四、试验验证

频率1KHz、占空比70%

PWM_Config(1000, 70);

在这里插入图片描述
从逻辑分析仪捕捉的波形图可看出,一个完整周期时间为1ms,即频率为1KHz,其中高电平为700us,即占空比为70%;
将配置改为2500Hz,占空比为35%,

PWM_Config(2500, 35);

在这里插入图片描述
上图可看出,周期为400us,即频率2500Hz,高电平宽度的140us,即占空比为35%;

五、总结

1.使用定时器的PWM输出模式,同一个定时器的不同通道输出的PWM频率必须相同,如果想要同时输出不同频率的PWM,则需要使用不同的定时器,或者使用同一个定时器的输出比较模式。
2.PWM模式下,同一个定时器的不同通道,输出的PWM占空比可以不一样。

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

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

相关文章

linux下的strerror和perror处理错误函数

strerror和perror是C语言中用于处理错误信息的函数。 strerror函数&#xff1a; strerror函数用于将错误码转换为对应的错误消息字符串。它接受一个整数参数&#xff0c;通常是由系统调用或库函数返回的错误码&#xff0c;然后返回一个描述该错误的字符串。 函数原型&#xff1…

PrimDiffusion:3D 人类生成的体积基元扩散模型NeurIPS 2023

NeurIPS2023 &#xff0c;这是一种用于 3D 人体生成的体积基元扩散模型&#xff0c;可通过离体拓扑实现明确的姿势、视图和形状控制。 PrimDiffusion 对一组紧凑地代表 3D 人体的基元执行扩散和去噪过程。这种生成建模可以实现明确的姿势、视图和形状控制&#xff0c;并能够在…

化学方程式小程序

brief introduction 相信大家上中学时都会被化学方程式折腾得死去活来&#xff0c;尤其是配平&#xff0c;怎么也算不对数字。于是我写出了这款近200行的自动配平程序&#xff0c;这是不是你们黑暗化学中的一丝光亮呢&#xff1f; usage 正常化学式输入&#xff0c;每一种物…

D33|动态规划!启程!

1.动态规划五部曲&#xff1a; 1&#xff09;确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2&#xff09;确定递推公式 3&#xff09;dp数组如何初始化 4&#xff09;确定遍历顺序 5&#xff09;举例推导dp数组 2.动态规划应该如何debug 找问题的最好方式就是把…

软件测试面试八股文(答案解析+视频教程)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xf…

Yoast SEO Premium v21.7 Premium WordPress 插件Yoast +子插件介绍

什么是Yoast SEO&#xff1f; Yoast SEO 是 WordPress 的 SEO 插件&#xff0c;可帮助网站所有者针对搜索引擎优化他们的网站。该插件由 Joost de Valk 于 2008 年创建&#xff0c;旨在让每个人都能访问 SEO。今天&#xff0c;Yoast SEO 是全球数百万 WordPress 用户使用的最受…

如何对比云渲染平台优劣?到底哪一家好一些?

云渲染作为共享经济的一种体现&#xff0c;在强大计算资源共享的趋势下对个人用户和渲染团队的作品制作提供了巨大的便利。云渲染服务让CG艺术家无需自己投资昂贵的硬件设备&#xff0c;而可以通过网络提交渲染任务到云平台并利用其强大的共享计算资源&#xff0c;不但有效节约…

利用腾讯微搭平台连接MYSQL

首先&#xff0c;找到控制台 然后再控制台搜索&#xff1a;微搭 然后点击进入&#xff1a; 这里如果是第一次进入&#xff0c;他应该会提示要创建环境。 然后按照这个步骤&#xff1a; 然后进入这个页面&#xff0c;点击编辑器&#xff1a; 然后在这里搜索表格&#xff1a; 点…

springboot应用,cpu高、内存高问题排查

前几天&#xff0c;排查了2个生产问题。一个cpu高&#xff0c;一个内存高。今天把解决过程整理一下 文章目录 1、cpu高问题排查1.1、获取栈日志1.2、分析栈日志 2、内存高问题排查2.1、dump日志分析2.2、堆内存使用情况2.3、解决方案2.4、arthas trace解决问题2.5、总结 1、cp…

DIY电脑装机机箱风扇安装方法

作为第一次自己diy一台电脑主机的我&#xff0c;在经历了众多的坑中今天来说一下如何安装机箱风扇的问题 一、风扇的数量 1、i3 xx50显卡 就用一个cpu散热风扇即可 2、i5 xx60 一个cpu散热风扇 一个风扇即可 3、i7 xx70 一个cpu散热 4个风扇即可 4、i9 xx80 就需要7个以…

初识SpringSecurity

目录 前言 特点 快速开始 导入依赖 运行项目 访问服务 权限控制 实现UserDetails接口 添加SecurityConfig配置类 测试接口DemoController 设置权限控制authorizeHttpRequests 结果分析 总结 前言 Spring Security是一个强大且高度可定制的身份验证和访问控制框架…

XXE利用的工作原理,利用方法及防御的案例讲解

XXE&#xff08;XML外部实体注入&#xff09;利用是一种网络安全攻击手段&#xff0c;其中攻击者利用XML解析器处理外部实体的方式中的漏洞。这种攻击主要针对的是那些使用XML来处理数据的应用程序&#xff0c;尤其是当这些应用程序没有正确限制外部实体的处理时。通过XXE利用&…

【后端卷前端3】

侦听器 监听的数据是 data()中的动态数据~响应式数据 <template><div><p>{{showHello}}</p><button click"updateHello">修改数据</button></div> </template><script>export default {name: "goodsTe…

使用Python实现对word的批量操作

Python在平时写写小工具真是方便快捷&#xff0c;Pyhon大法好。以下所有代码都是找了好多网上的大佬分享的代码按照自己的需求改的。 调用的库为Python-docx、win32com、PyPDF2、xlwings&#xff08;操作excel&#xff09;。 因为公司的任务要对上千个word文件进行批量操作&a…

威联通硬盘休眠后修改系统定时任务

按照网上一些教程&#xff0c;成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒&#xff0c;怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录&#xff0c;判断出一些引发硬盘唤醒的自动任务&#xff0c;将这些定时任…

mediapipe 的姿态检测遇到的问题

简介&#xff1a; 最近在用mediapipe 进行人体姿态检测&#xff0c;当我初始化pose&#xff08;姿态检测对象&#xff09;时出现了错误&#xff1a;报错如下&#xff1a; Downloading model to D:\Anaconda\envs\taiji\lib\site-packages\mediapipe/modules/pose_landmark/pos…

Hdfs java API

1.在主机上启动hadoop sbin/start-all.sh 这里有一个小窍门&#xff0c;可以在本机上打开8088端口查看三台机器的连接状态&#xff0c;以及可以打开50070端口&#xff0c;查看hdfs文件状况。以我的主虚拟机为例&#xff0c;ip地址为192.168.198.200&#xff0c;所以可以采用下…

DS八大排序之冒泡排序和快速排序

前言 前两期我们已经对"插入排序"&#xff08;直接插入排序和希尔排序&#xff09; 和 "选择排序"&#xff08;直接选择排序和堆排序&#xff09;进行了详细的介绍~&#xff01;这一期我们再来详细介绍一组排序 &#xff1a;"交换排序"即耳熟能…

TCPIP介绍

可见 TCP/IP 被分为 4 层&#xff0c;每层承担的任务不一样&#xff0c;各层的协议的工作方式也不一样&#xff0c;每层封装上层数据的方式也不一样&#xff1a; 应用层&#xff1a;应用程序通过这一层访问网络&#xff0c;常见 FTP、HTTP、DNS 和 TELNET 协议&#xff1b; 传输…

如何集成和使用Feign的远程调用

feign的简单介绍 Feign是一个声明式的http客户端&#xff0c;可以帮助我们优雅的实现http请求的发送 OpenFeign/feign: Feign makes writing java http clients easier (github.com)Spring Cloud OpenFeign 中文文档 (springdoc.cn)Spring Cloud OpenFeign在spring cloud的基础…