STM32L051使用HAL库操作实例(9)- PWM输出实验

本文深入解析了STM32微控制器中PWM(脉冲宽度调制)的工作原理及其配置过程,详细介绍了如何使用STM32CubeMX工具进行定时器配置,以及在KEIL环境下编写PWM控制代码,实现LED呼吸灯效果。

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


目录

一、前言

二、PWM工作原理

三、PWM的工作模式

四、PWM的配置过程

五、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)

五、配置STM32CubeMX生成工程文件​​

六、KEIL程序


一、前言

​ PWM脉冲宽度调制,是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中;

二、PWM工作原理

STM32每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器值和计数器值比较,通过比较结果输出高低电平,实现PWM信号。

先简单说明一下原理(下图为向上计数): 

  •  定时器重装载值为ARR,比较值CCRx;
  •  t时刻对计数器值和比较值进行比较;
  •  如果计数器值小于CCRx值,输出低电;平;;
  •  如果计数器值大于CCRx值,输出高电平

PWM的一个周期

  • 定时器从0开始向上计数
  • 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平;
  • t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平;
  • 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程;
  • 至此一个PWM周期完成;

总结

ARR寄存器的值即自动重装载值,和预分频值共同决定PWM周期。CCRx寄存器的值则是决定着占空比。注意CCRx寄存器的值不能大于ARR寄存器的值。

三、PWM的工作模式

  • PWM模式1(向上计数)  :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件   
  • PWM模式2(向下计数)  :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件

四、PWM的配置过程

1、配置CCR1寄存器:捕获/比较值寄存器:设置比较值;
      计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平    

  • OC1REF=0 无效电平    
  • OC1REF=1 无效电平

2、配置TIMx_CCMR1寄存器:OC1M[2:0]位:用于设置PWM模式

  • 110:PWM模式1
  • 111:PWM模式2

3、配置CCER寄存器:CC1P位:输入/捕获1输出极性。

  •  0:高电平为有效电平     
  • 1:低电平为有效电平

4、配置CCER寄存器:CC1E位:输入/捕获1输出使能。

  • 0:关闭使能
  • 1:打开使能

5、输出电平信号

五、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)

思路:将LED3配置成呼吸灯。
1.MCU选型
本例程使用的为STM32L051C8T6型号
2.使能时钟

3.时钟配置


4.设置GPIO口

5.定时器配置
①定时器配置

  • 1.设置定时器时钟源为内部时钟源
  • 2设置定时器CH1为PWM模式
  • 3.设置分频系数及装载值
  • 4.配置PWM模式,由于led3为低电平点亮,所以CH Polarity设置为Low

PWM频率计算:
Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)      arr 是计数器值      psc 是预分频值

占空比:

  • duty circle = TIM2->CCR1 / arr(单位:%)
  • TIM2->CCR1  用户设定值

例如:定时器频率Tclk = 32Mhz  arr=499   psc=31     那么PWM频率就是320000/500/32=  2000Hz,即2KHz

arr=499,TIM2->CCR1=250     则pwm的占空比为50%,修改CCR1可以修改占空比,修改arr可以修改频率。

五、配置STM32CubeMX生成工程文件

6.点击GENERATE CODE生成工程文件

六、KEIL程序

1.相关函数:

初始化定时器函数,此函数初始化了在STM32CubeMX内设置的参数,系统已经处理好了,并已经添加在了main函数内;

MX_TIM2_Init();  //初始化定时器配置

使能TIM2的PWM输出,这个需要自行添加到main函数内,不然无法正常输出PWM信号;

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

在main函数中定义一个PWM占空比的变量

uint16_t pwmValue=0;   //PWM占空比  

在while中添加控制LED的代码;

	  while (pwmValue< 500)    //当计数值小于500,则进入后不停的向上累加
	  {
		  pwmValue++;
		  __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, pwmValue);    //修改比较值,修改占空比
//		  TIM2->CCR1 = pwmVal;    //寄存器配置方式,效果与上方相同
		  HAL_Delay(1);
	  }
	  while (pwmValue)        //当计数值大于500,则进入后不停的向下相减
	  {
		  pwmValue--;
		  __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, pwmValue);    //修改比较值,修改占空比
//		  TIM2->CCR1 = pwmVal;     //寄存器配置方式,效果与上方相同
		  HAL_Delay(1);
	  }
	  HAL_Delay(100);

2.编译文件,下载。即可,实现效果如下:

源工程文件代码下载:https://download.youkuaiyun.com/download/cheng_nnan/12338423

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值