【得捷“芯”体验】基于环境光传感器Vishay VEML4031X00的背光控制器(二)

一、代码实现

上一篇已经对Vishay环境光传感器VEML4031X00进行了基本原理介绍。

接下来将根据前面介绍的这些点来编程实现对VEML4031X00传感器的配置,然后读取传感器检测到的亮度值,并根据亮度值控制LED(模拟显示屏的背光)。

1、初始化I2C

设置I2C的通讯波特率为标准模式100kHz,这里主要是配置MCU主机的I2C外设,不涉及到对VEML4031X00传感器的操作。

void I2C_Init(void)

{

    /*

     * masterConfig.debugEnable = false;

     * masterConfig.ignoreAck = false;

     * masterConfig.pinConfig = kI2C_2PinOpenDrain;

     * masterConfig.baudRate_Bps = 100000U;

     * masterConfig.busIdleTimeout_ns = 0;

     * masterConfig.pinLowTimeout_ns = 0;

     * masterConfig.sdaGlitchFilterWidth_ns = 0;

     * masterConfig.sclGlitchFilterWidth_ns = 0;

     */

    I2C_MasterGetDefaultConfig(&masterConfig);

 

    /* Change the default baudrate configuration */

    masterConfig.baudRate_Bps = I2C_BAUDRATE;

 

    /* Initialize the I2C master peripheral */

    I2C_MasterInit(I2C_MASTER, &masterConfig, I2C_MASTER_CLOCK_FREQUENCY);    

}bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm

2、读取传感器ID CODE

前面讲到了VEML4031X00传感器的固定的ID code为0x0001,这个是传感器出厂时设置好的。如果读出来的ID CODE是对的,说明MCU与VEML4031X00传感器的通讯正常。可以进行下一步操作了。

    // Check device ID

    VEML_Read(CMD_DEV_ID_L, &data);

    if (data != 0x0001)

    {

        PRINTF("Decice ID is incorrect\r\n");

    }bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm

3、配置VEML4031X00

首先开启传感器,因为上电默认为shutdown模式,传感器不工作,需要启动,然后传感器才工作。其次,设置积分时间为100ms,积分时间约大,传感器的分辨率越高,最高可设置为0.0026lx/cnt。接着将gain设置为2X,最后设置为4/4P模式。

    // Read default data

    if (VEML_Read(CMD_ALS_CONF_0, &data) != 0)

    {

        PRINTF("Read data failed\r\n");

    }

    PRINTF("Read data:0x%x\r\n", data);

    // turn the sensor on

    data &= ~((1<<0)|(1<<15));

    // set integration time to 100ms

    data |= (ALS_IT_100MS<<4);

    // set gain to 2x

    data |= (ALS_GAIN_2X<<11);

    // set photodiode size to 4/4PD

data &= ~(1<<14);

PRINTF("Config:0x%x\r\n", data);

 

if (VEML_Write(CMD_ALS_CONF_0, &data) != 0)

{

    PRINTF("Write data failed\r\n");

}bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm

4、根据cnt(step)值控制LED

在while中循环读取ALS的step(cnt)值,然后乘以分辨率就得到了实际的亮度值,再通过亮度值去决定是否点亮LED。(TIPS:分辨率与配置的对应关系表可以查看官方的datasheet)

    while (1)

    {

        if (VEML_Read(CMD_ALS_DATA_L, &data) != 0)

        {

            PRINTF("Read ALS_DATA failed\r\n");

        }

        uint16_t alS = data * 0.0103;

        PRINTF("step:%d, ALS:%d\r\n", data, als);

        if (alt >200)

        {

            led_on();

        }

        else

        {

            led_off();

        }

        SysTick_DelayTicks(200);

    }  bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm

二、视频演示

视频演示

三、源代码

源代码是基于NXP FRDM-RW612开发板编写的代码,想移植到其它MCU平台其实也是非常容易的。

lpc_i2c_polling_b2b_master.doc (1.6 MB)

(下载后将doc后缀修改为zip,然后解压即可得到所有源代码)

四、总结

VEML4031X00传感器的使用并不复杂,寄存器也不多,大部分的内容还是很容易理解的,但是datasheet上有几个地方不太明白怎么用,比如IR的用处是什么呢?另外,还有中断是怎么用的呢,因为没有单独的中断引脚,还是得通过I2C去查询中断标志吗?那这个中断的意义在哪里呢?文档中对这些描述不是很多,不太理解,希望能够在datasheet中做简单的解释。不管怎么样,总的来说还是非常不错的,而且是车规级的,安全性没得说,建议在项目中使用。