这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度

共9条 1/1 1 跳转至

【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度

工程师
2025-05-18 17:58:33   被打赏 22 分(兑奖)     打赏

基本原理是:通过调节PWM一个周期内的占空比来控制LED的亮度,通过改变一个周期中的高低电平所占比例,进而控制LED灯亮度强度。不仅适用于板载的LED小灯,也适用于台灯灯管。

image.png


如何使用PWM来控制小灯亮度,首先需要查看手册,找到具有定时器/PWM输出功能的引脚,如下的PF6。

image.png

之后在CubeMX里面查看时钟源:


image.png

image.png


配置相关的分频参数,PWM周期,占空比控制,自动重载等。

image.png


上面的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 */
}

台灯亮度变化:

WeChat_20250518175446-ezgif.com-video-to-gif-converter.gif



院士
2025-05-18 21:46:19     打赏
2楼

谢谢分享。


高工
2025-05-25 10:16:12     打赏
3楼

PWM基频需要做到多少才不会有明显闪烁感?


专家
2025-05-26 09:16:37     打赏
4楼

谢谢分享!有了库函数,生成PWM这方便。


工程师
2025-05-26 10:36:37     打赏
5楼

__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse);    /*修改占空比*/  

你的htim10.Init.Period = 99; 

pulse刚好100时,写入进去,会不会报错。

     if(pulse >= 100){          dir = -1;      } 
    这段代码是否有改进的地方?



院士
2025-05-26 16:47:07     打赏
6楼

这连思路和学习步骤都提供了呀!

楼主 大爱



高工
2025-05-26 20:10:58     打赏
7楼

楼主:这个地方的描述 是不是有点问题【上面的90M/(900-1 + 1)/(99 + 1) = 1000Hz即 10ms的周期 】 这个配置时候 不应该是 899,999吗?


工程师
2025-05-27 09:51:48     打赏
8楼

详细的PWM配置过程, 感觉可以加上个PID控制, 可能会更好点. 


专家
2025-05-27 22:44:28     打赏
9楼

pwm控制,现在台灯经常有,楼主思路棒


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]