在货物监控设备的研发工作中,如何驱动PT1206AC光敏二极管
Posted 瑞奇Ricky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在货物监控设备的研发工作中,如何驱动PT1206AC光敏二极管相关的知识,希望对你有一定的参考价值。
笔者最近在进行货物监控设备的研发工作。我们的货物监控设备具有光线感应功能。可以在货物运输的过程中避免被拆箱和被偷盗。很多物流运输企业都会遇到货物运到了,箱子还在,货物却丢失了的情况,或是货物中的东西被掉包了。
打开百度APP看高清图片
这会给物流企业造成不小的损失,尤其是对于一些价格昂贵的运输物品来说,更是如此。而光线感应功能可以监测货物在运输的过程中,货箱内的光线强弱。货物在没有被开箱的情况下,光线强度几乎为0,而货箱一旦被打开,光线进入货箱内,光线强度可能会立即变成50或100,这就可以确定货箱被打开了,货物监控设备就会发出警报提醒。可能小偷刚打开箱子,还没有偷拿货品,就已经被绳之以法了。
因此这一功能还是非常实用的。我们在进行产品这一功能的开发时,需要对PT1206AC光敏二极管进行驱动工作。为什么要使用PT1206AC光敏二极管呢?那是因为今年芯片短缺,所以光照传感器由光敏二极管替代以节约成本,保证供货稳定。相信很多产品研发人员都会进行相关的操作。以下为光敏二极管采集光照代码。
光敏二极管采用的是ADC的原理,所以使用光敏二极管进行光照强度测试,需要进行ADC初始化。
#include “lsens.h”
#include “delay.h”
//光照结构体
LsensInfo_t LsensInfo;
//初始化光敏传感器
void Lsens_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
//光敏二极管IO初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//ADC初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE ); //使能ADC2通道时钟
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,ENABLE);//ADC复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,DISABLE);//复位结束
ADC_DeInit(ADC2); //复位ADC2,将外设 ADC2的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式: 独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC2, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC2, ENABLE); //使能指定的ADC2
ADC_ResetCalibration(ADC2); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC2)); //等待复位校准结束
ADC_StartCalibration(ADC2); //开启AD校准
while(ADC_GetCalibrationStatus(ADC2)); //等待校准结束
}
//获得ADC2某个通道的值
//ch:通道值 0~16
//返回值:转换结果
u16 Get_ADC_Value()
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC2, LSENS_ADC_CHX, 1, ADC_SampleTime_239Cycles5 ); //ADC2,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC2, ENABLE); //使能指定的ADC2的软件转换启动功能
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC2); //返回最近一次ADC2规则组的转换结果
}
//读取Light Sens的值
//0~100:0,最暗;100,最亮
void Lsens_GetInfo(LsensInfo_t *LsensInfo)
{
u32 temp_val=0;
float adcx=0;
u8 t;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val+=Get_ADC_Value(); //读取ADC值
delay_ms(5);
}
temp_val/=LSENS_READ_TIMES;//得到平均值
printf("ADC_Val:%d\\r\\n",temp_val);
adcx = temp_val*(3.3/4096)*1000;
if(adcx<3) adcx=0;
printf("adcx=%.2fmv\\r\\n",adcx);
LsensInfo->result = adcx*2*4;
// if(temp_val>100)temp_val=100;
// LsensInfo->result = (u8)(temp_val);
}
以上是关于在货物监控设备的研发工作中,如何驱动PT1206AC光敏二极管的主要内容,如果未能解决你的问题,请参考以下文章
在货物监控设备研发的过程中,如何对MT MC MLT进行判定?