[CW32F003系列] 【CW32F003ExPx StartKit测评】+BH1750光照度传感器演示

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


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

  30. /******************************************************************************
  31. * Local pre-processor symbols/macros ('#define')
  32. ******************************************************************************/

  33. #define  I2C_SCL_GPIO_PORT       CW_GPIOB
  34. #define  I2C_SCL_GPIO_PIN        GPIO_PIN_4   //如果改动口线则GPIO初始化代码需要做同步修改
  35. #define  I2C_SDA_GPIO_PORT       CW_GPIOB   
  36. #define  I2C_SDA_GPIO_PIN        GPIO_PIN_3   //如果改动口线则GPIO初始化代码需要做同步修改

  37. /******************************************************************************
  38. * Global variable definitions (declared in header file with 'extern')
  39. ******************************************************************************/

  40. /******************************************************************************
  41. * Local type definitions ('typedef')
  42. ******************************************************************************/

  43. /******************************************************************************
  44. * Local function prototypes ('static')
  45. ******************************************************************************/

  46. void RCC_Configuration(void);
  47. void GPIO_Configuration(void);
  48. void NVIC_Configuration(void);
  49. void GenerateTestSignal(void);

  50. /******************************************************************************
  51. * Local variable definitions ('static')                                      *
  52. ******************************************************************************/

  53. /******************************************************************************
  54. * Local pre-processor symbols/macros ('#define')
  55. ******************************************************************************/

  56. /*****************************************************************************
  57. * Function implementation - global ('extern') and local ('static')
  58. ******************************************************************************/

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

  71. void BH1750_Init(BH1750_MODE mode)
  72. {
  73.     uint8_t data;
  74.     data = POWER_ON_CMD;    // 发送启动命令
  75.     I2C_MasterSendDataToSlave(&data,1);
  76.     data = mode;            // 设置分辨率模式
  77.     I2C_MasterSendDataToSlave(&data,1);
  78. }

  79. uint16_t BH1750_Read(void)
  80. {
  81.     uint8_t data[2];
  82.     I2C_MasterRecDataFromSlave(data,2);
  83.     return ((uint16_t)data[0] << 8 | data[1]);
  84. }

  85. extern void delay1ms(uint32_t u32Cnt);

  86. /**
  87. ******************************************************************************
  88. ** \brief  Main function of project
  89. **
  90. ** \return uint32_t return value, if needed
  91. **
  92. ** This sample toggle GPIOA.00
  93. **
  94. ******************************************************************************/
  95. int32_t main(void)
  96. {
  97.   ATIM_InitTypeDef ATIM_InitStruct;
  98.   ATIM_OCInitTypeDef ATIM_OCInitStruct;

  99.   /* System Clocks Configuration */
  100.   RCC_Configuration();

  101.   /* GPIO Configuration */
  102.   GPIO_Configuration();

  103.   /* NVIC Configuration */
  104.   //NVIC_Configuration();

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

  107.   ATIM_InitStruct.BufferState = DISABLE;
  108.   ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK;
  109.   ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN;
  110.   ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;
  111.   ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;
  112.   ATIM_InitStruct.OverFlowMask = DISABLE;
  113.   ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV1; // 计数时钟8MHz
  114.   ATIM_InitStruct.ReloadValue = 8191;              // 溢出周期1.024ms
  115.   ATIM_InitStruct.RepetitionCounter = 0;
  116.   ATIM_InitStruct.UnderFlowMask = DISABLE;

  117.   ATIM_Init(&ATIM_InitStruct);

  118.   ATIM_OCInitStruct.BufferState = ENABLE;  
  119.   ATIM_OCInitStruct.OCInterruptSelect = ATIM_OC_IT_UP_COUNTER;
  120.   ATIM_OCInitStruct.OCInterruptState = ENABLE;
  121.   ATIM_OCInitStruct.OCMode = ATIM_OCMODE_PWM1;
  122.   ATIM_OCInitStruct.OCPolarity = ATIM_OCPOLARITY_NONINVERT;
  123.   ATIM_OC2BInit(&ATIM_OCInitStruct);

  124.   //ATIM_ITConfig(ATIM_CR_IT_OVE, ENABLE);
  125.   //ATIM_CH2Config(ATIM_CHxB_CIE, ENABLE);
  126.   ATIM_SetCompare2B(0);
  127.   ATIM_Cmd(ENABLE);
  128.   ATIM_CtrlPWMOutputs(ENABLE);
  129.   printf("ATIM is running.\n");

  130.     //I2C初始化
  131.         I2C_InitTypeDef I2C_InitStruct;
  132.     I2C_InitStruct.I2C_BaudEn = ENABLE;
  133.         I2C_InitStruct.I2C_Baud = 0x01;  //500K=(8000000/(8*(1+1))
  134.     I2C_InitStruct.I2C_FLT = DISABLE;
  135.     I2C_InitStruct.I2C_AA = DISABLE;
  136.    
  137.     I2C_DeInit();
  138.     I2C_Master_Init(&I2C_InitStruct);//初始化模块
  139.     I2C_Cmd(ENABLE);  //模块使能
  140.    
  141.     PA07_SETHIGH();
  142.     PA07_SETLOW();
  143.    
  144.     while(1)
  145.     {
  146.         delay1ms(25);
  147.         uint16_t Illuminance = BH1750_Read()*5/6;
  148.         ATIM_SetCompare2B(Illuminance * 12);
  149.         BH1750_Init(ONCE_L_MODE);
  150.         
  151.         static uint16_t cnt = 0;
  152.         if(++cnt >= 40){
  153.             cnt = 0;
  154.             //PA07_TOG();
  155.             printf("Illuminance = \n%d", Illuminance);
  156.         }
  157.     }
  158. }

  159. /**
  160.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Configures the different system clocks.
  161.   * @param  None
  162.   * @retval None
  163.   */
  164. void RCC_Configuration(void)
  165. {
  166.   RCC_HSI_Enable(RCC_HSIOSC_DIV6);
  167.   __RCC_ATIM_CLK_ENABLE();
  168.   __RCC_I2C_CLK_ENABLE();
  169. }

  170. /**
  171.   * @brief  Configure the GPIO Pins.
  172.   * @param  None
  173.   * @retval None
  174.   */
  175. void GPIO_Configuration(void)
  176. {
  177.     GPIO_InitTypeDef GPIO_InitStruct;

  178.   __RCC_GPIOA_CLK_ENABLE();
  179.   __RCC_GPIOB_CLK_ENABLE();
  180.    
  181.     //PA6
  182.     GPIO_InitStruct.IT = GPIO_IT_NONE;
  183.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  184.     GPIO_InitStruct.Pins = GPIO_PIN_6;

  185.     PA06_AFx_ATIMCH2B();
  186.     GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
  187.    
  188.     //set output
  189.     GPIO_InitStruct.Pins = GPIO_PIN_0 | GPIO_PIN_7;
  190.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  191.     GPIO_Init( CW_GPIOA , &GPIO_InitStruct);
  192.    
  193.     //I2C
  194.     PB03_AFx_I2CSDA();
  195.     PB04_AFx_I2CSCL();
  196.     GPIO_InitStruct.Pins = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN;
  197.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  198.     GPIO_Init(I2C_SCL_GPIO_PORT, &GPIO_InitStruct);
  199. }

  200. /**
  201.   * @brief  Configure the nested vectored interrupt controller.
  202.   * @param  None
  203.   * @retval None
  204.   */
  205. void NVIC_Configuration(void)
  206. {
  207.   __disable_irq();
  208.   NVIC_EnableIRQ(ATIM_IRQn);
  209.   __enable_irq();
  210. }

  211. /******************************************************************************
  212. * EOF (not truncated)
  213. ******************************************************************************/
  214. #ifdef  USE_FULL_ASSERT
  215. /**
  216.   * @brief  Reports the name of the source file and the source line number
  217.   *         where the assert_param error has occurred.
  218.   * @param  file: pointer to the source file name
  219.   * @param  line: assert_param error line source number
  220.   * @retval None
  221.   */
  222. void assert_failed(uint8_t *file, uint32_t line)
  223. {
  224.   /* USER CODE BEGIN 6 */
  225.   /* User can add his own implementation to report the file name and line number,
  226.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  227.   /* USER CODE END 6 */
  228. }
  229. #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的性能怎么样              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

1238

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部