基本原理是:通过调节PWM一个周期内的占空比来控制LED的亮度,通过改变一个周期中的高低电平所占比例,进而控制LED灯亮度强度。不仅适用于板载的LED小灯,也适用于台灯灯管。
如何使用PWM来控制小灯亮度,首先需要查看手册,找到具有定时器/PWM输出功能的引脚,如下的PF6。
之后在CubeMX里面查看时钟源:
配置相关的分频参数,PWM周期,占空比控制,自动重载等。
上面的90M/(900-1 + 1)/(99 + 1) = 1000Hz即 10ms的周期。其中99所在的Counter Period又成ARR。
占空比如何确定?得使用Pulse (16 bits value) 即49这个参数。Pulse/Period就是占空比。
查看生成的代码:
static void MX_TIM10_Init(void) { /* USER CODE BEGIN TIM10_Init 0 */ /* USER CODE END TIM10_Init 0 */ TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM10_Init 1 */ /* USER CODE END TIM10_Init 1 */ htim10.Instance = TIM10; htim10.Init.Prescaler = 900; htim10.Init.CounterMode = TIM_COUNTERMODE_UP; htim10.Init.Period = 99; htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim10) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim10) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM10_Init 2 */ /* USER CODE END TIM10_Init 2 */ HAL_TIM_MspPostInit(&htim10); }
初始化并启动TIM10:
MX_TIM10_Init(); HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ static uint8_t pulse = 0; static int8_t dir = 1; pulse += dir; if(pulse >= 100){ dir = -1; } if(pulse <=0) dir = 1; __HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse); /*修改占空比*/ HAL_Delay(1000); /* USER CODE BEGIN 3 */ }
台灯亮度变化: