前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >屏幕背光的PWM控制

屏幕背光的PWM控制

作者头像
用户1605515
发布2021-03-04 14:54:17
1.4K0
发布2021-03-04 14:54:17
举报
文章被收录于专栏:嵌入式程序猿嵌入式程序猿

1. 摘要

本文档主要用来介绍如何通过PWM控制屏幕背光,通过PWM占空比达到控制背光的目的

2. 准备工作

可正常运行的屏幕显示程序

屏幕背光调节范围20-100%,20k PWM频率

3. 实施

不管是采用那种GUI框架开发,我们一般都需要对屏幕背光做控制,背光的控制是通用的,例如我们在emwin工程和TouchGFX工程下,都是采用同一套背光可控制逻辑和代码,背光的最低亮度根据自己的实际应用做限制,例如我的工程是25%-100%背光可调节。以STM32H743控制800*480的显示屏为例,使用TIM2的一个通道产生PWM来控制屏幕背光。要清除TIM作为PWM运行的控制和几个计算以及寄存器的配置。

4. 代码实现

首先我们需要对外有一个初始化接口,有一个改变占空比的接口,

void BSP_BL_Init(void)

{

/* Compute the prescaler value to have TIM1 counter clock equal to 20000000 Hz */

uhPrescalerValue = (uint32_t)(SystemCoreClock / (2*20000000)) - 1;

TimHandle.Instance = TIMx;

TimHandle.Init.Prescaler = uhPrescalerValue;

TimHandle.Init.Period = PERIOD_VALUE;

TimHandle.Init.ClockDivision = 0;

TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;

TimHandle.Init.RepetitionCounter = 0;

if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)

{

/* Initialization Error */

Error_Handler();

}

/*##-2- Configure the PWM channels #########################################*/

/* Common configuration for all channels */

sConfig.OCMode = TIM_OCMODE_PWM1;

sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfig.OCFastMode = TIM_OCFAST_DISABLE;

sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;

sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;

sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;

/* Set the pulse value for channel 1 */

sConfig.Pulse = 0;//1000-1;//10;//PULSE1_VALUE;

if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)

{

/* Configuration Error */

Error_Handler();

}

if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)

{

/* PWM Generation Error */

Error_Handler();

}

}

初始化TIM外设的底层驱动,配置时钟,通道,周期等。并开启PWM

对外的占空比改变接口主要是用来刷新PWM的占空比,达到调节背光的目的,

void BSP_vLcdBlCtrl(uint32_t PulseValue)

{

if((PulseValue >= 10) && (PulseValue <= 1000))/**校验设置范围,**/

{

sConfig.Pulse = PulseValue;

}

else

{

sConfig.Pulse = 500;/**50%**/

}

if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)/**配置通道**/

{

/* Configuration Error */

Error_Handler();

}

HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_1);

if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)/**开启PWM***/

{

/* PWM Generation Error */

Error_Handler();

}

}

一般触摸屏我们固定周期没有触摸就会将背光调低,这时候屏幕会变暗,一旦有触摸,重新将背光调亮,

PWM也可以采用中断,这里没有采用中断,都可以实现。在三个项目上都是采用的这个背光控制逻辑和代码。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档