资料下载
RGB_LED灯带_5050慢闪_datasheet
STM32控制LED灯带
根据上面的说明书可知,通过修改800KHz的PWM波形的占空比可以控制LED的颜色。
 假设现在有3颗串联起来的灯珠,如下图:
 
 

 如果U1/U2/U3需要显示红/绿/蓝色,根据说明书,需要从DIN发送0x00FF00_FF0000_0000FF(高位先发)。
假设现在U1/U2/U3需要的颜色为从DIN发送0x123456_789ABC_DEF0AA(高位先发),则我们需要从DIN输入如下脉冲:
 
从上面的PWM波形可以看出,PWM的频率一直都是800KHz(周期为1.25us),但是占空比一直在32%(T0)和68%(T1)两个值中变化。
 我们平时使用STM32的PWM输出时,都是设置一个占空比,在有需要的时候再修改占空比,但是这种方式并不能保证每个PWM波形后都更新一次占空比,那怎么办呢?
 这就需要使用到我们的HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);函数了。这个函数通过DMA的方式,指定某个定时器的某一通道,发送Length个PWM波形,每个PWM波形高电平的计数值(相当于占空比)存储在pData数组中,当然使用前需要初始化定时器以及相应的DMA外设。
TIM初始化
void Tim8PwmConfig(void)
{
	Tim8PwmHandle.TimHandleInit.Instance 				= TIM8;
	Tim8PwmHandle.TimHandleInit.Init.Prescaler	 		= 1;
	Tim8PwmHandle.TimHandleInit.Init.Period             = 105 - 1;        // PWM周期,105 * 800KHz = 84MHz
	Tim8PwmHandle.TimHandleInit.Init.RepetitionCounter 	= 0;    // 不需要重加载
	Tim8PwmHandle.TimHandleInit.Init.ClockDivision 		= 0;    // 定时器时钟不需要分频
	Tim8PwmHandle.TimHandleInit.Init.CounterMode  		= TIM_COUNTERMODE_UP;   // 向上计数
	Tim8PwmHandle.TimClkEnable 							= Tim8ClkEnable;        // 使能定时器时钟的函数指针
    Tim8PwmHandle.PwmChannel1.EnableFlag                = false;
	Tim8PwmHandle.PwmChannel2.EnableFlag 				= false;
	Tim8PwmHandle.PwmChannel4.EnableFlag 				= false;
	/** channel 3 使能 **/
	Tim8PwmHandle.PwmChannel3.EnableFlag 				= true;
	Tim8PwmHandle.PwmChannel3.GpioClkInit 				= Tim8Channel3ClkEnable;    // 通道1的GPIO时钟使能
	Tim8PwmHandle.PwmChannel3.GpioInit.Pin				= GPIO_PIN_15;
	Tim8PwmHandle.PwmChannel3.GpioInit.Mode				= GPIO_MODE_AF_PP;
	Tim8PwmHandle.PwmChannel3.GpioInit.Pull				= GPIO_PULLDOWN;
	Tim8PwmHandle.PwmChannel3.GpioInit.Speed			= GPIO_SPEED_FAST;
	Tim8PwmHandle.PwmChannel3.GpioInit.Alternate		= GPIO_AF3_TIM8;
	Tim8PwmHandle.PwmChannel3.GpioPort					= GPIOH;
	Tim8PwmHandle.PwmChannel3.OConfig.OCMode 			= TIM_OCMODE_PWM1;
	Tim8PwmHandle.PwmChannel3.OConfig.OCNPolarity		= TIM_OCNPOLARITY_HIGH;
	Tim8PwmHandle.PwmChannel3.OConfig.OCFastMode		= TIM_OCFAST_ENABLE;
	Tim8PwmHandle.PwmChannel3.OConfig.OCIdleState       = TIM_OCIDLESTATE_RESET;
	Tim8PwmHandle.PwmChannel3.OConfig.OCNIdleState      = TIM_OCNIDLESTATE_SET;
	Tim8PwmHandle.PwmChannel3.OConfig.Pulse				= 0;
	
	if(BspPwmHandleInit(&Tim8PwmHandle) != HAL_OK)
	{}  // todo
	Tim8DMAInit();
}
                


















