首页 > 其他分享 >STM32——PWM

STM32——PWM

时间:2024-11-03 23:18:47浏览次数:5  
标签:定时器 Struct Tim OC STM32 TIM PWM

目录

1、PWM

2、芯片手册

通用定时器(TIM1/TIM8)

高级定时器(TIMx)

3、如何配置生成一个PWM波形

4、示例

5、如何配置出来的

5.1、RCC

 5.2、时基单元

5.3、PWM输出

5.4、具体配置


1、PWM

  • PWM信号:PWM信号通过改变高电平和低电平的持续时间比(占空比)来调节输出功率。
  • 定时器:STM32的PWM功能是通过定时器模块实现的。每个定时器都有多个通道,可以生成多个PWM信号。

2、芯片手册

在芯片手册中我们并不能直接找到PWM;因为PWM实际上,是由定时器实现的;所以我们要找到PWM需要在TIM章节中去找到他

但是我们可以看见,定时器又有两个章节高级定时器和通用定时器;怎么选择呢:

通用定时器(TIM1/TIM8)

  • 功能:通用定时器适用于大多数PWM应用,支持基本的PWM模式(如PWM1、PWM2)。
  • 应用:常用于简单的PWM控制,例如调光LED、电机控制等。
  • 优点:配置简单、易于使用。

高级定时器(TIMx)

  • 功能:高级定时器具有更多的功能,如死区时间生成、刹车输入等,适合复杂的应用。
  • 应用:常用于电机控制、逆变器、伺服控制等需要精确控制和保护的场合。
  • 优点:提供更高级的特性,适合高性能和高可靠性的应用。

3、如何配置生成一个PWM波形

说起来很简单:

  • GPIO配置
    • 使能GPIOA的时钟,配置PA5为复用模式,选择TIM2的通道1作为输出引脚。
  • 定时器配置
    • 使能TIM2的时钟。
    • 配置预分频器(PSC)和自动重载值(ARR),确定PWM频率。
    • 配置比较寄存器(CCR1),设置占空比。
    • 设置PWM模式,并使能输出。
  • 启动定时器
    • 启动定时器以生成PWM信号。

4、示例

PWM.h

#ifndef _PWM_H_
#define _PWM_H_

//引脚,定时器
#define PWM_PING					GPIO_Pin_1
#define PWM_PING_PORT			GPIOB
#define PWM_TIM						TIM3
#define PWM_TIM_FUN_INIT	TIM_OC4Init
#define PWM_TIM_FUN_SETCCR	TIM_SetCompare4

//时钟
#define RCC_TIM_PORT			RCC_APB1Periph_TIM3
#define RCC_GPIO_PORT			RCC_APB2Periph_GPIOB

void Pwm_Init(void);
void Pwm_SetARR(int ARR);//修改频率
void Pwm_SetCCR(int CCR);//修改占空比

#endif

PWM.c

#include "stm32f10x.h"
#include "pwm.h"

void Pwm_Init(void)
{
	//打开时钟
	RCC_APB1PeriphClockCmd(RCC_TIM_PORT,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_GPIO_PORT,ENABLE);
	
	GPIO_InitTypeDef GPIOB_Struct;
	GPIOB_Struct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIOB_Struct.GPIO_Pin = PWM_PING;
	GPIOB_Struct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(PWM_PING_PORT,&GPIOB_Struct);
	
	
	TIM_TimeBaseInitTypeDef Tim_Struct;
	//Tim_Struct.TIM_ClockDivision时钟分割,输入捕获滤波器的频率
	Tim_Struct.TIM_CounterMode = TIM_CounterMode_Up;
	Tim_Struct.TIM_Period = 0;//自动装载ARR
	Tim_Struct.TIM_Prescaler = 71;//PSC预分频系数
	//Tim_Struct.TIM_RepetitionCounter高级定时器才有的
	TIM_TimeBaseInit(PWM_TIM,&Tim_Struct);
	
	//设置输出比较模式
	TIM_OCInitTypeDef Tim_OC_Struct;
	//Tim_OC_Struct.TIM_OCIdleState
	Tim_OC_Struct.TIM_OCMode = TIM_OCMode_PWM1;
	//Tim_OC_Struct.TIM_OCNIdleState
	//Tim_OC_Struct.TIM_OCNPolarity
	Tim_OC_Struct.TIM_OCPolarity = TIM_OCPolarity_High;
	//Tim_OC_Struct.TIM_OutputNState
	Tim_OC_Struct.TIM_OutputState = TIM_OutputState_Enable;
	Tim_OC_Struct.TIM_Pulse = 0;//比较值
	PWM_TIM_FUN_INIT(PWM_TIM,&Tim_OC_Struct);
	
	//定时器使能
	TIM_Cmd(PWM_TIM,ENABLE);
}

void Pwm_SetARR(int ARR)//修改频率
{
	TIM_SetAutoreload(PWM_TIM,(uint16_t)ARR);
}

void Pwm_SetCCR(int CCR)//修改占空比
{
	PWM_TIM_FUN_SETCCR(PWM_TIM,(uint16_t)CCR);
}

如果只是需要一个配置好的PWM的同学;copy走就可以了 ;修改一下头文件的宏,改成自己需要的引脚就可以直接运行了

5、如何配置出来的

首先我们使用的是TIM3通用定时器

请看图

 TIM3;输出控制;首先看见最上面的RCC时钟;之后到了触发器;之后是PSC;之后计数器比较之后就是输出控制了;ok咱们一步一步来

5.1、RCC

首先先看芯片手册;PWM频率的PSC不就是预分频出来的吗??那么分的频率又是多少呢??

咱们来到RCC的结构图

 首先请看芯片手册原话

定时器时钟频率分配由硬件按以下2种情况自动设置:

1. 如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。

2. 否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。

 那怎么理解呢??难道所有的定时器都是APB1总线下面吗??不不不;他仅仅告诉我们定时器的频率与APB2的预分频系数有关;APB2的预分频系数默认为1;所有TIM的时钟频率默认72Mhz;那么这个时钟是在APB1下面还是APB2下面呢??

 请看图:我们可以看见TIM2-TIM7通用定时器实在APB1下面的;所以开启定时器的时钟仅仅需要调用函数

RCC_APB1PeriphClockCmd(RCC_TIM_PORT,ENABLE);

 5.2、时基单元

首先上代码

	TIM_TimeBaseInitTypeDef Tim_Struct;
	//Tim_Struct.TIM_ClockDivision时钟分割,输入捕获滤波器的频率
	Tim_Struct.TIM_CounterMode = TIM_CounterMode_Up;
	Tim_Struct.TIM_Period = 0;//自动装载ARR
	Tim_Struct.TIM_Prescaler = 71;//PSC预分频系数
	//Tim_Struct.TIM_RepetitionCounter高级定时器才有的
	TIM_TimeBaseInit(PWM_TIM,&Tim_Struct);

知道了RCC为72Mhz;下面咱们来到了PSC;在芯片手册中有这么一段介绍

总得来说呢;就是这三个寄存器控制了“时基单元”;这也是定时器做什么需要配置的寄存器了;所以他这里的讲解呢太官方了;也很难看明白;咱们就挑着咱们需要的去看;

首先介绍一下,每个寄存器代表着什么

就是ARR有一个值,计数器呢如果是向上计数模式;每次就从0加一;到了ARR的值呢就归0;之后继续一直加一;

5.3、PWM输出

	//设置输出比较模式
	TIM_OCInitTypeDef Tim_OC_Struct;
	//Tim_OC_Struct.TIM_OCIdleState
	Tim_OC_Struct.TIM_OCMode = TIM_OCMode_PWM1;
	//Tim_OC_Struct.TIM_OCNIdleState
	//Tim_OC_Struct.TIM_OCNPolarity
	Tim_OC_Struct.TIM_OCPolarity = TIM_OCPolarity_High;
	//Tim_OC_Struct.TIM_OutputNState
	Tim_OC_Struct.TIM_OutputState = TIM_OutputState_Enable;
	Tim_OC_Struct.TIM_Pulse = 0;//比较值
	PWM_TIM_FUN_INIT(PWM_TIM,&Tim_OC_Struct);

首先呢在上面的图中;上办部分我们已经知道了TIM定时器在做什么,那么怎么产生PWM波形呢??

我们看到下半部分

在中间有一个Pulse;在计数器的值小于pulse的时候,在我们的PWM1模式下,输出高电平;当计数器的值大于pulse的情况下,输出低电平(不严谨,应该是有效电平和无效电平;大家看得懂就行)于是我们需要配置的寄存器就明了了

5.4、具体配置

首先我们RCC给一个72Mhz的时钟,通过PSC寄存器分频;配置ARR以及CRR(pulse的);就可以产生PWM波形了;计算公式

  • 时钟频率 (F_TIMER):定时器的时钟频率,默认为72 MHz。(再次强调:由APB2的预分频系数决定但是通用定时器是在APB1总线下面

  • 预分频器 (PSC):预分频器值,用于将时钟频率降低。其公式为:

    其中,FAPBF_{APB}FAPB​ 是APB总线的频率,假设为72 MHz,如果未做任何分频,PSC通常为0。

  • 自动重装载寄存器 (ARR):定义计数器的最大计数值,PWM频率的计算如下:

  • 捕获/比较寄存器 (CCR):定义PWM信号的占空比。占空比计算为:

标签:定时器,Struct,Tim,OC,STM32,TIM,PWM
From: https://blog.csdn.net/zxtzxt12138/article/details/143471736

相关文章

  • ST官方开发工具(一) STM32CubeMX 安装
    STM32CubeMX安装安装Java的环境STM32CubeMX安装在开发STM32MP157的时候我们还需要用到一些ST官方提供的软件,一共有三种:STM32CubeMX、STM32CubeIDE、STM32CubeProgrammerSTM32CubeMX可以直接在ST官网下载到http://www.st.com/en/developmen......
  • STM32 第20章 USART--串口通信3
    时间:2024.10.30参考资料:《零死角玩转STM32》“USART--串口通信”章节 一、学习内容1、串口2345代码移植实现控制串口2-->将串口1的宏修改成串口2的即可1.1串口的宏串口1://为了方便移植,定义的宏//串口1-USART#defineDEBUG_USARTxUSART1#d......
  • STM32 第20章 USART--串口通信2
    时间:2024.10.29参考资料:《零死角玩转STM32》“USART--串口通信”章节编程是从GPIO输出-使用固件库点亮LED灯的基础上开始一、学习内容1、STM32串口初始化结构体和固件库1.1USART初始化结构体 /***@briefUSARTInitStructuredefinition*/typedef......
  • STM32按键开关灯
    文章目录概要整体架构流程灯LEDSTM32F103的IO口--IN/OUT输入输出的接口IO口资源和命名方式stm32中GPIO的内部结构以及工作模式寄存器与配置时钟软件编程驱动LED灯延时函数使用嘀嗒定时器按键驱动概要使用Stm32F103ZET6型号芯片开发项目中灯led、IO口、......
  • 梁山派入门指南4——定时器使用详解,包括定时器中断、PWM产生、输入捕获测量频率
    梁山派入门指南4——定时器使用详解,包括定时器中断、PWM产生、输入捕获测量频率1.定时器概览2.基本定时器2.1基本定时器介绍2.2梁山派上的基本定时器开发2.2.1.了解梁山派上的基本定时器资源(实际上我们以及在上面了解过了)2.2.2.配置定时器2.2.3.编写定时器中断服务......
  • 【STM32 Blue Pill编程实例】-4位7段数码管使用
    4位7段数码管使用文章目录4位7段数码管使用1、7段数码介绍2、硬件准备与接线3、模块配置4、代码实现在本文中,我们将介绍如何将STM32BluePill开发板与4位7段数码管连接,并在STM32CubeIDE中对其进行编程。在文章中首先将介绍4位7段数码管及其与......
  • 基于STM32的激光通信系统设计
    备忘编者按:激光通信具有保密性强、通信容量大、重量轻、功耗和体积小、制造和维护费用低等特点。为满足民用领域对于激光通信的需求,设计了一种基于STM32的激光通信系统。该系统由激光发射模块、激光接收模块,STM32F407主控模块组成,采用双音多频方式进行调制。在实验室环境下进行了......
  • STM32 第21章 DMA--直接存储器访问
    时间:2024.10.31-11.2参考资料:《零死角玩转STM32》“DMA--直接存储器访问”章节编程部分的代码基于12-GPIO输出-使用固件库点亮LED灯一、学习内容1、DMA功能框图和DMA初始化结构体1.1DMA功能框图1.1.1DMA简介DMA:DataMemoryAccess,直接存储器访问。和GPIO、串口等一......
  • stm32读取麦克风inmp441数据并实时播放
    概述最近在做一个功能类似于对讲机通话的功能,本来在网上感觉很容易找到同样的案例复刻,结果发现大多数都是用esp32,或者说电脑作为上位机传输wav音频解码播放的效果,也有很相仿的,但是都测试结果不尽人意,经过不断摸索下面是我给出的方案。但是本篇文章只限于单片机mcu芯片通......
  • 基于STM32F407系列外部中断学习
    STM32外部中断学习1)外部中断概述1.外部中断描述在日常生活中,例如早上在睡觉被闹钟吵醒,你去关闭闹钟就属于中断事件。在主函数里的代码是由CPU运行的,CPU在执行过程中突然发生了异常事件(中断),CPU必须暂停当前的工作(设下断点),然后跑去处理这个异常事件的函数(中断服务函数),处理......