chongdongchen 发表于 2022-8-7 17:14

【CW32F003ExPx StartKit测评】+BH1750光照度传感器演示

非常幸运申请到【CW32F003ExPx StartKit】开发板,下面将应用一下BH1750传感器,将BH1750采样到的照度转化为亮度输出给LED,这过程中会使用到基本外设I2C(和BH1750通信)和PWM(控制LED亮度)。bh1750传感器有接近视觉灵敏度的光谱灵敏度特性,它支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%。
传感器模块如图所示:
https://upload.semidata.info/new.**.com/article/image/2021/03/31/606442e2a387a.jpg

演示效果:

chongdongchen 发表于 2022-8-7 17:17

二楼代码:/******************************************************************************/
/** \file main.c
**
** A detailed description is available at
** @link Sample Group Some description @endlink
**
**   - 2021-03-121.0xiebin First version for Device Driver Library of Module.
**
******************************************************************************/
/*******************************************************************************
*
* 代码许可和免责信息
* 武汉芯源半导体有限公司授予您使用所有编程代码示例的非专属的版权许可,您可以由此
* 生成根据您的特定需要而定制的相似功能。根据不能被排除的任何法定保证,武汉芯源半
* 导体有限公司及其程序开发商和供应商对程序或技术支持(如果有)不提供任何明示或暗
* 含的保证或条件,包括但不限于暗含的有关适销性、适用于某种特定用途和非侵权的保证
* 或条件。
* 无论何种情形,武汉芯源半导体有限公司及其程序开发商或供应商均不对下列各项负责,
* 即使被告知其发生的可能性时,也是如此:数据的丢失或损坏;直接的、特别的、附带的
* 或间接的损害,或任何后果性经济损害;或利润、业务、收入、商誉或预期可节省金额的
* 损失。
* 某些司法辖区不允许对直接的、附带的或后果性的损害有任何的排除或限制,因此某些或
* 全部上述排除或限制可能并不适用于您。
*
*******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "main.h"

/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/

#defineI2C_SCL_GPIO_PORT       CW_GPIOB
#defineI2C_SCL_GPIO_PIN      GPIO_PIN_4   //如果改动口线则GPIO初始化代码需要做同步修改
#defineI2C_SDA_GPIO_PORT       CW_GPIOB   
#defineI2C_SDA_GPIO_PIN      GPIO_PIN_3   //如果改动口线则GPIO初始化代码需要做同步修改

/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void GenerateTestSignal(void);

/******************************************************************************
* Local variable definitions ('static')                                    *
******************************************************************************/

/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/

typedef enum
{
    POWER_OFF_CMD        =        0x00,        //断电:无激活状态
    POWER_ON_CMD        =        0x01,        //通电:等待测量指令
    RESET_REGISTER        =        0x07,        //重置数字寄存器(在断电状态下不起作用)
    CONT_H_MODE                =        0x10,        //连续H分辨率模式:在11x分辨率下开始测量,测量时间120ms
    CONT_H_MODE2        =        0x11,        //连续H分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms
    CONT_L_MODE                =        0x13,        //连续L分辨率模式:在411分辨率下开始测量,测量时间16ms
    ONCE_H_MODE                =        0x20,        //一次高分辨率模式:在11x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
    ONCE_H_MODE2        =        0x21,        //一次高分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
    ONCE_L_MODE                =        0x23        //一次低分辨率模式:在411x分辨率下开始测量,测量时间16ms,测量后自动设置为断电模式
} BH1750_MODE;

void BH1750_Init(BH1750_MODE mode)
{
    uint8_t data;
    data = POWER_ON_CMD;    // 发送启动命令
    I2C_MasterSendDataToSlave(&data,1);
    data = mode;            // 设置分辨率模式
    I2C_MasterSendDataToSlave(&data,1);
}

uint16_t BH1750_Read(void)
{
    uint8_t data;
    I2C_MasterRecDataFromSlave(data,2);
    return ((uint16_t)data << 8 | data);
}

extern void delay1ms(uint32_t u32Cnt);

/**
******************************************************************************
** \briefMain function of project
**
** \return uint32_t return value, if needed
**
** This sample toggle GPIOA.00
**
******************************************************************************/
int32_t main(void)
{
ATIM_InitTypeDef ATIM_InitStruct;
ATIM_OCInitTypeDef ATIM_OCInitStruct;

/* System Clocks Configuration */
RCC_Configuration();

/* GPIO Configuration */
GPIO_Configuration();

/* NVIC Configuration */
//NVIC_Configuration();

LogInit();
printf("ATIM Initial...\n");

ATIM_InitStruct.BufferState = DISABLE;
ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK;
ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN;
ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;
ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;
ATIM_InitStruct.OverFlowMask = DISABLE;
ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV1; // 计数时钟8MHz
ATIM_InitStruct.ReloadValue = 8191;            // 溢出周期1.024ms
ATIM_InitStruct.RepetitionCounter = 0;
ATIM_InitStruct.UnderFlowMask = DISABLE;

ATIM_Init(&ATIM_InitStruct);

ATIM_OCInitStruct.BufferState = ENABLE;
ATIM_OCInitStruct.OCInterruptSelect = ATIM_OC_IT_UP_COUNTER;
ATIM_OCInitStruct.OCInterruptState = ENABLE;
ATIM_OCInitStruct.OCMode = ATIM_OCMODE_PWM1;
ATIM_OCInitStruct.OCPolarity = ATIM_OCPOLARITY_NONINVERT;
ATIM_OC2BInit(&ATIM_OCInitStruct);

//ATIM_ITConfig(ATIM_CR_IT_OVE, ENABLE);
//ATIM_CH2Config(ATIM_CHxB_CIE, ENABLE);
ATIM_SetCompare2B(0);
ATIM_Cmd(ENABLE);
ATIM_CtrlPWMOutputs(ENABLE);
printf("ATIM is running.\n");

    //I2C初始化
        I2C_InitTypeDef I2C_InitStruct;
    I2C_InitStruct.I2C_BaudEn = ENABLE;
        I2C_InitStruct.I2C_Baud = 0x01;//500K=(8000000/(8*(1+1))
    I2C_InitStruct.I2C_FLT = DISABLE;
    I2C_InitStruct.I2C_AA = DISABLE;
   
    I2C_DeInit();
    I2C_Master_Init(&I2C_InitStruct);//初始化模块
    I2C_Cmd(ENABLE);//模块使能
   
    PA07_SETHIGH();
    PA07_SETLOW();
   
    while(1)
    {
      delay1ms(25);
      uint16_t Illuminance = BH1750_Read()*5/6;
      ATIM_SetCompare2B(Illuminance * 12);
      BH1750_Init(ONCE_L_MODE);
      
      static uint16_t cnt = 0;
      if(++cnt >= 40){
            cnt = 0;
            //PA07_TOG();
            printf("Illuminance = \n%d", Illuminance);
      }
    }
}

/**
* @briefConfigures the different system clocks.
* @paramNone
* @retval None
*/
void RCC_Configuration(void)
{
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
__RCC_ATIM_CLK_ENABLE();
__RCC_I2C_CLK_ENABLE();
}

/**
* @briefConfigure the GPIO Pins.
* @paramNone
* @retval None
*/
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

__RCC_GPIOA_CLK_ENABLE();
__RCC_GPIOB_CLK_ENABLE();
   
    //PA6
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = GPIO_PIN_6;

    PA06_AFx_ATIMCH2B();
    GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
   
    //set output
    GPIO_InitStruct.Pins = GPIO_PIN_0 | GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init( CW_GPIOA , &GPIO_InitStruct);
   
    //I2C
    PB03_AFx_I2CSDA();
    PB04_AFx_I2CSCL();
    GPIO_InitStruct.Pins = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_Init(I2C_SCL_GPIO_PORT, &GPIO_InitStruct);
}

/**
* @briefConfigure the nested vectored interrupt controller.
* @paramNone
* @retval None
*/
void NVIC_Configuration(void)
{
__disable_irq();
NVIC_EnableIRQ(ATIM_IRQn);
__enable_irq();
}

/******************************************************************************
* EOF (not truncated)
******************************************************************************/
#ifdefUSE_FULL_ASSERT
/**
* @briefReports the name of the source file and the source line number
*         where the assert_param error has occurred.
* @paramfile: pointer to the source file name
* @paramline: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
   tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */



isseed 发表于 2022-10-11 21:14

bh1750的输入输出关系是什么   

jstgotodo 发表于 2022-10-11 21:28

BH1750的测量精度一般是多少?

kkzz 发表于 2022-10-11 21:47

如何用bh1750实现20万lux光照度测量

fentianyou 发表于 2022-10-11 22:18

BH1750FVI光照度模块 用什么代替 ?

selongli 发表于 2022-10-12 10:06

一般是多少量程范围传感器合适?

primojones 发表于 2022-11-1 11:13

光照传感器采集的光照度一般为多少?

chenci2013 发表于 2022-11-1 16:14

传感器bh1750fvi 在仿真软件中找不到?

belindagraham 发表于 2022-12-5 21:47

iic的接口,精度怎么样?            

modesty3jonah 发表于 2022-12-9 22:33

之前用过BH1750,感觉数值好大,不知道是否准确。

adolphcocker 发表于 2022-12-10 10:36

这个BH1750是否进行了标定?

maudlu 发表于 2022-12-15 10:10

BH1750准确性高吗?            

minzisc 发表于 2022-12-15 13:23

这个实现的是线性输出吗?            

cemaj 发表于 2022-12-15 14:22

如何使用光敏模块转换光照强度的            

Undshing 发表于 2022-12-26 12:05

bh1750感觉数值有点大啊

benjaminka 发表于 2023-1-6 12:54

这个可以实现对太阳的追踪吗?            

iyoum 发表于 2023-1-6 13:02

光敏电阻用过吗?            

everyrobin 发表于 2023-1-6 14:00

之间用过CW32F003ExPx采集过温度,效果不错。

fengm 发表于 2023-1-6 16:21

BH1750的性能怎么样            
页: [1] 2
查看完整版本: 【CW32F003ExPx StartKit测评】+BH1750光照度传感器演示