STM32呼吸灯(基于PWM脉冲宽度调制)

目录

 

 

一、PWM脉冲宽度调制

1、什么是PWM

 2、如何产生PWM信号

二、CubuMX配置定时器输出PWM

1、芯片选型(stm32f103c8t6)

2、时钟配置

3、配置定时器输出PWM

 4、导出工程

三、程序工程代码分析

1、TIM1_channel1初始化

2、中断回调函数实现呼吸灯

四、实验效果展示

五、总结

六、参考链接


一、PWM脉冲宽度调制

1、什么是PWM

        PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。

        PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。

PWM脉冲宽度调制示意图

    9c1f631663414ef585fe8956553b8dd1.png

 2、如何产生PWM信号

(1)可以直接通过芯片内部模块输出PWM信号,前提是这个I/O口要有集成模块,只需要简单几步操作即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。

(2)但是如果IC内部没有PWM功能模块,或者要求不是很高的话可以利用I/O口设置一些参数来输出PWM信号,因为PWM 信号其实就是一高一低的一系列电平组合在一起。具体方法是给I/O加一个定时器,对于你要求输出的PWM信号频率与你的定时器一致,用定时器中断来计数,但是这种方法一般不采用,除非对于精度、频率等要求不是很高可以这样实现。
 

二、CubuMX配置定时器输出PWM

1、芯片选型(stm32f103c8t6)

500323da1a214062887880674bc8fe4b.png

2、时钟配置

选择晶体/陶瓷晶振作为外部高速时钟(HSE)输入

35e0f3ddb37948118bc94a16bcbcdccf.png

系统时钟数配置

38c2bcdf031b477bb46d49214426d6aa.png

3、配置定时器输出PWM

配置PA8作为PWM输出IO口

a0cb8f1a783b4ccaa83eadf855ff2ab2.png

 4、导出工程

15d45cf98e424041a7c704e2222e4af6.png

三、程序工程代码分析

1、TIM1_channel1初始化

 MX_TIM1_Init();                        //定时器1初始化函数

6e3f88e1ac5a486b9bef065fd8b6ed74.png

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);                //开启tim1通道1计时器

只有开启了该定时器中断定时器才开始工作计数计时

2、中断回调函数实现呼吸灯

 __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1,i);            //PWM输出占空比设置函数

  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);				//开启tim1通道1计时器
   
  /* USER CODE END 2 */
	int i=0,flag=0;
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	
	 if(flag==0)			//0状态占空比按+10的步长逐渐增大
	 {
		 i+=10;
		 if(i>400)
			flag=1;
	 }
	 else				   //1状态占空比按-10的步长逐渐减小
	 {
		i-=10;
		if(i<5)
			flag=0;
	 }
	 /*PAB2总线时钟为72Mhz,经过72分频后为1Mhz,计数周期RCC为65535
	  __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1,i);	    //设置该PWM输出占空比为变量i
	 
    /* USER CODE BEGIN 3 */
  }

 工程代码文件传送门:工程代码

四、实验效果展示

PWM_LED

五、总结

        呼吸灯主要就是通过PWM脉冲宽度调制来改变IO输出电压来实现LED的亮度逐渐变化,PWM是一个很有用的东西,在以后工程设计中可能会经常遇得到或者用到它。所以希望后来的读者们都可以通过这个小实验去了解学习PWM。

六、参考链接

使用STM32输出PWM波形

PWM(脉冲宽度调制)信号原理

STM32CUBEMX_基于PWM的呼吸灯

猜你喜欢

转载自blog.csdn.net/qq_52791446/article/details/127576192