当前位置:   article > 正文

STM32输出PWM波形实现呼吸灯_c语言pwm呼吸灯

c语言pwm呼吸灯


写作目的

使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

实验平台:KEIL5、STMCubeMX。
实验器材:STM32103C8,LED灯两只。
实验语言:C语言


PWM基础

什么是PWM
PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

原理
PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

优点及应用
由于其控制简单、灵活和动态响应好等优点而成为电力电子技术应用最广泛的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。

PWM产生
STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:(其他定时器框图类似)
在这里插入图片描述

STM32配置

头文件配置

打开头文件路径(我的路径是:breathing\User\breathinglight\bsp_breathing.h),进行硬件的宏观定义.
在这里插入图片描述

#ifndef __PWM_BREATHING_H
#define	__PWM_BREATHING_H

#include "stm32f10x.h"

/*PWM±íÖеĵãÊý*/
extern uint16_t  POINT_NUM	;
//¿ØÖÆÊä³ö²¨ÐεÄƵÂÊ
extern __IO uint16_t period_class ;


#define RED_LIGHT 		1
#define GREEN_LIGHT 	2
#define BLUE_LIGHT		3

/*ҪʹÓÃʲôÑÕÉ«µÄºôÎüµÆ£¬¿ÉÑ¡RED_LIGHT¡¢GREEN_LIGHT¡¢BLUE_LIGHT*/
#define LIGHT_COLOR 	RED_LIGHT

/********************¶¨Ê±Æ÷ͨµÀ**************************/
#if  LIGHT_COLOR == RED_LIGHT
/************ºìµÆ***************/
	#define   BRE_TIMx                      TIM3

	#define   BRE_TIM_APBxClock_FUN        RCC_APB1PeriphClockCmd
	#define   BRE_TIM_CLK                   RCC_APB1Periph_TIM3
	#define   BRE_TIM_GPIO_APBxClock_FUN   RCC_APB2PeriphClockCmd
	#define   BRE_TIM_GPIO_CLK              (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)

	
	#define   BRE_GPIO_REMAP_FUN()						GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //ºìµÆµÄÒý½ÅÐèÒªÖØÓ³Éä				

	#define  BRE_TIM_LED_PORT               GPIOB
	#define  BRE_TIM_LED_PIN                GPIO_Pin_5

	#define  BRE_TIM_OCxInit                TIM_OC2Init            //ͨµÀÑ¡Ôñ£¬1~4
	#define  BRE_TIM_OCxPreloadConfig       TIM_OC2PreloadConfig 
	#define  BRE_CCRx                       CCR2

	#define   BRE_TIMx_IRQn                TIM3_IRQn              //¶¨Ê±Æ÷ÖжÏ
	#define   BRE_TIMx_IRQHandler          TIM3_IRQHandler

#elif LIGHT_COLOR == GREEN_LIGHT
/************Â̵Æ***************/
	#define   BRE_TIMx                      TIM3

	#define   BRE_TIM_APBxClock_FUN        RCC_APB1PeriphClockCmd
	#define   BRE_TIM_CLK                   RCC_APB1Periph_TIM3
	#define   BRE_TIM_GPIO_APBxClock_FUN   RCC_APB2PeriphClockCmd
	#define   BRE_TIM_GPIO_CLK              (RCC_APB2Periph_GPIOB)

	
	#define   BRE_GPIO_REMAP_FUN()				 //Â̵Ʋ»ÐèÒªÖØÓ³Éä


	#define  BRE_TIM_LED_PORT               GPIOB
	#define  BRE_TIM_LED_PIN                GPIO_Pin_0

	#define  BRE_TIM_OCxInit                TIM_OC3Init            //ͨµÀÑ¡Ôñ£¬1~4
	#define  BRE_TIM_OCxPreloadConfig       TIM_OC3PreloadConfig 
	#define  BRE_CCRx                       CCR3

	#define   BRE_TIMx_IRQn                TIM3_IRQn              //ÖжÏ
	#define   BRE_TIMx_IRQHandler          TIM3_IRQHandler

#elif LIGHT_COLOR == BLUE_LIGHT
/************À¶µÆ***************/
	#define   BRE_TIMx                      TIM3

	#define   BRE_TIM_APBxClock_FUN        RCC_APB1PeriphClockCmd
	#define   BRE_TIM_CLK                   RCC_APB1Periph_TIM3
	#define   BRE_TIM_GPIO_APBxClock_FUN   RCC_APB2PeriphClockCmd
	#define   BRE_TIM_GPIO_CLK              (RCC_APB2Periph_GPIOB)

	
	#define   BRE_GPIO_REMAP_FUN()	       //À¶µÆ²»ÐèÒªÖØÓ³Éä

	#define   BRE_TIM_LED_PORT             GPIOB
	#define   BRE_TIM_LED_PIN              GPIO_Pin_1

	#define   BRE_TIM_OCxInit              TIM_OC4Init            //¶¨Ê±Æ÷Êä³öͨµÀÑ¡Ôñ£¬1~4
	#define   BRE_TIM_OCxPreloadConfig    TIM_OC4PreloadConfig 
	#define   BRE_CCRx                      CCR4

	#define   BRE_TIMx_IRQn                TIM3_IRQn              //¶¨Ê±Æ÷ÖжÏ
	#define   BRE_TIMx_IRQHandler          TIM3_IRQHandler
	

#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

GPIO初始化

bsp_breathing.c 文件中
在这里插入图片描述
其中由于红灯使用的引脚需要用到第二功能,本代码使用宏 BRE_GPIO_REMAP_FUN ()进行了该引脚的功能重定义操作。

新建工程文件

在这里插入图片描述

KEIL查看项目

观察PWM波形

观察TIM3输出的波形,查表可知,TIM3在PA7,利用逻辑分析仪观察PA7,效果如下:
在这里插入图片描述

呼吸灯

定义一个变量,用来存储占空比:

uint16_t duty_num = 10;

  • 1
  • 2

在这里插入图片描述

初值设为10.

uint16_t duty_num = 10;

开始TIM2的通道2,输出PWM。
在main函数中添加代码

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

  • 1
  • 2

在这里插入图片描述
while函数中添加代码
在这里插入图片描述

编译运行并烧录,实现效果如下:
在这里插入图片描述


总结

本次实验让我学会了如何查看PWM波形,如何观察PWM波形,并利用它实现了呼吸灯的效果,在实现过程中,虽然很困难,不过好在查阅了许多资料也能解决,加深了我的印象。


参考:
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-pwm-huxideng
https://blog.csdn.net/qq_42992084/article/details/108547321?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/75965
推荐阅读
相关标签
  

闽ICP备14008679号