2024年寒假练 - 用带调试器的i.MX RT1021开发板实现屏幕亮度调节
该项目使用了带调试器的i.MX RT1021开发板,实现了屏幕亮度调节的设计,它的主要功能为:环境光传感器读取外界亮度,依此更改屏幕亮度。
标签
i.MX RT1021
环境光传感器
2024寒假在家一起练
屏幕亮度调节
henry
更新2024-03-29
152

项目介绍

使用i.mx rt1021的环境光传感器实现对屏幕亮度进行调节。

使用官方IDE以及配置工具完成代码开发。


具体项目内容是使用底板中的 BH1730FVC-TR环境光传感器 来实时监测环境光亮度,并根据采样到的亮度值来设置背光的亮度。

版卡演示在视频33s处

设计思路

项目涉及到三个基本的外设:BH1730FVC-TR环境光传感器、ST7701s芯片的屏幕、背光。

所以可以将项目分为三个部分来验证(包含简单的硬件介绍以及踩坑):

屏幕亮度调节

常听到的背光调节方式包括DC调光与PWM调光:

  1. DC调光就是改变给背光的电压值,电压小功率低自然就暗。
  1. PWM调光并不改变瞬时功率,而是靠着背光的亮灭交替,以极高的亮灭速度来完成亮度调节。

本次板卡的拓展版包含一块1.8 寸 TFT 显示屏

所谓tft是一种液晶显示技术,是一种特殊类型的晶体管,称为薄膜晶体管,通过电压控制薄膜晶体管,将来自底部由led灯的光源,控制像素颜色。

所以改变led灯的亮度即可完成对屏幕亮度的调节。

查看屏幕规格书,我们可以看到

背光的电压固定,只能采用pwm进行调光。查看原理图

配置GPIO2_31为pwm功能,控制占空比就可以完成亮度控制。

使用配置工具:

这里踩了个坑,在默认勾选pwm后,虽然在Fault channel 0 disable mapping中已经去掉了所有选项Fault 0 1 2 3,但仍触发了这个Fault机制,Fault详细可参考https://www.wpgdadatong.com.cn/blog/detail/71987,还需要再底部Fault的表格中将Active level改为High才可。

也是在论坛查阅资料,一一比对后才排查出问题。

屏幕显示驱动

虽然理论上只控制背光即可完成项目需求(控制屏幕亮度)但显示为纯白色,所以还需要驱动屏幕显示色彩。

在屏幕资料中包含ST7735S_CTC177_initial.txt,屏幕通过SPI接口,与ST7735S芯片进行通讯,设置它的寄存器,就是对屏幕进行初始化,设置色彩、设置显示模式等等、它再通过设置内容来控制屏幕显示。

首先我们配置SPI接口

配置如下:

spi接口采用4线SPI,即时钟线(Clock),输入线(MISO),输出线(MOSI)和片选线(Chip Select),这里虽然设置了chip select PCS0,但对我们来说spi总线并没有使用其他外设,因此可以直接将其设置为GPIO output1选中即可。

然后就是通过sdk提供的spi接口,将初始化,仿照其他例子,实现LCD_WriteCommand、LCD_WriteData、delay_ms以及RES引脚的控制,来完成屏幕的初始化。

void LCD_WriteCommand(uint8_t data)
{
   lpspi_transfer_t xfer = {0};
GPIO_PinWrite(LCD_DC, LCD_DC_PIN, 0U);

xfer.txData = &data;
xfer.dataSize = 1;
xfer.configFlags =
  kLPSPI_MasterPcs0 | kLPSPI_MasterPcsContinuous;

LPSPI_MasterTransferBlocking(LPSPI4_PERIPHERAL, &xfer);
}

void LCD_WriteData(uint8_t data)
{
   lpspi_transfer_t xfer = {0};
GPIO_PinWrite(LCD_DC, LCD_DC_PIN, 1U);

xfer.txData = &data;
xfer.dataSize = 1;
xfer.configFlags =
  kLPSPI_MasterPcs0 | kLPSPI_MasterPcsContinuous;

LPSPI_MasterTransferBlocking(LPSPI4_PERIPHERAL, &xfer);
}

初始化完成后,简单的将屏幕刷新为全红色。

根据手册

我们找到数据写入方式

写入行坐标、列坐标,再开启ram读写功能,并在之后写入数据即可。

按照上述的格式,如下方式写入数据:

    LCD_WriteCommand(0x2A); // col addr
LCD_WriteData(0);
LCD_WriteData(0);
LCD_WriteData(0);
LCD_WriteData(132);

LCD_WriteCommand(0x2B); // raw addr
LCD_WriteData(0);
LCD_WriteData(0);
LCD_WriteData(0);
LCD_WriteData(162);

LCD_WriteCommand(0x2C); // act ram wr

for (int i = 0; i < 132 * 162; i ++) {
LCD_WriteData(buf0);
LCD_WriteData(buf1);
}

PS: 屏幕规格书上写的是128*160的屏幕,但我如果设置结束地址为128 160会有没有刷到的区域,可能显示模式是下面的GM='00',因为对项目无伤大雅,所以没有仔细纠结。


环境光传感器

板载的传感器是BH1730FVC-TR环境光传感器,为i2c接口,与spi接口的逻辑类似,也是与传感器进行通讯,设置其寄存器(包括增益,传感器内部的采样threshold等等)

自己查看手册编写实在复杂,再github上找到现成的这个传感器库,将他添加到工程,与spi部分一样,将接口替换即可。

https://github.com/mongoose-os-libs/bh1730.git

项目最终封装的接口包括

/*
* Create and return a BH1730 instance; `addr` is an I2C address of the BH1730
* sensor.
*/
bh1730_t *bh1730_init(int addr);

/*
* Return the ambient light level in lux, or -1 in case of a failure.
*/
float bh1730_read_lux(bh1730_t *d);

/*
* Free memory occupied by the BH1730 instance.
*/
void bh1730_free(bh1730_t *d);

初始化后,调用bh1730_read_lux读取lux值(亮度单位)即可。

图片展示


未来

本次项目逻辑比较简单,使用i2c spi pwm用来驱动对应外设基本就完成任务了,重点在于熟悉平台开发以及查看数据手册,学习这外设的基本原理。

拓展版还有许多许多外设没有被使用,以及这颗强大的1021芯片(最大可到500M),没有发挥出它的芯片优势,接下来就是先调通拓展版上的其他外设,包括sd卡、旋钮、遥感、温度等等。然后希望能将核心板单独拿出来,自己画板重新设置底板,完成更多的项目开发。


附件下载
src.7z
源代码
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号