【STM32】PWM

news/2024/9/24 15:20:59/
一、 PWM 概述
  1. 定义
    PWM(Pulse Width Modulation), 脉冲宽度调制。
    脉冲: 方波, 频率(freq)
    宽度: 高电平的宽度, 占空比(duty)

​ 详细波形如下图。

在这里插入图片描述

  1. 用途
    控制灯光的亮度(手机/平板/显示器背光灯)
    电机的转速

  2. 灯光的控制细节
    频率要大于 25Hz, 灯光的亮度的变化是跟着占空比而变化, 占空比越大, 灯光越暗; 占空比越小, 灯光越亮。

  3. STM32工作过程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

​ CCMR1: OC1M[2:0]位:

​ 对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

​ CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

​ CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

PWM模式1 & PWM模式2

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

自动重载的预装载寄存器

在这里插入图片描述

在这里插入图片描述

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

STM32 定时器14输出通道引脚

在这里插入图片描述

PWM输出库函数

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{uint16_t TIM_OCMode;  //PWM模式1或者模式2uint16_t TIM_OutputState; //输出使能 OR失能uint16_t TIM_OutputNState;uint16_t TIM_Pulse; //比较值,写CCRxuint16_t TIM_OCPolarity; //比较输出极性uint16_t TIM_OCNPolarity; uint16_t TIM_OCIdleState;  uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

设置比较函数:

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);

使能输出比较预装载:

void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

u使能自动重装载的预装载寄存器允许位:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

PWM输出配置步骤:

①使能定时器14和相关IO口时钟.

​ 使能定时器14时钟:RCC_APB1PeriphClockCmd();

​ 使能GPIOF时钟:RCC_AHB1PeriphClockCmd ();

初始化IO口为复用功能输出。函数:GPIO_Init();

​ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能

③ GPIOF9复用映射到定时器14

​ GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);

初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

初始化输出比较参数:TIM_OC1Init();

使能预装载寄存器:TIM_OC1PreloadConfig(TIM14, **TIM_OCPreload_Enable);

⑦使能自动重装载的预装载寄存器允许位TIM_ARRPreloadConfig(TIM14,ENABLE);

⑧使能定时器.

⑨不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();

二. 程序设计
  1. 原理图

在这里插入图片描述

​ 不同的定时器, 输出通道的数目都有所不一样。 在高级定时器输出多路的 PWM,
​ 比可以是不一样的, 能够由 TIM_SetComparex[1-3]来进行设置不同的通道占空比!

  1. 配置频率

    /* TIM14 clock enable , 定时器 14 时钟使能*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
    /* Time base configuration , 定时器基本配置, TIM_Period 是计数值*/
    TIM_TimeBaseStructure.TIM_Period = (10000/100)-1; //输出频率为 100Hz,(10000/100) -1 得到的结果就是计数值。
    TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频, 也称之为二次分频,当前是 1 分频, 说白了不分频,
    不降低频率
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数的方法
    TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //初始化
    
  2. 配置PWM输出功能

在这里插入图片描述

在这里插入图片描述

/* PWM1 Mode configuration: Channel1 , 让 PWM 的通道 1 工作在模式 1*/
//PWM 模式 1, 在递增模式下, 只要 TIMx_CNT < TIMx_CCR1, 通道 1 便为有效状态(高电平), 否则为无效状态(低电平)。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //允许输出
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效的时候, 输出高电平
TIM_OC1Init(TIM14, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //自动重载初值, 不断输出 PWM 脉冲
TIM_ARRPreloadConfig(TIM14, ENABLE); //自动重载初值使能
/* TIM14 enable counter, 使能定时器 14 工作 */
TIM_Cmd(TIM14, ENABLE);

demo:

#include "beep.h"
#include "sys.h"
#include "delay.h"// LED pwm定时器设置
void init_TIM14()
{// 定义GPIO外设GPIO_InitTypeDef  GPIO_InitStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;// 使能定时器14系统时钟源// APB1 :42M// TIM3 : 42*2 = 84M == 1s	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);// 配置定时时间 10msTIM_TimeBaseStructure.TIM_Period = 100-1; // 重装载寄存器TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; // 分频系数TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟二次分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);/* PWM1 Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // pwm1模式,CNT < CCR,输出有效电平TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能TIM_OCInitStructure.TIM_Pulse = 0; // CCR初始值,通过改变CCR设置占空比TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 有效电平为高电平TIM_OC1Init(TIM14, &TIM_OCInitStructure);// 自动重装载器使能TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);/* TIM14 enable counter */TIM_Cmd(TIM14, ENABLE);// 初始化LED PF9// 使能F组管脚工作RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无拉电阻GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;// 初始化GPIOGPIO_Init(GPIOF, &GPIO_InitStructure);// 将PF9和定时器进行绑定GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);}int main()
{	uint32_t pwm_cmp;init_TIM14();while(1){// 设置占空比,pwm_cmp小于ARR(重装载寄存器)值for(pwm_cmp = 0; pwm_cmp < 100; pwm_cmp++){TIM_SetCompare1(TIM14, pwm_cmp);delay_ms(20);}for(pwm_cmp = 100; pwm_cmp > 0; pwm_cmp--){TIM_SetCompare1(TIM14, pwm_cmp);delay_ms(20);}}
}

http://www.ppmy.cn/news/1529864.html

相关文章

力扣 LCR 020 回文子串 -Python

题目链接&#xff1a;LCR 020. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个字符串 s &#xff0c;请计算这个字符串中有多少个回文子字符串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视…

常见框架漏洞复现

1、Thinkphp5x远程命令执行及getshell 1、环境配置 靶场:vulhub/thinkphp/5-rce docker-compose up -d 2、漏洞利用 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&#xff0c;通过覆盖类的核心属性filter导致rce&#xff0c;其攻击点较为…

828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问

一、Flexus云服务器X实例简介 1.1 概述 华为云Flexus X实例是华为云推出的一款创新云服务器产品&#xff0c;它主要面向中小企业和开发者&#xff0c;旨在解决传统云服务中的痛点&#xff0c;提供更加灵活、高效的云服务体验。 华为深刻洞察了中小企业和开发者在云服务应用中遇…

3d可视化图片:通过原图和深度图实现

1、depthy 在线体验demo: https://depthy.stamina.pl/#/ 也可以docker安装上面服务: docker run --rm -t -i -p 9000:9000 ndahlquist/depthy http://localhost:90001)首先传原图 2)再传对应深度图 3)效果 </ifra

【系统架构设计师】专题:软件架构风格(详细知识点及历年真题)

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 1、软件架构风格概述2、数据流风格3、调用/返回风格4、仓库风格5、虚拟机风格6、独立构件风格7、闭环控制架构8、C2架构风格9、层次结构风格10、富互联网应用(RIA)11、面向服务的架构(SOA)1、软件架构风格概述 软…

vue复制信息到粘贴框

npm install vue-clipboard2main.js文件引入 import VueClipboard from vue-clipboard2 Vue.use(VueClipboard)页面应用 copyInfo(info){let that thislet copyData 项目名称&#xff1a;${info.projectName}\n 用户名&#xff1a;${info.username}\n 初始密码&#xff1a;${…

探索MemGPT:AI界的新宠儿

文章目录 探索MemGPT&#xff1a;AI界的新宠儿1. 背景介绍2. MemGPT是什么&#xff1f;3. 如何安装MemGPT&#xff1f;4. 简单的库函数使用方法5. 场景应用场景一&#xff1a;创建持久聊天机器人场景二&#xff1a;文档分析场景三&#xff1a;多会话聊天互动 6. 常见Bug及解决方…

Vue 内存泄漏分析:如何避免开发过程中导致的内存泄漏问题

一. 引言 Vue 作为一款流行的前端框架&#xff0c;已经在许多项目中得到广泛应用。然而&#xff0c;随着我们在 Vue 中构建更大规模的应用程序&#xff0c;我们可能会遇到一个严重的问题&#xff0c;那就是内存泄漏。内存泄漏是指应用程序在使用内存资源时未正确释放&#xff…