单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

这篇具有很好参考价值的文章主要介绍了单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

光感芯片veml7700的使用

1、veml有7个寄存器,每个十六位,见图。
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用
00是config寄存器,
01 02 是中断设置的阈值
03是节能模式的设置
04 是得到的光的亮度值
05是得到的data of whole WHITE
06是中断设置值。
2、我们只测试得到光的亮度值,所以veml寄存器设置如下:
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

设置gain,integration time ,power save mode ,interrupt ,power on.
3、数据的换算:
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用
可以用代码中公式。
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用
4、代码

#include "gd32f30x.h"
#include "veml7700.h"
#include "i2c.h"
#include <stdio.h>

void veml7700_write(uint8_t reg_addr,uint8_t *p_buf)
{
#if I2C1_MODE == I2C1_MODE_SW
    swi2c_device_write_data(VEML_SLAVE_ADDR,&reg_addr,1,p_buf,2);
#endif
}

void veml7700_read(uint8_t reg_addr,uint8_t *p_buf)
{
#if I2C1_MODE == I2C1_MODE_SW
    swi2c_device_read_data(VEML_SLAVE_ADDR,&reg_addr,1,p_buf,2);
#endif
}

static int get_veml7700_default_value(uint16_t *default_value)
{
    uint8_t rx_data[2] = {0};
    veml7700_read(0x00,rx_data);
    *default_value = ((rx_data[1] << 8) | rx_data[0]);
    return 0;
}

static uint16_t veml7700_get_light_sensor_value(uint8_t command,uint16_t mask,uint8_t shift)
{
    uint8_t rx_data[2] = {0};
    uint16_t r_value = 0;

    veml7700_read(command,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    return (r_value & mask) >> shift;
}

static void veml7700_set_light_sensor_value(uint8_t value,uint8_t command,uint16_t mask,uint8_t shift)
{
    uint8_t rx_data[2] = {0};
    uint8_t tx_data[2] = {0};
    uint16_t r_value = 0;
    uint16_t tmp_value = 0;
    veml7700_read(command,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    tmp_value = r_value & ~(mask);
    tmp_value |= ((value << shift) & mask);

    tx_data[0] = tmp_value & 0xff;
    tx_data[1] = ((tmp_value >> 8) & 0xff); 
    veml7700_write(command,tx_data);
} 

static uint16_t get_power_enable()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_SD,ALS_SD_MASK,ALS_SD_SHIFT);
}

static void set_power_enable(int enable)
{
    return veml7700_set_light_sensor_value(enable,COMMAND_ALS_SD,ALS_SD_MASK,ALS_SD_SHIFT);
}

static uint16_t get_gain_value()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_GAIN,ALS_GAIN_MASK,ALS_GAIN_SHIFT);
}

static void set_gain_value(uint16_t gain)
{
    veml7700_set_light_sensor_value(gain,COMMAND_ALS_GAIN,ALS_GAIN_MASK,ALS_GAIN_SHIFT);
}

static uint16_t get_interrupt_enable()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_INT_EN,ALS_INT_EN_MASK,ALS_INT_EN_SHIFT);
}

static void set_interrupt_enable(uint16_t enable)
{
    veml7700_set_light_sensor_value(enable,COMMAND_ALS_INT_EN,ALS_INT_EN_MASK,ALS_INT_EN_SHIFT);
}

static int get_integration_time() 
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_IT,ALS_IT_MASK,ALS_IT_SHIFT);
   
}

static void set_integration_time(int time)
{
    veml7700_set_light_sensor_value(time,COMMAND_ALS_IT,ALS_IT_MASK,ALS_IT_SHIFT);
}

static int get_power_saving_mode() 
{
    return veml7700_get_light_sensor_value(COMMAND_PSM_EN,PSM_EN_MASK,PSM_EN_SHIFT);
}


static void set_power_saving_mode(int mode)
{
    veml7700_set_light_sensor_value(mode,COMMAND_PSM_EN,PSM_EN_MASK,PSM_EN_SHIFT);
}

static uint16_t get_als_reg_data()
{
    uint8_t rx_data[2] = {0};
    uint16_t r_value = 0;
 
    veml7700_read(COMMAND_ALS_DATA,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    return r_value;
}

static int normalize_resolution(int value)
{
    switch (get_gain_value())
    {

        case ALS_GAIN_X2:
        value /= 2.0;
        break;
        case ALS_GAIN_d4:
            value *= 4;
            break;
        case ALS_GAIN_d8:
            value *= 8;
            break;
        case ALS_GAIN_X1:
        default:break;
        
    }
    switch (get_integration_time()){

        case ALS_INTEGRATION_25ms:
            value *= 4;
            break;
        case ALS_INTEGRATION_50ms:
            value *= 2;
            break;
        case ALS_INTEGRATION_200ms:
            value /= 2.0;
            break;
        case ALS_INTEGRATION_400ms:
            value /= 4.0;
            break;
        case ALS_INTEGRATION_800ms:
            value /= 8.0;
            break;
        case ALS_INTEGRATION_100ms:
        default:break;
    }
    return value;    

} 

int get_lux_data(void)
{
    return normalize_resolution(get_als_reg_data() * 0.0576);
}

void veml7700_init(void)
{
    uint16_t default_value;
    get_veml7700_default_value(&default_value);
 
    if (default_value == 0x0001)
    {
        printf("Have Fined Veml7700!\r\n");
    }
    else
    {
        printf("Veml7700 not exsit %x\r\n",default_value);
        //return ;
    }

    set_power_enable(ALS_POWER_SHUTDOWN);
    printf("get_power_enable %d\r\n",get_power_enable());

    set_interrupt_enable(ALS_INTERRUPT_DISABLE);

    set_gain_value(ALS_GAIN_d8);
    printf("get_gain_value == %d\r\n",get_gain_value());

    set_integration_time(ALS_INTEGRATION_100ms);

    set_power_saving_mode(ALS_POWER_MODE_DISABLE);

    set_power_enable(ALS_POWER_ON);
}

.h 文件

	#ifndef __VEML_7700_H__
	#define __VEML_7700_H__
	
	#define ENABLE_VEML7700  1
	
	#define VEML_SLAVE_ADDR 0x20
	
	#define COMMAND_ALS_DEFAULT_VALUE       0x01  
	// Gain Register
	#define COMMAND_ALS_GAIN                0x00  
	#define ALS_GAIN_MASK                   0x1800  
	#define ALS_GAIN_SHIFT                  11  
	// ALS IT Register
	#define COMMAND_ALS_IT                  0x00  
	#define ALS_IT_MASK                     0x03C0  
	#define ALS_IT_SHIFT                    6  
	// ALS Persistence Register
	#define COMMAND_ALS_PER                 0x00  
	#define ALS_PER_MASK                    0x0030  
	#define ALS_PER_SHIFT                   4  
	// ALS INT EN Register
	#define COMMAND_ALS_INT_EN              0x00  
	#define ALS_INT_EN_MASK                 0x0002  
	#define ALS_INT_EN_SHIFT                1  
	// ALS SD Register
	#define COMMAND_ALS_SD                  0x00  
	 #define ALS_SD_MASK                     0x0001  
	#define ALS_SD_SHIFT                    0  
	// ALS Window High
	#define COMMAND_ALS_WH                  0x01  
	// ALS Window Low
	#define COMMAND_ALS_WL                  0x02  
	// ALS Power Save Mode
	#define COMMAND_PSM                     0x03  
	#define PSM_MASK                        0x0006  
	#define PSM_SHIFT                       1  
	// ALS Power Save Mode Enable
	#define COMMAND_PSM_EN                  0x03  
	#define PSM_EN_MASK                     0x0001  
	#define PSM_EN_SHIFT                    0  
	// ALS High Resolution Output Data
	#define COMMAND_ALS_DATA                0x04  
	//White Channel Output Data
	#define COMMAND_WHITE_DATA              0x05  
	// Interrupt Status
	#define COMMAND_ALS_IF_L                0x06  
	#define ALS_IF_L_MASK                   0x8000  
	#define ALS_IF_L_SHIFT                  15  
	#define COMMAND_ALS_IF_H                0x06  
	#define ALS_IF_H_MASK                   0x4000  
	#define ALS_IF_H_SHIFT                  14  
	
	#define ALS_GAIN_X1                      0x0  
	#define ALS_GAIN_X2                      0x1  
	#define ALS_GAIN_d8                      0x2  
	#define ALS_GAIN_d4                      0x3  
	
	#define ALS_INTEGRATION_25ms             0xC  
	#define ALS_INTEGRATION_50ms             0x8  
	#define ALS_INTEGRATION_100ms            0x0  
	#define ALS_INTEGRATION_200ms            0x1  
	#define ALS_INTEGRATION_400ms            0x2  
	#define ALS_INTEGRATION_800ms            0x3  
	
	#define ALS_PERSISTENCE_1                0x0  
	#define ALS_PERSISTENCE_2                0x1  
	#define ALS_PERSISTENCE_4                0x2  
	#define ALS_PERSISTENCE_8                0x3  
	
	#define ALS_POWER_MODE_1                 0x0  
	#define ALS_POWER_MODE_2                 0x1  
	#define ALS_POWER_MODE_3                 0x2  
	#define ALS_POWER_MODE_4                 0x3  
	
	#define ALS_POWER_MODE_ENABLE            0x1  
	#define ALS_POWER_MODE_DISABLE           0x0  
	
	#define ALS_INTERRUPT_ENABLE             0x1  
	#define ALS_INTERRUPT_DISABLE            0x0  
	
	#define ALS_POWER_ON                     0x0  
	#define ALS_POWER_SHUTDOWN               0x1  
	
	void veml7700_init(void);
	int get_lux_data(void);
	#endif

main函数调用,先调用init函数,然后在while循环中点用get_lux_data函数。
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用
5、打印以及现象:
单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用
6、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git文章来源地址https://www.toymoban.com/news/detail-442780.html

到了这里,关于单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32f303之rs485配置

            rs485是一种硬件通信接口,USART引脚的TTL电平通过SP485芯片转换为差分信号,+2V~+6V表示\\\"0\\\",- 6V~- 2V表示\\\"1\\\"。RS485有两线制和四线制两种接线,四线制是全双工通讯方式,本文采用两线制半双工通讯方式。

    2024年02月13日
    浏览(50)
  • GD32F303高级定时器输出互补PWM-开发笔记

    ◼ 总通道数:4; ◼ 计数器宽度:16位; ◼ 时钟源可选:内部时钟,内部触发,外部输入,外部触发; ◼ 多种计数模式:向上计数,向下计数和中央计数; ◼ 正交编码器接口:被用来追踪运动和分辨旋转方向和位置; ◼ 霍尔传感器接口:用来做三相电机控制; ◼ 可编程

    2024年02月09日
    浏览(62)
  • GD32F303基于USBD库的usb custom hid 双向通讯实现

    默认已经建立好需要移植的GD32F303空白工程 环境:keil   GD库版本: V2.1.4 通讯工具: 链接:https://pan.baidu.com/s/1Ukuy0u52C9ufPGz9QcHONA  提取码:d9rf 正文开始 USBD库植步骤: 找到GD官网的软件包 本文中用的是GD32F30x_Firmware_Library_V2.1.4 将FirmwareGD32F30x_usbd_library 文件夹全部拷贝至工程

    2023年04月09日
    浏览(44)
  • GD32F4单片机实现接收超时中断+DMA实现串口的不定长接收和DMA发送

    环形缓冲区+定时器超时中断的方式 优点 环形缓冲区可以接收多帧数据 数据帧超时间隔可以设置 缺点 设备任务比较繁重时,使用中断接收可能会丢失数据。尤其是在长时间关闭中断或者串口中断优先级不高时 频繁进出中断。在使用RTOS的系统中,每收到一个数据就会进行一

    2024年02月15日
    浏览(63)
  • 调试记录 单片机GD32F103C8T6(兆易创新) 程序烧写完成但是没有现象 (自己做的板子)

    CPU内核:ARM  Cortex-M3 CPU最大主频:108MHz 工作电压范围:2.6V~3.6V 程序存储容量:64KB 程序存储器类型:FLASH RAM, 总容量:20KB GPIO端口数量:37 最高主频可达108MHz, 资料链接:1473490296871.pdf (szlcsc.com) 1.  烧写最简单的 跑马灯程序,但是板子上的LED灯没有反应。 2.  检查单片机

    2024年02月06日
    浏览(46)
  • STM32F103RCT6

    STM32F103RCT6是一款由STMicroelectronics公司生产的基于ARM Cortex-M3内核的 32位微控制器。 它具有高性能、低功耗和广泛的应用领域。 包括ADC(模数转换器) DAC(数字模拟转换器) TIM(定时器) USART(串行通信接口) SPI(串行外设接口) I2C(串行总线接口) 支持多种通信协议 如

    2024年02月05日
    浏览(57)
  • STM32F103RCT6 介绍

    ==================================================================================== 2、 LQFP 封装结构 3、 LQFP封装结构 4、芯片资源介绍(很久以前,面试的时候有被别人问到过,还要介绍32 的时钟系统) 4.1 内核 ① 32-bits ARM Cortex-M3 CPU ② 72 Mhz 主频 ③ 256Kb to 512Kb flash(RCT6 是256Kb) 4.2 时钟系统

    2024年02月13日
    浏览(54)
  • 学STM32(STM32F103RCT6)

    第一章 了解STM32 为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实

    2023年04月09日
    浏览(50)
  • 【GD32单片机】GD32工程构建,快速上手GD32

    之前在学校接触最多的是STM32单片机,但出来工作后发现,GD32或MM32单片机却是经常能接触到的,虽然学习资料和生态没有STM32好,但基本芯片内外设资源却差不多,开发起来大同小异。 在开始构建工程之前需要去GD32的官网下载一些资料; 打开官网 https://www.gigadevice.com.cn/ 选

    2024年02月03日
    浏览(52)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包