1、模块介绍

LED模块我们使用的是HW_269这个型号的LED,其实使用任何一种型号的LED都是可以的。实现对LED亮度的控制,关键不在LED灯是什么样的,主要是让STM32单片机输出PWM波型,从而可以控制LED模块的亮暗程序。

2、管脚定义

  • Vcc: +5V电源供电

  • Date:数据管脚

  • Gnd: 接地

因为LED的亮暗控制需要使用到单片机定时器输出比较功能,因此模块的Date管脚需要与单片机的特定的几个管脚连接才行,并不是单片机所有的管脚都有输出比较功能

3、PWM介绍

PWM是脉冲宽度调制波形,是一种通过对模拟信号电平进行数字编码的方法。 PWM波通过调节方波的占空比来编码模拟信号的电平,占空比是指在一个周期内,高电平时间与总周期时间的比例。说白了PWM波其实就是一种波形。

图片1-nnxd.png

占空比指的就是一个单周期内高电平的持续时间,比如一个周期是1ms,高电平的持续时间为0.5ms,低电平的持续时间也为0.5ms。那么占空比就为50%。在一个周期内高电平持续的时间越长,占空比越大。一个周期内高电平持续时间越长,LED越亮。因此我们可以通过调节一个周期内的高电平时间,就可以控制LED灯的明暗程序。

图片2-kdpv.png

4、编程思路

STM32有8个定时器,分为基本定时器、通用定时器和高级定时器。定时器的主要功能就是用来定时,但是通用定时器和高级定时器还有一个功能就是输出比较功能,输出比较功能可以配置成PWM模式。当我们使用PWM模式的时候,就可以通过设置定时器的CCR寄存器的值来控制一个周期内高电平的持续时间。我们代码中是将定时器的计数时间配置成1us, TIM_Period参数ARR寄存器配置成了99。这样一个周期就为100us。然后通过动态的调整TIM_Pulse参数CCR寄存器的数值,就可以调整占空比的大小。 当计数器的值小于CCR寄存器的值时,管脚输出高电平。当大于CCR寄存器的值并小于ARR寄存器的99时。输出低电平。当计数器的值计数到99时,然后会重新从0开启计数。这样一个周期内的高低电平时间就确定下来。

图片3-axzx.png4、编程思路

4、驱动代码

#include "bsp_hw269.h"                  // Device header
 
void PWM_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3,ENABLE );
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
	
	GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin =GPIO_Pin_0 ;
	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz ;
	GPIO_Init (GPIOB,&GPIO_InitStruct);
	

	TIM_TimeBaseInitStruct.TIM_ClockDivision =TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period =100-1;  //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler =72-1;//PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter =0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	

	TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM1; 			//初始化TIM3 Channel3 PWM模式	
	TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse =50;      //CCR
	TIM_OC3Init(TIM3,&TIM_OCInitStruct);
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); 
	
	TIM_Cmd (TIM3,ENABLE );
	
}