STM32如何使用PWM?

news2024/11/25 10:42:03

一: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 和 DISABLE
 
 TIM_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);//频率是 2Kh
        
        while(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.coloradmin.cn/o/1097689.html

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

相关文章

橙河网络:国外答题问卷赚钱可靠吗?

大家好,我是橙河网络,今天聊一聊国外答题问卷赚钱可靠吗?这几年,很多人都了解到海外问卷调查这个项目,这是一个类似网络搬砖的项目,可以自己做,现实中也有很多老板选择组建工作室运营这个项目。…

看了B站上的这些课程,我飘了!

众所周知,B 站是一个神奇的网站,上面有各种各样的视频资源,可以说是包罗万象、应有尽有。很多人在上面跟着 UP 主上自习、学编程、考研,还真的能学有所成。 最近,很多小伙伴后台私信知了姐,想要一些开发、网…

软信天成:今天的企业比以往任何时候都更需要「数据编目」

在当今的组织中,数据是多样的,分布在许多不同的部门、应用系统、数据仓库和数据湖(一些在内部,其他在云中),因此,准确地知道您拥有哪些数据和它们在哪里是一个挑战。此外,另外一个挑…

Linux系统中如何开启和配置OpenGauss数据库的远程连接

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合…

基于变电站自动化系统中的安全措施分析及应用

摘要:阐述变电运行中的问题,电气自动化系统与安全运行措施,包括自动控制设备的投入,电气自动 化与计算机技术相、设备数据的采集与处理、自动化系统的升级、人工智能技术的应用。 关键词:自动控制;数据采…

浅谈安科瑞多回路仪表在德国数据中心的应用

摘要:数据中心是一个聚集了大量服务器、存储设备、网络设备及配套UPS、空调等设备的IT设备场所,是实现数据信息的集中处理、存储、传输、交换和集中管理等业务的服务平台。 数据中心供电电源质量的好坏直接影响到IT设备的安全运行,因此对数据…

SQ4840EY-T1_GE3具有低导通电阻和低电压降 汽车级 N沟道功率MOSFET

SQ4840EY-T1_GE3是一款高性能的车规级电子IC芯片,它具有多种功能和特点,适用于各种电子设备和应用领域。采用了先进的工艺技术,具有高性能和稳定的特点。它采用了先进的封装技术,能够在广泛的温度范围内正常工作,适应各…

Jmeter接口自动化测试 —— Jmeter下载安装及入门

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 下载 下载地址:Apache JMeter - Download Apache JMeter 安装 由于Jmeter是基于Java的…

146.LRU缓存

双向链表哈希表 class LRUCache { public://1、定义双向链表结构、容量、哈希表等LRU数据成员struct Node{int key,value;Node *left,*right;Node(int _key,int _value):key(_key),value(_value),left(NULL),right(NULL){}}*L,*R;int n;unordered_map<int,Node*> ump;//…

基于Debian12打造的LMDE 6 “Faye” 正式发布

导读LMDE 6 已正式发布&#xff0c;代号 "Faye"&#xff1b;新版本基于 Debian 12 Bookworm。 LMDE 6 已正式发布&#xff0c;代号 "Faye"&#xff1b;新版本基于 Debian 12 Bookworm。 LMDE 是 "Linux Mint Debian Edition" 的缩写&#xff0c…

进来“抄作业”!示例代码、操作手册,尽在华为云Codelabs!

1 Codelabs 简介 1.1 什么是 Codelabs&#xff1f; Codelabs 是华为云开发者工具&#xff0c;提供互动式的&#xff0c;以实践为主的教程&#xff0c;这些教程旨在指导开发者通过实际操作来学习新的编程技能、工具、框架。华为云 Codelabs 提供丰富的华为云产品代码示例/操…

2023年中国半导体检测仪器设备销售收入、产值及市场规模分析[图]

半导体测试设备是一种用于电子与通信技术领域的电子测量仪器。随着技术发展&#xff0c;半导体芯片晶体管密度越来越高&#xff0c;相关产品复杂度及集成度呈现指数级增长&#xff0c;这对于芯片设计及开发而言是前所未有的挑战&#xff0c;随着芯片开发周期的缩短&#xff0c;…

使用解构赋值简化axios返回对象属性元素的提取

axios返回的response通常都会进行一层封装&#xff0c;把响应的数据封装到了data这个对象&#xff0c;所以提取数据起来不太方便&#xff0c;往往需要res.data.xxx这样获取里面的数据&#xff0c; 具体可以参考下面的数据结构&#xff1a; 假如data的数据是下面的结构&#xf…

一个项目多个工程实现方法

一个项目中&#xff0c;往往会有多个工程&#xff0c;以便管理不同的代码。通常情况是面向不同客户或者debug调试才需要这样使用。 下面笔者通过一个简单的demo来说明一下使用方法 步骤&#xff1a; 1.增加工程&#xff0c;分别命名为&#xff1a; Client_A&#xff0c;Clien…

数据结构题型18-哈夫曼树和哈夫曼编码

文章目录 1 哈夫曼树定义2 哈夫曼树构造3 哈夫曼编码4 并查集 1 哈夫曼树定义 2 哈夫曼树构造 3 哈夫曼编码 4 并查集 暂不做补充。

Spring framework Day16:@PropertySource注解使用

前言 在开发应用程序过程中&#xff0c;经常需要使用外部的属性文件来配置应用程序的行为。Spring框架提供了PropertySource注解&#xff0c;它可以方便地加载外部的属性文件&#xff0c;并将其中定义的属性值注入到Spring配置中。使用PropertySource注解&#xff0c;我们可以…

华为OD机试【优选核酸检测点】【2022.11 Q4 新题】

图片出自&#xff1a;华为机试真题 Java 实现【优选核酸检测点】【2022.11 Q4 新题】_寻找核酸检测点java_MISAYAONE的博客-CSDN博客 首先这是一道很恶心的题目。题目信息量大&#xff0c;逻辑分支多&#xff0c;还有各种细节上的坑。 本着死磕精神&#xff0c;耗时2h&#xf…

港联证券:四上市险企 前三季保费近1.8万亿

近日&#xff0c;跟着今年前9个月保费数据相继发表&#xff0c;各上市险企前三季度成果表现也得以一窥终究。数据闪现&#xff0c;我国人寿、我国人保、我国安全、众安在线4家上市险企共完结原保险保费收入&#xff08;下同&#xff09;1.78万亿元&#xff0c;同比添加6.09%。 …

预约按摩app软件开发定制足浴SPA上们服务小程序

同城按摩小程序是一种基于地理位置服务的小程序&#xff0c;它可以帮助用户快速找到附近的按摩师&#xff0c;并提供在线预约、评价、支付等功能。用户可以通过手机或者其他移动设备访问同城按摩小程序&#xff0c;实现足不出户就能预约到专业的按摩服务。 一、同城按摩小程序的…

2023年中国无创呼吸机产销量、竞争现状及行业市场规模分析[图]

医用呼吸机也被称之为机械通气&#xff0c;又能细分为无创机械通气&#xff08;NIV&#xff09;和有创机械通气&#xff08;IMV&#xff09;两种&#xff0c;即无创呼吸机和有创呼吸机。无创呼吸机又称气道正压通气呼吸机&#xff0c;它是一种以非创伤方式通过口鼻为使用者提供…