STM32开发(6)----CubeMX配置PWM

本文介绍了如何使用STM32CubeMX配置PWM,包括选择芯片、设置时钟源、配置引脚及定时器参数,然后通过代码实现PWM输出,占空比动态变化,并通过示波器验证实验结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本章介绍使用STM32CubeMX对PWM进行配置的方法,PWM的基本原理,并通过示波器来测试实现结果,如果有LED灯也可以,PWM控制LED灯的亮度。

一、PWM的介绍

PWM(Pulse Width Modulation)脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制电流。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。

广泛应用在从测量、通信到功率控制与变换的许多领域中。STM32内置多个IO输出PWM通道。

在这里插入图片描述
脉冲宽度调制模式可以生成一个信号,该信号频率由自动重载寄存器(TIMx_ARR)寄存器值决定,其占空比则由捕获/比较寄存器(TIMx_CCRx) 寄存器值决定。
在 PWM 模式下,计数器寄存器(TIMx_CNT )总是与捕获/比较寄存器(TIMx_CCRx )进行比较,以确定是TIMx_CCRx>TIMx_CNT 还是 TIMx_CNT<TIMx_CCRx(取决于计数器计数方向)。
下图为PWM边沿对齐模式(递增计数配置)。图中CCRx为捕获/比较寄存器,OCxREF为输出比较信号,CCxIF为中断状态标识位。
在这里插入图片描述

当CCRX=4时,当捕获/比较寄存器(TIMx_CCRx)比计数器小时,输出高电平,反之则输出低电平。
因此改变CCRx的值就可以改变PWM输出的占空比,改变ARR的值就可以改变PWM输出的频率.

二、实验过程

1.实验材料

  • STM32F103C6T6最小系统开发板

在这里插入图片描述

  • ST-LINK V2

在这里插入图片描述

  • 杜邦线
  • 示波器

2.STM32CubeMX配置PWM

选择芯片stm32f103c6t6,新建工程

在这里插入图片描述

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

在这里插入图片描述

配置时钟树,这里使用官方推荐的配置

在这里插入图片描述

配置引脚功能,从datasheet中可以PA9可以复用为TIM1_CH2输出,因此将管脚PA9配置为定时器1的通道2输出。同时TIM1的通道2配置为PWM,这样就可以在PA9管脚得到PWM输出。datasheet截图如下:
在这里插入图片描述

配置如下:
在这里插入图片描述

前面设置HSE时钟为72MHz;TIM1的时钟挂载在APB2 Time Clocks上为72MHz
在这里插入图片描述
预分频系数设置为72-1,向上计数,自动重装载值设为500-1,则计时器时钟频率为1MHz,计时器周期为1us,定时器溢出周期(即PWM周期)为 500 * 1 = 500us,溢出频率(即PWM频率)为1/500us = 2KHz
在这里插入图片描述
Code Generator中设置只拷贝使用到的库,分离.c和.h文件

在这里插入图片描述

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

在这里插入图片描述

3.代码实现

实现一个周期为500us,占空比不断变化的pwm输出功能,代码如下

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
	uint16_t pwmVal=0;   //PWM占空比
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);   //开启定时器PWM输出  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
   while (1)
  {
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
 
	  while (pwmVal< 500)
	  {
		  pwmVal++;
		  __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwmVal);    //修改占空比
		  HAL_Delay(1);
	  }
	  while (pwmVal)
	  {
		  pwmVal--;
		  __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwmVal);    //修改占空比
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);
 
  /* USER CODE END 3 */
 }
  /* USER CODE END 3 */
}

4.编译烧录

代码编译成功

在这里插入图片描述

在下载前检查keil是否检测到ST-LINK,选择魔法棒进行设置

在这里插入图片描述

如图所示,已经检测到ST-LINK 下载器

在这里插入图片描述

点击load,自动下载固件

在这里插入图片描述

5.硬件连接

烧录器ST-LINK V2和最小系统板的连接如图所示: 四线连接 SWDIO,GND,SWCLK,和3.3V电源

在这里插入图片描述

6.实验结果

由于没有找到LED灯,所以使用示波器进行测量,从测试结果可以看到,输出了PA9脚输出了电压为3.3V,周期为500 us的方波,且占空比在不断变化,如下图所示。

在这里插入图片描述
下面上个动图,看一下占空比不断变化的过程
在这里插入图片描述

总结

本章介绍STM32CubeMX对PWM进行配置的方法,PWM的技术实现原理,最后使用示波器来测试实验结果。

### 使用STM32CubeMX配置PWM生成定时器设置教程 #### 配置环境准备 为了成功配置STM32F407的PWM功能,需确保已安装并熟悉使用STM32CubeMX工具。该工具简化了外设初始化过程中的复杂度。 #### 创建新项目 启动STM32CubeMX,在初始界面选择目标微控制器型号(如STM32F407),创建一个新的工程文件[^1]。 #### 设置时钟树结构 进入Clock Configuration页面调整系统时钟至所需频率,这直接影响到后续PWM信号的实际工作频率。对于大多数应用,默认的最大性能模式即可满足需求[^4]。 #### 定时器的选择与基本参数设定 导航至Pinout & Configuration标签页下的Connectivity部分找到Timers组件。选取合适的通用定时器实例(例如TIM2)。点击选定后的定时器图标打开其属性编辑窗口[^3]。 在此处完成初步配置- **Mode**: 设定为Output Compare PWM mode 1 或者其他适用的工作方式。 - **Channel(s)**: 根据实际硬件连接情况指定参与PWM输出的具体通道号。 - **Polarity**: 正常极性或反转极性取决于外部电路设计要求。 - **Idle State**: 停机状态下保持高电平还是低电平同样依据具体应用场景而定。 #### 进一步细化PWM特性定义 切换到Parameters选项卡继续深入定制化PWM行为特征: - **Prescaler Value (PSC)**: 控制计数溢出前经历多少个输入脉冲周期;此值影响最终产生的PWM波形频率范围。按照公式\[f_{pwm}=\frac{f_{tim}}{(psc+1)\times(ARR+1)}\],其中\(f_{tim}\)代表定时器内核运行速率,通常等于APB总线速度的一半当倍频使能关闭时。 - **Auto Reload Register (ARR)**: 表征单次完整计数值上限边界条件,间接决定了PWM周期长度以及最小分辨精度。 - **Capture/Compare Registers(CCRx)**: 各自对应不同输出信道上的有效触发阈值位置,直接关联着所期望获得的占空比比例关系[^2]。 #### GPIO端口映射确认 返回主界面上检查相关GPIO引脚是否已被正确分配给之前挑选出来的PWM资源。必要时手动修正错误链接状况以保障物理连线无误。 #### 中断和服务例程管理 如果计划利用中断机制来处理特定事件,则可在NVIC Settings板块勾选对应的IRQ请求项以便激活相应服务程序支持。 #### 导入代码框架 最后通过Project Manager模块导出适用于IDE编译平台的基础驱动库源码包。此时会连同所有先前所做的各项修改一并保存下来供下一步开发阶段调用。 ```c // 示例:简单的PWM开启函数 void Start_PWM(void){ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //假设选择了TIM2 CH3作为PWM出口 } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值