资料下载
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();
}