
LED灯模块
1、模块介绍
LED模块我们使用的是HW_269这个型号的LED,其实使用任何一种型号的LED都是可以的。实现对LED亮度的控制,关键不在LED灯是什么样的,主要是让STM32单片机输出PWM波型,从而可以控制LED模块的亮暗程序。
2、管脚定义
Vcc: +5V电源供电
Date:数据管脚
Gnd: 接地
因为LED的亮暗控制需要使用到单片机定时器输出比较功能,因此模块的Date管脚需要与单片机的特定的几个管脚连接才行,并不是单片机所有的管脚都有输出比较功能
3、PWM介绍
PWM是脉冲宽度调制波形,是一种通过对模拟信号电平进行数字编码的方法。 PWM波通过调节方波的占空比来编码模拟信号的电平,占空比是指在一个周期内,高电平时间与总周期时间的比例。说白了PWM波其实就是一种波形。
占空比指的就是一个单周期内高电平的持续时间,比如一个周期是1ms,高电平的持续时间为0.5ms,低电平的持续时间也为0.5ms。那么占空比就为50%。在一个周期内高电平持续的时间越长,占空比越大。一个周期内高电平持续时间越长,LED越亮。因此我们可以通过调节一个周期内的高电平时间,就可以控制LED灯的明暗程序。
4、编程思路
STM32有8个定时器,分为基本定时器、通用定时器和高级定时器。定时器的主要功能就是用来定时,但是通用定时器和高级定时器还有一个功能就是输出比较功能,输出比较功能可以配置成PWM模式。当我们使用PWM模式的时候,就可以通过设置定时器的CCR寄存器的值来控制一个周期内高电平的持续时间。我们代码中是将定时器的计数时间配置成1us, TIM_Period参数ARR寄存器配置成了99。这样一个周期就为100us。然后通过动态的调整TIM_Pulse参数CCR寄存器的数值,就可以调整占空比的大小。 当计数器的值小于CCR寄存器的值时,管脚输出高电平。当大于CCR寄存器的值并小于ARR寄存器的99时。输出低电平。当计数器的值计数到99时,然后会重新从0开启计数。这样一个周期内的高低电平时间就确定下来。
4、编程思路
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 );
}