基本原理是:通过调节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 */
}台灯亮度变化:


 
					
				
 
			
			
			
						
			 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

