此紫外线检测模块采用氮化家基材料的肖特基光电二极管,具有高的响应度和低的暗电流,板载LM358放大器对光电二极管输出的微弱信号进行放大,所有元器件采用1%精度元器件制造。应用于紫外线测试仪,紫外线手表,户外运动设备,手机移动电话等。
一模块来源
模块实物展示:
资料下载链接:https://pan.baidu.com/s/1YuwoCsbiJPaYH-8TaHEwVg
资料提取码:8888
二 规格参数
工作电压:2.7-5V
工作电流:1mA
测量角度:130度
温飘:0.08%/℃
检测波长范围:240nm~370nm
输出方式: ADC
管脚数量:3 Pin
以上信息见厂家资料文件
三移植过程
我们的目标是将例程移植至CW32F030C8T6开发板上【能够测量紫外线强度】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
3.1查看资料
电路图中,SIG引脚是经过放大模拟电压后进行模拟信号输出,采集到模拟量后将其转换为电压,根据下图电压与紫外线强度对照表,则可得知紫外线强度。
3.2引脚选择
模块接线图
3.3移植至工程
移植步骤中的导入.c和.h文件与【CW32模块使用】DHT11温湿度传感器相同,只是将.c和.h文件更改为bsp_ultraviolet.c与bsp_ultraviolet.h。这里不再过多讲述,移植完成后面修改相关代码。
在文件bsp_ultraviolet.c中,编写如下代码。
/** Change Logs:* Date Author Notes* 2024-06-20 LCKFB-LP first version*/#include "bsp_ultraviolet.h"#include "stdio.h"/******************************************************************* 函 数 名 称:ULTRAVIOLET_GPIO_Init* 函 数 说 明:UV紫外线模块引脚初始化* 函 数 形 参:无* 函 数 返 回:无* 作 者:LC* 备 注:******************************************************************/void ULTRAVIOLET_GPIO_Init(void){RCC_ULTRAVIOLET_GPIO_ENABLE(); // 使能GPIO时钟RCC_ULTRAVIOLET_ADC_ENABLE(); // 使能ADC时钟ANALOG_GPIO_ENABLE(); // PA05设定为模拟输入/* ADC配置 */ADC_InitTypeDef ADC_InitStructure; // ADC初始化结构体ADC_WdtTypeDef ADC_WdtStructure; // ADC看门狗结构体ADC_SingleChTypeDef ADC_SingleChStructure; // ADC单通道转换结构体// 配置ADC初始化结构体ADC_InitStructure.ADC_OpMode = ADC_SingleChOneMode; //单通道单次转换模式ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4; // 时钟频率 = PCLK / 4 = 64MHz / 4 = 16MHzADC_InitStructure.ADC_SampleTime = ADC_SampTime5Clk; //5个ADC时钟周期ADC_InitStructure.ADC_VrefSel = ADC_Vref_VDDA; //VDDA参考电压ADC_InitStructure.ADC_InBufEn = ADC_BufDisable; //关闭跟随器ADC_InitStructure.ADC_TsEn = ADC_TsDisable; //关闭内置温度传感器ADC_InitStructure.ADC_DMAEn = ADC_DmaDisable; //不触发DMAADC_InitStructure.ADC_Align = ADC_AlignRight; //ADC转换结果右对齐ADC_InitStructure.ADC_AccEn = ADC_AccDisable; //转换结果累加不使能//ADC模拟看门狗通道初始化ADC_WdtInit(&ADC_WdtStructure);//配置单通道转换模式ADC_SingleChStructure.ADC_DiscardEn = ADC_DiscardNull; // 单通道ADC转换结果溢出保存ADC_SingleChStructure.ADC_Chmux = CHANNEL_ULTRAVIOLET_ADC; // 选择ADC转换通道,AIN5:PA05ADC_SingleChStructure.ADC_InitStruct = ADC_InitStructure; // ADC初始化结构体ADC_SingleChStructure.ADC_WdtStruct = ADC_WdtStructure; // ADC看门狗结构体ADC_SingleChOneModeCfg(&ADC_SingleChStructure); // 初始化配置ADC_Enable(); //ADC使能ADC_SoftwareStartConvCmd(ENABLE); //启动ADC转换}/*********************************************************** 函 数 名 称:ADC_GET* 函 数 功 能:读取一次ADC值* 传 入 参 数:无* 函 数 返 回:测量到的值* 作 者:LCKFB* 备 注:**********************************************************/uint32_t ADC_GET(void){ADC_SoftwareStartConvCmd(ENABLE); //启动ADC转换uint32_t adcValue = ADC_GetConversionValue(); // 获取数据return adcValue;}/******************************************************************* 函 数 名 称:Get_ADC_Value* 函 数 说 明:对ADC值进行平均值计算后输出* 函 数 形 参:num采集次数* 函 数 返 回:对应扫描的ADC值* 作 者:LC* 备 注:误差80mV左右******************************************************************/unsigned int Get_ADC_Value( void ){uint32_t Data = 0;for(int i = 0; i < SAMPLES; i++){Data += ADC_GET();}Data = Data / SAMPLES;return Data;}/******************************************************************* 函 数 名 称:Get_Ultraviolet_Intensity* 函 数 说 明:判断当前紫外线强度等级* 函 数 形 参:value=ADC读取的值* 函 数 返 回:0~11 紫外线强度等级由低到高,11最高* 作 者:LC* 备 注:无******************************************************************/char Get_Ultraviolet_Intensity(uint16_t value){char ret = 0;if( value < 227 )//紫外线强度0级{ret = 0;}if( value >= 227 && value < 318 )//紫外线强度1级{ret = 1;}if( value >= 318 && value < 408 )//紫外线强度2级{ret = 2;}if( value >= 408 && value < 503 )//紫外线强度3级{ret = 3;}if( value >= 503 && value < 606 )//紫外线强度4级{ret = 4;}if( value >= 606 && value < 696 )//紫外线强度5级{ret = 5;}if( value >= 696 && value < 795 )//紫外线强度6级{ret = 6;}if( value >= 795 && value < 881 )//紫外线强度7级{ret = 7;}if( value >= 881 && value < 976 )//紫外线强度8级{ret = 8;}if( value >= 976 && value < 1079 )//紫外线强度9级{ret = 9;}if( value >= 1079 && value < 1170 )//紫外线强度10级{ret = 10;}if( value >= 1170 )//紫外线强度11级{ret = 11;}return ret;}
在文件bsp_ultraviolet.h中,编写如下代码。
/** Change Logs:* Date Author Notes* 2024-06-20 LCKFB-LP first version*/#ifndef _BSP_ULTRAVIOLET_H_#define _BSP_ULTRAVIOLET_H_#include "board.h"#define RCC_ULTRAVIOLET_GPIO_ENABLE() __RCC_GPIOA_CLK_ENABLE()#define RCC_ULTRAVIOLET_ADC_ENABLE() __RCC_ADC_CLK_ENABLE()#define ANALOG_GPIO_ENABLE() PA05_ANALOG_ENABLE()#define CHANNEL_ULTRAVIOLET_ADC ADC_ExInputCH5//采样次数#define SAMPLES 30void ULTRAVIOLET_GPIO_Init(void);unsigned int Get_ADC_Value(void);char Get_Ultraviolet_Intensity(uint16_t value);#endif
四移植验证
在自己工程中的main主函数中,编写如下。
/** Change Logs:* Date Author Notes* 2024-06-20 LCKFB-LP first version*/#include "board.h"#include "stdio.h"#include "bsp_uart.h"#include "bsp_ultraviolet.h"int32_t main(void){uint16_t value = 0;board_init();uart1_init(115200U);ULTRAVIOLET_GPIO_Init();printf("IRtracking demo startrn");while(1){value = Get_ADC_Value();//串口显示紫外线强度printf("grade = %drn", Get_Ultraviolet_Intensity( value ) );delay_ms(1000);}}
移植现象:测量室内紫外线强度为0级。
模块移植成功案例代码:
链接:https://pan.baidu.com/s/1wmC7OwwJk2LB0tdP0Zx0GA?pwd=LCKF
提取码:LCKF
1955