打印
[CW32F003系列]

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

[复制链接]
1651|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
非常幸运申请到【CW32F003ExPx StartKit】开发板,下面将应用一下BH1750传感器,将BH1750采样到的照度转化为亮度输出给LED,这过程中会使用到基本外设I2C(和BH1750通信)和PWM(控制LED亮度)。bh1750传感器有接近视觉灵敏度的光谱灵敏度特性,它支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%。
传感器模块如图所示:


演示效果:

使用特权

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

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

#define  I2C_SCL_GPIO_PORT       CW_GPIOB
#define  I2C_SCL_GPIO_PIN        GPIO_PIN_4   //如果改动口线则GPIO初始化代码需要做同步修改
#define  I2C_SDA_GPIO_PORT       CW_GPIOB   
#define  I2C_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[2];
    I2C_MasterRecDataFromSlave(data,2);
    return ((uint16_t)data[0] << 8 | data[1]);
}

extern void delay1ms(uint32_t u32Cnt);

/**
******************************************************************************
** \brief  Main 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);
        }
    }
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Configures the different system clocks.
  * @param  None
  * @retval None
  */
void RCC_Configuration(void)
{
  RCC_HSI_Enable(RCC_HSIOSC_DIV6);
  __RCC_ATIM_CLK_ENABLE();
  __RCC_I2C_CLK_ENABLE();
}

/**
  * @brief  Configure the GPIO Pins.
  * @param  None
  * @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);
}

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

/******************************************************************************
* EOF (not truncated)
******************************************************************************/
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: 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的测量精度一般是多少?

使用特权

评论回复
5
kkzz| | 2022-10-11 21:47 | 只看该作者
如何用bh1750实现20万lux光照度测量

使用特权

评论回复
6
fentianyou| | 2022-10-11 22:18 | 只看该作者
BH1750FVI光照度模块 用什么代替 ?

使用特权

评论回复
7
selongli| | 2022-10-12 10:06 | 只看该作者
一般是多少量程范围传感器合适?  

使用特权

评论回复
8
primojones| | 2022-11-1 11:13 | 只看该作者
光照传感器采集的光照度一般为多少?

使用特权

评论回复
9
chenci2013| | 2022-11-1 16:14 | 只看该作者
传感器bh1750fvi 在仿真软件中找不到?

使用特权

评论回复
10
belindagraham| | 2022-12-5 21:47 | 只看该作者
iic的接口,精度怎么样?              

使用特权

评论回复
11
modesty3jonah| | 2022-12-9 22:33 | 只看该作者
之前用过BH1750,感觉数值好大,不知道是否准确。

使用特权

评论回复
12
adolphcocker| | 2022-12-10 10:36 | 只看该作者
这个BH1750是否进行了标定?

使用特权

评论回复
13
maudlu| | 2022-12-15 10:10 | 只看该作者
BH1750准确性高吗?              

使用特权

评论回复
14
minzisc| | 2022-12-15 13:23 | 只看该作者
这个实现的是线性输出吗?              

使用特权

评论回复
15
cemaj| | 2022-12-15 14:22 | 只看该作者
如何使用光敏模块转换光照强度的              

使用特权

评论回复
16
Undshing| | 2022-12-26 12:05 | 只看该作者
bh1750感觉数值有点大啊

使用特权

评论回复
17
benjaminka| | 2023-1-6 12:54 | 只看该作者
这个可以实现对太阳的追踪吗?              

使用特权

评论回复
18
iyoum| | 2023-1-6 13:02 | 只看该作者
光敏电阻用过吗?              

使用特权

评论回复
19
everyrobin| | 2023-1-6 14:00 | 只看该作者
之间用过CW32F003ExPx采集过温度,效果不错。

使用特权

评论回复
20
fengm| | 2023-1-6 16:21 | 只看该作者
BH1750的性能怎么样              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

1231

帖子

10

粉丝