STM32如何使用PWM?

一:PWM介绍

PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简 称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应 用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺 服控制、调光、开关电源,甚至某些音频放大器,因此学习 PWM 具有十分重要的 现实意义。

二:PWM输出配置步骤

STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都可以产生 PWM 输出。

其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。

而通用定 时器也能同时产生多达 4 路的 PWM 输出,这些在定时器中断章节中已经介绍 过。

(1)使能定时器及端口时钟,并设置引脚复用器映射

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能 TIM3 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
最后还要记得将 PA7 管脚模式配置为复用推挽输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽输出

(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等

要使用定时器功能,必须对定时器内相关参数初始化,其库函数如下:voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseI nitStruct); 
这个在定时器中断章节就已经介绍// 第二步 初始化定时器参数包含自动重装值,分频系数,计数方式等
TIM_TimeBaseInitStruct.TIM_Period = per;                                                  // 自动从装载值设置
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;                     // 预分频该设置
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;         // 时钟分频 不分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;     //向上模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);

(3)初始化 PWM 输出参数,包含 PWM 模式、输出极性、使能等

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

主要用到的是 比较输出模式、 比较输出使能、 脉冲宽度、输出极性

(4)开启定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)第一个参数是用来选择定时器。 
第二个参数是用来使能或者失能定时器,也就是开启或者关闭定时器功能。同样可以选择 ENABLE 和 DISABLETIM_Cmd(TIM3,ENABLE); //开启定时

(5)修改 TIMx_CCRx 的值控制占空比

其实经过前面几个步骤的配置,PWM 已经开始输出了,
只是占空比和频率是 固定的,例如本章要实现呼吸灯效果,
那么就需要调节 TIM3 通道 2 的占空比, 
通过修改 TIM3_CCR2 值控制。调节占空比函数是:void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare1);

(6)使能 TIMx 在 CCRx 上的预装载寄存器

使能输出比较预装载库函数是: 
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx,uint16_tTIM_OCPreload); 
第一个参数用于选择定时器,
第二个参数用于选择使能还是失能输出比较预 装载寄存器,
可选择为 TIM_OCPreload_Enable、TIM_OCPreload_Disable

(7)使能 TIMx 在 ARR 上的预装载寄存器允许位

使能 TIMx 在 ARR 上的预装载寄存器允许位库函数是:
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalStateNewState); 第一个参数用于选择定时器,第二个参数用于选择使能还是失能。将以上几步全部配置好后,我们就可以控制通用定时器相应的通道输出 PWM 波形了,这里要特别提醒下,虽然高级定时器和通用定时器类似,但是高级定时 器要想输出 PWM 波形,必须要设置一个 MOE 位(TIMx_BDTR 的第 15 位),以使 能主输出,否则不会输出 PWM。高级定时器特殊函数 库函数设置的函数为: 
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalStateNewState);

三:案例 PWM波控制LED:

#include "pwm.h"void TIM3_CH2_PWM_Init(u16 per,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStruct;// 第1步:(1)使能定时器及端口时钟,并设置引脚复用器映射RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // GPIOA 使能// GPIOA 初始化设置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;  //选择你要设置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;         //复用的推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          //设置传输速率GPIO_Init(GPIOA,&GPIO_InitStructure);            /* 初始化GPIO */GPIO_SetBits(GPIOA,GPIO_Pin_7);  // 第2步:(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);// 第3步(3)初始化 PWM 输出参数,包含 PWM 模式、输出极性、使能等TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM1模式TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;  // 使能TIM_OC2Init(TIM3,&TIM_OCInitStruct);// 第5步 (5)修改 TIMx_CCRx 的值控制占空比// 等使用的时候调用 void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare1);// 第6步(6)使能 TIMx 在 CCRx 上的预装载寄存器TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);// 第7步(7)使能 TIMx 在 ARR 上的预装载寄存器允许位TIM_ARRPreloadConfig(TIM3,ENABLE);// 第4步(4)开启定时器TIM_Cmd(TIM3,ENABLE);}控制main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "pwm.h"int main()
{u8 i=0;u16 j = 0;u8 fx = 0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LED_Init();TIM3_CH2_PWM_Init(500,72-1);//频率是 2Khwhile(1){        if(fx==0){j++;if(j>=300)fx=1;}else{j--;if(j==0)fx=0;}                TIM_SetCompare2(TIM3,j);i++;if(i%10==0)LED0=!LED0;delay_ms(10);}
}

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

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

相关文章

Vue之Vue的介绍安装开发实例生命周期钩子

博主心得: keyup必须与change一起使用v-on.click可以直接写成clickclick“setVal”里的setVal换成数字之后有惊喜VS Code是真的狗,一些报错根本不会直接显示总结:VS code太狗了 1.vue介绍 1.1 什么是vue vue是一个构建用户界面UI的渐进式jav…

【配置环境】SQLite数据库安装和编译以及VS下C++访问SQLite数据库

一,环境 Windows 11 家庭中文版,64 位操作系统, 基于 x64 的处理器SQLite - 3.43.2Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.5.3 二,SQLite简介 简要介绍 SQLite(Structured Query Language for Lite&a…

Babel 在Powershell 上无法查看版本

ES6 模块语法不能应用在ES5环境中 (ES6模块化语法不能在node.js中执行),此时需要Babel进行转码 通过npm install -g babel-cli 安装好后,想通过 babel --version产看版本。但是无法查看 首先,我们要以管理员方式运行PowerShell,&…

密码学二: md5 网站服务器与用户通信过程 ca原理 签名原理 Flame 病毒原理

md5被破解? MD5(Message Digest Algorithm 5)是一个较早的哈希函数,但由于其弱点和漏洞,它已经被认为不再适合用于安全性要求较高的应用。MD5的一些安全性问题包括: 碰撞攻击: MD5已经被证明容易受到碰撞攻…

9-k8s-亲和力与反亲和力

文章目录 一、概念二、实操节点亲和力1三、实操pod亲和力2 一、概念 节点亲和力概念(反亲和力相反) ps:官方文档http://kubernetes.p2hp.com/docs/concepts/scheduling-eviction/assign-pod-node.html 节点亲和力(Node Affinity&a…

手撕Vue-数据驱动界面改变下

经过上一篇的介绍,已经实现了观察者模式的基本内容,接下来要完成的就是将上一篇的发布订阅模式运用到 Nue 中,实现数据驱动界面改变。 在监听数据变化的章节当中,根据指定的区域和数据去编译渲染界面 这个步骤处,我写了…

Docker逃逸---授权 SYS_ADMIN Capability逃逸原理浅析

目录 一、产生原因 二、利用条件 三、复现过程 1、容器内挂载宿主机cgroup 2、设置notify_no_release并寻找容器在宿主机上的存储路径 3、将恶意脚本写入release_agent 一、产生原因 给容器额外授权了SYS_ADMIN Cap,并且容器以root权限运行,攻击者…

数据结构----算法--五大基本算法

数据结构----算法–五大基本算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况,只考虑眼前的这一步,在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分治法:分而治之 将一个问题拆解成若干个解决方式…

计算机毕业设计--基于SSM+Vue的物流管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

基于寄生捕食优化的BP神经网络(分类应用) - 附代码

基于寄生捕食优化的BP神经网络(分类应用) - 附代码 文章目录 基于寄生捕食优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.寄生捕食优化BP神经网络3.1 BP神经网络参数设置3.2 寄生捕食算法应用 4.测试结果…

QT中使用QMediaPlayer + QVideoWidget播放视频

QT中使用QMediaPlayer QVideoWidget播放视频 项目中有要在qt中播放视频的要求,这里做下记录 CMakeLists.txt文件编写 主要修改如下两处 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets multimedia multimediawidgets) find_package(Qt${QT_VERSIO…

【JVM】JVM类加载机制

JVM类加载机制 加载双亲委派模型 验证准备解析初始化 JVM的类加载机制,就是把类,从硬盘加载到内存中 Java程序,最开始是一个Java文件,编译成.class文件,运行Java程序,JVM就会读取.class文件,把文件的内容,放到内存中,并且构造成.class类对象 加载 这里的加载是整个类加载的一…

RabbitMQ概述,死信队列

RabbitMQ(Rabbit Message Queue)是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP)并提供可靠的消息传递机制。RabbitMQ 在分布式系统中广泛用于消息传递和事件驱动的架构。以下是一些 RabbitMQ 的重要知识点…

阿里云2023年双十一优惠活动整理

随着双十一的临近,阿里云也为大家准备了一系列优惠活动。作为国内知名的云服务提供商,阿里云在双十一期间推出了多种优惠政策和福利,让用户在享受优质云服务的同时,也能节省一些费用。本文将对阿里云双十一优惠活动进行详细整理&a…

25.0 MySQL 数据库概述

1. 数据库介绍 1.1 简介 数据库是用于存储, 管理和组织数据的一种技术.使用数据库有以下几个重要的原因: * 1. 数据的持久化存储: 数据库可以将数据持久地保存在磁盘上, 确保数据在计算机系统关闭或发生故障时不会丢失.这样可以保证数据的安全性和可靠性.* 2. 数据共享和协作…

工程管理系统源码之全面+高效的工程项目管理软件

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…

软考高级系统架构设计师系列之:快速掌握软件工程核心知识点

软考高级系统架构设计师系列之:快速掌握软件工程核心知识点 一、软件开发方法二、软件开发模型三、软件开发模型-瀑布模型四、软件开发模型-经典模型汇总五、软件开发模型-增量模型与螺旋模型六、软件开发模型-V模型七、软件开发模型-构件组装模型八、软件开发模型-统一过程九…

【nginx】监听80端口不生效问题

技巧:查询当前nginx监听的端口号有哪些 sudo netstat -tulpn | grep nginx 我是学自这篇文章 Nginx在配置监听80端口不生效问题_nginx启动监听不到9090端口_乌鸦啊的博客-CSDN博客Nginx安装之后在/etc/nginx/nginx.conf配置文件引用其它文件的配置,如…

Flink kafka 数据汇不指定分区器导致的问题

背景 在flink中,我们经常使用kafka作为flink的数据汇,也就是目标数据的存储地,然而当我们使用FlinkKafkaProducer作为数据汇连接器时,我们需要注意一些注意事项,本文就来记录一下 使用kafka数据汇连接器 首先我们看…

PHP和JAVA AES加解密问题

1.问题 php加密的java不能正常机密&#xff0c;java加密的php不能正常解密 2.前置参数 key 32位 iv 16位 3.问题解决 因为key是32位的&#xff0c;所以参数需要$methodAES-256-CBC,$options1 4.PHP代码 <?php /**** Created by PhpStorm* User: Noah* Date: 2023/10/10*…