STM32 PWM输出

article/2025/10/5 11:07:19

STM32 PWM输出

工作过程:

在这里插入图片描述

  • 我们假定定时器工作在向上计数PWM 模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出1。那么就可以得到如上的PWM 示意图:

  • 当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT达到 ARR 值的时候,重新归零,然后重新向上计数,

  • 依次循环改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM输出的频率,这就是 PWM输出的原理

在这里插入图片描述

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:打开。

在这里插入图片描述
注:CNT<CCRX 则有效电平。高电平有效还是低电平有效取决于CCER的CC1P位 ,可以设置0,1 0:高电平有效 1:低电平有效

在这里插入图片描述

定时器:
捕获/比较模式寄存器(TIMx_CCMR1/2)
捕获/比较使能寄存器(TIMx_CCER)
捕获/比较寄存器(TIMx_CCR1~4)
刹车和死区寄存器(TIMx_BDTR)

STM32 定时器3输出通道引脚

在这里插入图片描述

1)开启 TIM1 时钟,配置 PA8 为复用输出。
库函数使能 TIM3 时钟的方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器 3 时钟

2)设置 TIM1 的 ARR 和 PSC。

这在库函数是通过 TIM_TimeBaseInit 函数实现的

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的

3)设置 TIM1_CH1 的 PWM 模式及通道方向, 使能 TIM1 的 CH1 输出。

在库函数中,PWM 通道设
置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这里我
们使用的是通道 1,所以使用的函数是 TIM_OC1Init()。
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

结构体TIM_OCInitTypeDef
的定义:

typedef struct
{uint16_t TIM_OCMode;    //是 PWM 模式uint16_t TIM_OutputState;  //设置比较输出使能,也就是使能 PWM 输出到端口。uint16_t TIM_OutputNState; */uint16_t TIM_Pulse; uint16_t TIM_OCPolarity;    //设置极性是高还是低uint16_t TIM_OCNPolarity; uint16_t TIM_OCIdleState; uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;

要实现我们上面提到的场景,方法是: TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化 TIM1 OC1

4)使能 TIM1。

TIM_Cmd(TIM1, ENABLE); //使能 TIM1

5)设置 MOE 输出,使能 PWM 输出

TIM_CtrlPWMOutputs(TIM1,ENABLE);// MOE 主输出使能

6)修改 TIM1_CCR1 来控制占空比。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)

步骤:

1.使能定时器3和相关IO口时钟。
使能定时器3时钟:RCC_APB1PeriphClockCmd();
使能GPIOB时钟:RCC_APB2PeriphClockCmd();
2. 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
3. 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
4. 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
5. 初始化输出比较参数:TIM_OC2Init();
6. 使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
7. 使能定时器。TIM_Cmd();
8. 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

在工程中添加了 pwm.c 文件,并且引入了头文件 pwm.h。打开 pwm.c 内容如下

#ifndef __PWM_H
#define __PWM_H
#include "sys.h"void TIM1_PWM_Init(u16 arr,u16 psc);#endif
#include "pwm.h"
#include "led.h"
//PWM 输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{ 
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// ①使能 tim1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); 
//①使能 GPIO 外设时钟使能//设置该引脚为复用输出功能,输出 TIM1 CH1 的 PWM 脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; 
//设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; 
//设置用来作为 TIMx 时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //脉宽调制模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //③初始化外设 TIMxTIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //④使能 TIM1
}
int main(void)
{
u16 led0pwmval=0; 
u8 dir=1;
delay_init(); //延时函数初始化 
LED_Init(); //初始化与 LED 连接的硬件接口
TIM1_PWM_Init(899,0);//不分频。PWM 频率=72000/(899+1)=80Khz while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1; 
TIM_SetCompare1(TIM1,led0pwmval); 
} 
}

现象: DS0 不停的由暗变到亮,然后又从亮变到
暗。每个过程持续时间大概为 3 秒钟左右


http://chatgpt.dhexx.cn/article/rwO9dFKR.shtml

相关文章

简单明了的说明STM32的PWM原理以及实现方法

申明以下都是个人理解&#xff0c;仅供参考。如果错误欢迎指教。本文不讲底层&#xff0c;根据实际使用来逆向讲解。 1.什么是pwm&#xff1f; pwm最简单的理解就是“功率”&#xff0c;调节PWM的占空比就是调节功率。 2.如何调节占空比&#xff1f; 图1 根据图1很容易看出…

CCRX寄存器

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);// TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形&#xff0c;条件是未使用预装载寄存器(OCxPE’0’&#xff0c;否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable 就是为了…

JavaScript权威指南 第13章 异步JavaScript

JavaScript权威指南 第13章 异步JavaScript 13章 异步JavaScript13.1 使用回调的异步编程13.1.1 定时器13.1.2 事件13.1.3 网络事件13.1.4 Node中的回调与事件 13.2 期约13.2.1 使用期约使用期约处理错误 13.2.2 期约链13.2.2 解决期约13.2.4 再谈期约和错误catch和finally方法…

javascript权威指南(第四版)

Java Script是一种功能强大的基于对象的脚本语言。Java Script程序可以直接嵌入HTML页面。与Web浏览器定义的文档对象模型(DOM)一起使用时&#xff0c;JavaScript可以创建动态HTML(DHTML)内容&#xff0c;允许用户与客户端的Web应用程序交互。 JavaScript语法以流行的程序设计语…

《JavaScript权威指南》学习笔记(一)

跟着《JavaScript权威指南》整理的一些知识点和自己的小拓展。有不足之处请指正。 1、try catch 防止程序异常直接报错退出&#xff0c;而是能对异常进行一些处理&#xff0c;具体处理就在catch中。最好是在最外层函数使用。 2、HTML不区分大小写、XHTML区分大小写、JavaScri…

《javascript权威指南》精读笔记-持续更新

《javascript权威指南》 作用域链 表达式 原始表达式 对象和数组的初始化表达式 函数定义表达式 函数直接量 属性访问表达式 调用表达式 对象创建表达式 运算符 表达式计算 var function for in with debugger use strict 对象 创建对象 属性的查询和设置 作为关联数组的对象 继…

JavaScript权威指南(第6版)

JavaScript权威指南&#xff08;第6版&#xff09; JavaScript权威指南 第6版&#xff08;影印版&#xff09;上册 Beginning iOS Programming, 2014年 Gradle for Android (2016年3月 Finished)

JavaScript权威指南 第11章JavaScript标准库

JavaScript权威指南 第11章JavaScript标准库 第11章 JavaScript标准库11.1 集合与映射11.1.1 Set类11.1.2 Map类11.1.3 WeakMap和WeakSet 11.2 定型数组与二进制数据11.2.1 定型数组的类型11.2.2 创建定型数组11.2.3 使用定型数组11.2.4 定型数组的方法与属性11.2.5 DateView与…

JavaScript 权威指南-学习笔记(一)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!JavaScript 权威指南-学习笔记 JavaScript是一门高级、动态、解释型变成语言,非常适合面向对象和函数式编…

JavaScript权威指南笔记-masaikk

JavaScript权威指南笔记-马赛柯柯 源代码位于masaikk/interviewAccess - Gitee.com 前五章笔记略 第六章 对象 防止某个对象被第三方库意外修改&#xff0c;建议使用Object.create()方法 ★ \bigstar ★ let o {foo: bar}; library.func(Object.create(o))解释Object.crea…

【JavaScript权威指南(第七版)】之阅读学习总结

写在前面 最近借着空闲时间断断续续两个月看完了《JavaScript权威指南(第七版)》&#xff0c;《JavaScript权威指南》一直以来被称为“犀牛书”&#xff0c;前面的第六版我大概略过一遍&#xff0c;由于书的厚度实在有点“厚重”&#xff0c;将近1000多页左右&#xff0c;有一些…

JavaScript权威指南(原书第7版) 犀牛书

第3章 语法结构 3.10.1 使用let和const声明 ES6后&#xff0c;变量通过let关键字声明 let i let sum可以使用一条let语句声明多个变量 let i, sum声明变量的同时&#xff0c;&#xff08;如果可能&#xff09;也为其赋予一个初始值 let message hello let i 0, j 1let …

JavaScript权威指南-总结

章2 词法结构 1.什么是字面量&#xff0c;标识符&#xff0c;保留字&#xff1f; 字面量即程序中的数据的值&#xff1b;标识符指数据的名字&#xff08;字母、下划线_或美元符号$开头&#xff0c;为了和数值区分开&#xff0c;标识符不能用数字开头&#xff0c;&#xff09;…

javascript 权威指南笔记

1.如果没有用var语句给一个变量指初始值&#xff0c;那么虽然这个变量被声明了&#xff0c;但是在给它存一个值之前&#xff0c;它的初始值就是 undefined 2.使用var语句多次声明一个变量不仅是合法的&#xff0c;而且也不会造成任何错误。如果重复的声明有一个初始值&#xf…

【WCF】使用WCF测试客户端

【是什么】 WCF测试客户端&#xff08;WCF Test Client&#xff09;是一个用来测试WCF服务程序的调试工具&#xff0c;能够使开发WCF服务更加方便。 【打开方法】 有四种打开方式 1、找到Vs的安装路径&#xff0c;找到Common7\IDE\WcfTestClient.exe&#xff0c;双击打开。如…

WCF 介绍(一)

前言&#xff1a;WCF是微软基于SOA&#xff08;Service Oriented Architecture&#xff09;推出的.Net平台下的框架产品&#xff0c;它代表了软件架构设计与开发的一种发展方向&#xff0c;在微软的战略计划中也占有非常重要的地位。了解和掌握WCF&#xff0c;对于程序员特别是…

C#中如何使用WCF

一、什么是WCF Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口&#xff0c;可以翻译为Windows通讯接口&#xff0c;它是.NET框架的一部分。由 .NET Framework 3.0 开始引入。 从我现在获得的知识&#xff0c;我理解的WCF重点是分布式&a…

WCF Debug 调试

关于WCF的调试&#xff0c;MSDN给出如下说明&#xff0c;可能是由于我的水平问题&#xff0c;个人无法完全看懂&#xff0c;所以自己总结了一点WCF的调试技巧。仅供参考。 如何开始调试 WCF 服务:  通常WCF可以部署成Windows service 和Web service。 1.对于WebService通常…

WebService,WCF,WebApi区别与特点

WebService,WCF,WebApi区别与特点 于 2019-06-10 10:11:00 发布7872 收藏 32 文章标签&#xff1a; c# 测试 操作系统 版权 在.NET平台下&#xff0c;有大量的技术让你创建一个HTTP服务&#xff0c;像Web Service&#xff0c;WCF&#xff0c;现在又出了Web API。在.NET平台…

WCF入门讲解

一、简单WCF服务TCP和HTTP传输协议 二、实例管理 1、实例管理-单调服务 介绍&#xff1a;单调服务的一个实例创建于每个方法调用之前&#xff0c;调用完成后会立即销毁该服务实例。 2、实例管理-会话 介绍&#xff1a;一个配置了私有会话的服务通常无法支持多达几十个&#x…