STM32输出PWM

发布者:Turquoise最新更新时间:2024-07-17 来源: elecfans关键字:STM32  输出PWM  闪存 手机看文章 扫描二维码
随时随地手机看文章

  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3 内核。按性能分成两个不同的系列: STM32F103 “增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品。


  基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHZ时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品。


  脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。

  STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。

  PWM输出介绍

  PWM输出模式

  STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下:

  110:PWM模式1-在向上计数时,一旦TIMx_CNT《TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT》TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

  111:PWM模式2-在向上计数时,一旦TIMx_CNT《TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT》TIMx_CCR1时通道1为有效电平,否则为无效电平。

  由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。

  而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。

  PWM输出管脚

  PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。

  但是这些重映像的管脚也是由参考手册给出的。比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,如果设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,如果设置了完全重映像的话,TIM3_CH2的输出就被映射到PC.7上了。

  PWM输出信号

  PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决定的,具体设置方法在前面一个学习笔记中有详细的交代。而输出信号的占空比则是由TIMx_CRRx寄存器确定的。

  其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。


  TIMER输出PWM实现步骤

  第1步、设置RCC时钟已经在前文中给出了详细的代码,在此就不再多说了。需要注意的是通用定时器TIMx是由APB1提供时钟,而GPIO则是由APB2提供时钟。注意,如果需要对PWM的输出进行重映像的话,还需要开启引脚复用时钟AFIO。

  第2步、设置GPIO时钟时,GPIO模式应该设置为复用推挽输出GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用GPIO_PinRemapConfig()函数进行设置。

  第3步、设置TIMx定时器的相关寄存器时,和前一篇学习笔记一样,设置好相关的TIMx的时钟和技术模式等等。具体设置参看“TIMER基本定时功能”的学习笔记。

  第4步、设置PWM相关寄存器,首先要设置PWM模式(默认情况下PWM是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx的输出状态和使能TIMx的PWM输出使能。

  相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了。


  TIMER输出PWM源代码

  由于我现在手上的奋斗开发板是将PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要进行引脚重映像。打开TIM3之后,PWM输出,使得LED点亮,通过改变PWM_cfg()中的占空比可以调节LED的亮度。

  #include “stm32f10x_lib.h”

  void RCC_cfg();

  void GPIO_cfg();

  void TIMER_cfg();

  void PWM_cfg();

  //占空比,取值范围为0-100

  int dutyfactor = 50;

  int main()

  {

  int Temp;

  RCC_cfg();

  GPIO_cfg();

  TIMER_cfg();

  PWM_cfg();

  //使能TIM3计时器,开始输出PWM

  TIM_Cmd(TIM3, ENABLE);

  while(1);

  }

  void RCC_cfg()

  {

  //定义错误状态变量

  ErrorStatus HSEStartUpStatus;

  //将RCC寄存器重新设置为默认值

  RCC_DeInit();

  //打开外部高速时钟晶振

  RCC_HSEConfig(RCC_HSE_ON);

  //等待外部高速时钟晶振工作

  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)

  {

  //设置AHB时钟(HCLK)为系统时钟

  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  //设置高速AHB时钟(APB2)为HCLK时钟

  RCC_PCLK2Config(RCC_HCLK_Div1);

  //设置低速AHB时钟(APB1)为HCLK的2分频

  RCC_PCLK1Config(RCC_HCLK_Div2);

  //设置FLASH代码延时

  FLASH_SetLatency(FLASH_Latency_2);

  //使能预取指缓存

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  //设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz

  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  //使能PLL

  RCC_PLLCmd(ENABLE);

  //等待PLL准备就绪

  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

  //设置PLL为系统时钟源

  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  //判断PLL是否是系统时钟

  while(RCC_GetSYSCLKSource() != 0x08);

  }

  //开启TIM3的时钟

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

  //开启GPIOB的时钟和复用功能

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

  }

  void GPIO_cfg()

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  /******初始化连接LED的引脚PB5*************/

  //部分映射,将TIM3_CH2映射到PB5

  //

  GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

  //选择引脚5

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  //输出频率最大50MHz

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //复用推挽输出

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOB,&GPIO_InitStructure);

  }

  void TIMER_cfg()

  {

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  //重新将Timer设置为缺省值

  TIM_DeInit(TIM3);

  //采用内部时钟给TIM3提供时钟源

  TIM_InternalClockConfig(TIM3);

  //预分频系数为0,即不进行预分频,此时TIMER的频率为72MHz

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  //设置时钟分割

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

  //设置计数器模式为向上计数模式

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  //设置计数溢出大小,每计7200个数就产生一个更新事件,即PWM的输出频率为10kHz

  TIM_TimeBaseStructure.TIM_Period = 7200 - 1;

  //将配置应用到TIM3中

  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  }

  void PWM_cfg()

  {

  TIM_OCInitTypeDef TimOCInitStructure;

  //设置缺省值

  TIM_OCStructInit(&TimOCInitStructure);

  //PWM模式1输出

  TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  //设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%

  TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;

  //TIM输出比较极性高

  TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  //使能输出状态

  TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  //TIM3的CH2输出

  TIM_OC2Init(TIM3, &TimOCInitStructure);

  //设置TIM3的PWM输出为使能

  TIM_CtrlPWMOutputs(TIM3,ENABLE);

  }


关键字:STM32  输出PWM  闪存 引用地址:STM32输出PWM

上一篇:GD32如何替换STM32?
下一篇:STM32-GPIO详解

推荐阅读最新更新时间:2026-03-25 11:13

STM32定时器之PWM 4路输出 TIM3、TIM14
以STM32F030F4P6,uVision开发环境为例,注意了,若使用其它相近芯片,本文仅供参考。 程序运行后TIM3的CH1、CH2、CH4,TIM14的CH1输出PWM波形。 以下是main.c文件: #include stm32f0xx.h //转载请注明出处: https://www.cnblogs.com/beiyhs/p/11435583.html 北有寒山 void PWM_GPO_TIM(void) //PWM引脚时钟设置函数 { GPIO_InitTypeDef GPIO_InitStructure;
[单片机]
基于stm32单片机利用通用定时器输出PWM
通用定时器(以下以通用定时器3,通道3 为例): 第一步:开启时钟使能 RCC-》APB1ENR:1 位 //开启定时器3 时钟使能 第二步:设置定时器分频与装载计数值(以一周期 1ms) TIM3-》PSC = 7199; //系统时钟为 72M 经 (7199+1) 分频后,定时器时钟为 10k(一周期为0.1ms) TIM3-》ARR = 9; //计数周期为 0.1ms * (9+1) = 1ms 第三步:使能定时器 TIM3-》CR1:0 位 //开启计数器,开始计时 第四步:溢出中断使能 TIM3-》DIER:0 位 //开启溢出中断 第五步: void TIM3_IRQHandler(void); 利用通用定时器
[单片机]
stm32 定时器输出比较(OC)与PWM的理解和应用
1. 定时器TIM简介 TIM 是 stm32 微控制器中的定时器模块。stm32 包含多个定时器模块,每个定时器模块有不同的功能和配置,适用于各种应用场景。 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从模式等多种功能 定时器分类: image.png 基本定时器结构(时基单元): image.png 2. TIM 定时器相关概念 计数模式 向上计数模式(Up-counter mode) 向下计数模式(Down-counter mode) 中心对齐模式(Center-aligned mod
[单片机]
stm32单片机中使用GPIO口模拟PWM输出解析
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核(ST‘s product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex®-M0 and M0+, Cortex®-M3, Cortex®-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range t
[单片机]
<font color='red'>stm32</font>单片机中使用GPIO口模拟<font color='red'>PWM</font><font color='red'>输出</font>解析
基于STM32芯片三路互补PWM输出的设计实现
硬件:Stm32f103c8t6最小系统。 开发平台:MDK-Arm。 目的:使用Stm32高级定时器TIM1。配置中心对齐模式输出三路互补PWM。 (1)Stm32的高级定时器: Stm32f103c8t6有一个高级定时器TIM1。STM32的高级定时器比通用定时器增加了可编程死区互补输出,重复计数器,带刹车(短路)功能。这些功能为电机控制提供了便利。其中重复计数器下篇文章单独讲。 TIM1的IO分配: (2)高级定时器框图分析: 图1 图1高级定时器框图,可分为6部分,①时钟源选择,②控制器,③时基单元,④输入捕获,⑤输出比较,⑥刹车断路。 ①时钟选择: 时钟源有:内部时钟(CK_INT),外部时钟模式1,外部时钟模式
[单片机]
基于<font color='red'>STM32</font>芯片三路互补<font color='red'>PWM</font><font color='red'>输出</font>的设计实现
Robomaster-stm32-PWM学习笔记(stm32控制pwm输出)
学习笔记: 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 将通用 定时器 分为四个部分: 1-选择 时钟 2-时基电路 3-输入捕获 4-输出比较 实践1-pwm- led 闪烁 要求产生周期为200ms,占空比为50%的PWM 信号 来控制led灯。 1.cubemax配置 由原理图可知,led引脚复用为 ti m5 周期为200ms,占空比为50%,Tim5挂在APB1总线上,CLK =
[单片机]
Robomaster-stm32-<font color='red'>PWM</font>学习笔记(<font color='red'>stm32</font>控制<font color='red'>pwm</font><font color='red'>输出</font>)
STM32基础7--通用定时器(PWM输出
通用定时器框图 在通用定时器中,内部结构与基本定时器是不一样的。下面是通用定时器TIM10/TIM11 和 TIM13/TIM14的内部结构,可以看到它支持一个通(TIMx_CH1)道,其他的通用定时器内部结构不一样在于它们支持的通道数。 从图中可以看到,通用定时除了基本的定时(基本定时的作用)功能以外,还支持信号的输入,信号的输出,也多了一个捕捉比较寄存器。 PWM(Pulse Width Modulation—脉冲宽度调制技术) 在一个周期波形中,高电平占整个周期的比例称之为占空比,而高电平宽度通常被称为脉冲宽度。当我们在控制占空比,从而控制电路导通或者关闭时间,从而控制导通的有效电压。由于这个特性,我们在需要控制LE
[单片机]
<font color='red'>STM32</font>基础7--通用定时器(<font color='red'>PWM</font><font color='red'>输出</font>)
stm32定时器既做定时功能又输出PWM并控制PWM启停
对于普通定时器如TIM2、TIM3、TIM4、TIM5,如下配置: //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockC
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved