项目介绍
使用i.mx rt1021的环境光传感器实现对屏幕亮度进行调节。
使用官方IDE以及配置工具完成代码开发。
具体项目内容是使用底板中的 BH1730FVC-TR环境光传感器 来实时监测环境光亮度,并根据采样到的亮度值来设置背光的亮度。
版卡演示在视频33s处
设计思路
项目涉及到三个基本的外设:BH1730FVC-TR环境光传感器、ST7701s芯片的屏幕、背光。
所以可以将项目分为三个部分来验证(包含简单的硬件介绍以及踩坑):
屏幕亮度调节
常听到的背光调节方式包括DC调光与PWM调光:
- DC调光就是改变给背光的电压值,电压小功率低自然就暗。
- 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卡、旋钮、遥感、温度等等。然后希望能将核心板单独拿出来,自己画板重新设置底板,完成更多的项目开发。