STM32F4 | PWM输出实验


  上一章,我们介绍了 STM32F429 的通用定时器 TIM3,用该定时器的中断来控制 DS1 的闪烁,这一章,我们将向大家介绍如何使用 STM32F429TIM3 来产生 PWM 输出。在本章中,我们将使用 TIM3 的通道 4 来产生 PWM 来控制 DS0 的亮度。

一、PWM 简介

  脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图所示:
在这里插入图片描述
  上图就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM模式,且当CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。
  STM32F429 的定时器除了 TIM67。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3CH4 产生一路 PWM 输出。
  要使 STM32F429 的通用定时器 TIMx 产生 PWM 输出,除了上一章介绍的寄存器外,我们还会用到 3 个寄存器来控制 PWM 的。这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。接下来我们简单介绍一下这三个寄存器。

  • 捕获/比较模式寄存器:TIMx_CCMR1/2
      该寄存器一般有 2 个:TIMx _CCMR1TIMx _CCMR2TIMx_CCMR1 控制 CH12,而TIMx_CCMR2 控制 CH34。以 TIM3 为例,TIM3_CCMR2 寄存器各位描述如图所示:
    在这里插入图片描述
    该寄存器的有些位在不同模式下,功能不一样,所以在图中,把寄存器分了 2 层,上面一层对应输出而下面的则对应输入。关于该寄存器的详细说明,请参考《STM32F4xx中文参考手册》第 435 页。这里我们需要说明的是模式设置位 OC4M,此部分由 3 位组成。总共可以配置成 7 种模式,我们使用的是 PWM 模式,所以这 3 位必须设置为 110/111。这两种 PWM 模式的区别就是输出电平的极性相反。另外 CC4S 用于设置通道的方向(输入/输出)默认设置为 0,就是设置通道作为输出使用。

  • 捕获/比较使能寄存器:TIMx_CCER
      该寄存器控制着各个输入输出通道的开关。该寄存器的各位描述如图所示:
    在这里插入图片描述
    该寄存器比较简单,我们这里只用到了 CC4E 位,该位是输入/捕获 4 输出使能位,要想PWMIO 口输出,这个位必须设置为 1,所以我们需要设置该位为 1。该寄存器更详细的介绍了,请参考《STM32F4xx 中文参考手册》第 436 页。

  • 捕获/比较寄存器:TIMx_CCR1~4
      该寄存器总共有 4 个,对应 4 个通道 CH1~4。我们使用的是通道 4,TIM3_CCR4 寄存器的各位描述如图所示:
    在这里插入图片描述
      在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存器(TIMx_BDTR),该寄存器各位描述如图所示:
    在这里插入图片描述
      该寄存器,我们只需要关注最高位:MOE 位,要想高级定时器的 PWM 正常输出,则必须设置 MOE 位为 1,否则不会有输出。注意:通用定时器不需要配置这个。该寄存器更详细的介绍请参考《STM32F4xx 中文参考手册》第 386 页。

  本章,我们使用的是 TIM3 的通道 4,所以我们需要修改 TIM3_CCR4 以实现脉宽控制 DS0的亮度。
  下面介绍通过 HAL 库来配置该功能的步骤,相关的函数设置在库函数文件 stm32f4xx_tim.hstm32f4xx_tim.c 文件中。

  1. 开启 TIM3GPIO 时钟,配置 PB1 选择复用功能 AF1TIM3)输出
      要使用 TIM3,我们必须先开启 TIM3 的时钟。HAL 库使能 TIM3 时钟和 GPIO 时钟方法是:

    __HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器 3
    __HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟
    

      配置 PB1 为复用(AF1)输出,才可以实现 TIM3_CH4PWM 经过 PB1输出。接下来便是要配置 PB1 复用映射为 TIM3PWM 输出引脚。关于 IO 口复用映射,在串口通信实验中有详细讲解,主要是通过函数 HAL_GPIO_Init 来实现的:

    GPIO_InitTypeDef GPIO_Initure;
    
    GPIO_Initure.Pin=GPIO_PIN_1; //PB1
    GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP; //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
    GPIO_Initure.Alternate= GPIO_AF2_TIM3; //PB1 复用为 TIM3
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在STM32F4上输出PWM信号,可以使用定时器模块。具体步骤如下: 1. 初始化定时器模块,选择合适的时钟源和分频系数。 2. 配置定时器为PWM模式,选择合适的计数值和占空比。 3. 配置输出引脚,使其连接到定时器的输出通道。 以下是一个简单的示例代码,使用TIM3_CH1输出PWM信号: ```c // 初始化定时器模块 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = 0; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 999; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); // 配置定时器为PWM模式 TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 499; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStruct); // 配置输出引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); // 启动定时器 TIM_Cmd(TIM3, ENABLE); ``` 这段代码将在PB4引脚输出一个占空比为50%的PWM信号,频率为84MHz/1000=84kHz。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值