加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 1. 摘要
    • 2. 准备工作
    • 3. 实施
    • 4. 代码实现
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

屏幕背光的PWM控制

2021/02/24
221
阅读需 6 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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也可以采用中断,这里没有采用中断,都可以实现。在三个项目上都是采用的这个背光控制逻辑和代码。

相关推荐

电子产业图谱

分享嵌入式开发过程中的案例、心得、方案、调试等故事,涉及MCU底层驱动、Modbus通信、CAN通信、J1939通信协议栈、GUI,主要以NXP和ST的应用为例来讲解,项目开发中的点滴记录。陪你度过Bug的折腾,方案的修改,成长的喜悦等。我们一起在嵌入式的江湖闯荡,多年以后,当回忆起那段岁月,不因默默无闻而悔恨。