STM32CubeMX之定时器PWM输出

2023-05-16

STM32CubeMX之定时器PWM输出

知识百科 – PWM简介

  PWM是一种对模拟信号电平进行​​ ​​数字编码​​​​​的方法。通过高​​ ​​分辨率​​​​计数器的使用,方波的占空比被调制用来对一个具体​​ ​​模拟信号​​​​的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
  脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中 。
  PWM的一个优点是从处理器到​​ ​被控系统​​​信号都是数字形式的,再进行数模转换。可将噪声影响降到最低(可以跟电脑一样)。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

STM32定时器PWM输出简介

  定时器脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1 寄存器的ARPE位, (在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
   仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。 TIMx_CCER寄存器中的CCxE位控制OCx输出使能。

  • PWM模式介绍

  在计数器向上计数模式下(即TIMx_CR1的DIR位为0) ,当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。 下图为TIMx_ARR=8(ARR重装载寄存器,表示定时器的计数周期)时边沿对齐的PWM波形实例。
在这里插入图片描述

  本示例实现 IO 输出模式–PWM 波形输出。 以 LED 驱动为例, 使用定时器高级功能(PWM 模式), 实现呼吸灯效果。

1.硬件接口

  本硬件平台有3个LED灯分别为LED2、LED3、LED4LED2接PA1,LED2接PB8,LED4接PB9,硬件原理图如下:
在这里插入图片描述
  根据STM32引脚定义手册或者STM32CUbeMX软件我们可得知定时器4的CH1和CH2对应外部引脚PB8和PB9。
在这里插入图片描述

2 软件设计

  打开STM32CubeMX工具,配置定时器4,将PB8配置为定时器4通道3(复用推挽输出),PB9配置为定时器4通道4(复用推挽输出)。
在这里插入图片描述
在这里插入图片描述
  定时器4 基本配置及PWM模式配置
  配置定时器通道模式为PWM模式,设置分频系数为72,重装载值为500,设置有效电平为低电平。
在这里插入图片描述

3.参数说明

模式说明
Input capture direct mode输入捕获直接模式
Input capture indirectmode输入捕获间接模式
Input capture triggered by TRC输入捕获触发器模式
Output compare no output输出比较(冻结模式000 )
Output compare CH3输出比较(001)
PWM Generation No outputPWM产生无输出
PWM Generation CH3PWM输出到CH3
CH3 Combined channels联合通道
xor activation定时器输入异或模式
在这里插入图片描述

4. 代码生成

  TIM4基本功能配置

/* TIM4 init function */
void MX_TIM4_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim4.Instance = TIM4;//定时器4
  htim4.Init.Prescaler = 72-1;//分频系数72分频
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数方式
  htim4.Init.Period = 300;//重装装载值
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//无时钟分频
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//自动重装载预装载使能
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)//初始化定时器
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;//PWM模式1,CNT<CCR为有效电平
  sConfigOC.Pulse = 0;//占空比
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;//有效电平时间
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;//快速比较使能
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)//PWM模式初始化
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim4);//硬件层初始户化

}

在这里插入图片描述
  PWM模式配置:
在这里插入图片描述
  PB8、PB9引脚配置和PWM模式使能

HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_3);//初始化通道3
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_4);//初始化通道4

  引脚模式配置及PWM初始化

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle->Instance==TIM4)
  {
  /* USER CODE BEGIN TIM4_MspPostInit 0 */

  /* USER CODE END TIM4_MspPostInit 0 */

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**TIM4 GPIO Configuration
    PB8     ------> TIM4_CH3
    PB9     ------> TIM4_CH4
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM4_MspPostInit 1 */
  HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_3);//启动通道3
  HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_4);//启动通道4
  /* USER CODE END TIM4_MspPostInit 1 */
  }
}

在这里插入图片描述

4.呼吸灯主函数示例

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		/*实现呼吸灯*/
		if(flag==0)i++;
		else i--;
		if(i>=300)flag=1;
		if(i==0)flag=0;
		HAL_Delay(3);
		htim4.Instance->CCR3=i;//调节占空比
		htim4.Instance->CCR4=i;
  }

5.HAL库定时器常用函数介绍

  HAL库中定时器基本功能函数源码均在stm32f1xx_hal_tim.c中,高级功能函数在stm32f1xx_hal_tim_ex.c中,本小节主要介绍几个常用函数。(以下列举函数可能需要用户调用或修改)。

/*硬件层初始化:时钟、中断,DMA*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
/*中断方式开启定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
/*DMA方式开启定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);
/*开启定时器PWM模式*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

/*获取状态*/
HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim);
/*中断方式开启定时器输入捕获功能*/
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

6.软件仿真效果展示

  通过KEIL软件仿真,查看引脚电平变化,KEIL软件相关设置:
CPU DLL:SARMCM3.DLL
Dialog DLL:DARMSTM.DLL Parameter:-pSTM32F103C8
在这里插入图片描述
  进入仿真模式:
在这里插入图片描述
  查看引脚电平变化波形:在这里插入图片描述
在这里插入图片描述
  波形效果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX之定时器PWM输出 的相关文章

  • PWM输出讲解

    一 PWM基础知识 1 PWM的定义 PWM xff0c 是脉冲宽度调制 缩写 xff0c 它是通过对一系列脉冲的宽度进行调制 xff0c 等效出所需要的波形 xff08 包含形状以及幅值 xff09 xff0c 对模拟信号电平进行数字编码
  • 1、STM32CubeMX和STM32Cube库(HAL)详细介绍

    目录 前言 STM32Cube生态 STM32Cube 是什么 xff1f STM32Cube 软件工具套件 STM32Cube Embedded 软件 STM32CubeMX 编辑 前言 也许大家在学习正点原子或者其他32视频和代码的时候
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • STM32CubeMX——霍尔编码器、L298N驱动电机

    前言 人生如逆旅 xff0c 我亦是行人 苏轼 临江仙 送钱穆父 目录 xff1a L298N电机驱动介绍编码器介绍电机介绍新建工程编写代码实验结果 一 L298N电机驱动介绍 B站 视频讲解 xff1a l298n电机驱动模块 电机正反转
  • STM32CubeMX串口USART中断发送接收数据

    本文代码使用 HAL 库 文章目录 前言一 中断控制二 USART中断使用1 中断优先级设置 xff1a 2 使能中断3 使能UART的发送 接收中断4 中断收发函数5 中断处理函数6 中断收发回调函数 三 串口中断实验串口中断发送数据点亮
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • 基于STC89C52的智能小车——PWM调速篇

    虽然我的小车因为电池电压太低慢的要死 xff0c 不过PWM还是要学的 PWM简单来说就是通过调整占空比 xff08 一个时间段 t 内电机运行的时间占总时间的比例 xff09 来调整小车速度 当然为了小车运行稳定 t 必须很小 xff0c
  • STM32F103C8T6 PWM驱动舵机(SG90)

    小知识 xff1a 同一个定时器 xff0c 不同通道输出不同输出PWM的特点 对于同一个定时器的不同通道输出PWM xff0c 因为它们是共用一个计数器的 xff0c 所以频率必须一样 xff0c 而占空比由各自的CCR决定 xff0c
  • 用PWM控制舵机(以是stm32为例)

    因为做校创需要用到舵机 xff0c 以前知道大致的理论 xff0c 因此看了一些帖子 xff0c 总结一下被以后查看 什么是PWM波 PWM就是脉冲宽度调制 xff0c 也就是占空比可变的脉冲波形 pwm的占空比 xff0c 就是指高电平保
  • STM32F103控制PCA9685产生16路PWM波控制SG90舵机

    STM32控制PCA9685产生16路PWM波控制SG90舵机 如果你能点开这篇文章 xff0c 说明你已经知道PCA9685是多么强大 xff0c NXP公司原本做这片芯片是为了提供给LED使用 xff0c 在其官方文档里也能看到所有PW
  • 基于HAL库的stm32f103c8t6的快速开发笔记(简易版)—— 5、STM32的PWM输出(附舵机控制)

    1 概念了解 首先了解到 PWM生成是在通用定时器的基础上配置的 每个通用定时器都有多路通道输出PWM信号 这里以TIM4 定时器4 为例 在图形配置面板找到TIM4的通道一作为PWM输出管脚 其管脚为PB6 打开左侧定时器配置面板 可以看
  • stm32cubeMx 软件的删除用户代码的问题总结

    今天研究了一下stm32cubeMx 这个软件 若是stm32 的项目比较紧急 可以使用这个软件来生成驱动代码 至于在这个软件中的模块代码的选择 配置 我这里不会多说 因为网上很多 我这里主要 总结stm32cubeMx 会删除用户代码的问
  • Keil编辑和STM32cubemx配置STM32控制步进电机

    使用Keil ARM V5 IDE编程和STM32CUBEMX代码配置实现STM32F103和步进电机驱动器模块A4988控制步进电机 Keil和Stm32cubemx 安装 安装Keil IDE非常简单 下载包含Keil IDE的MDK
  • X2000 Linux PWM

    一 硬件设计 PC04 PWM4 二 通过shell开启PWM 配置参数 cmd pwm config pc04 freq 1000 max level 100 active level 1 accuracy priority freq 启
  • 【STM32CubeMX】位置式PID调节控制输出电压(超详解)

    本文将借助STM32CubeMX来配置ADC DMA DAC USART 并利用PID位置式算法实现对输出电压进行AD采集通过PID算法调节DAC 获取到我们想要的电压值 讲解的主要知识 何为PID以及为何需要PID STM32CubeMX
  • 一起学nRF51xx 9 -  pwm

    前言 上一讲我们学习了nrf51822定的器的使用 那行如何用定时器实现PWM输出呢 NRF51的time模块不支持 PWM 功能 不可我们可以通过定时器 PPI GPIOTE模块一起工作的方式在NRF51XX上产生 PWM 信号 下面以使
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • BeagleBone Black (v4.14) 上的 PWM 芯片到引脚映射

    关于如何在较新版本的内核上配置 Beaglebone 进行 PWM 的信息非常少 我按照以下指示进行操作BeagleBone Black v4 14 上的 PWM https stackoverflow com questions 5020
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后

随机推荐