STM32光敏传感器原理

文章目录[隐藏]

           发现很多人都使用光敏电阻,但只是用了AD读取了电压值,或者算出了电阻值,就发送给上位机或者服务器,美其名曰获取了光照度,但其原理并。。。。。。

              

 图中的 LS1 就是光敏传感器,其实就是一个光敏二极管,周围环境越亮,电流越大,反之 电流越小,即可等效为一个电阻,环境越亮阻值越小,反之越大,从而通过读取 LIGHT_SENSOR 的电压,即可知道周围环境光线强弱。LIGHT_SENSOR 连接在 MCU ADC3_IN6ADC3 通 道 6)上面,即 PF8 引脚。

R29的阻值是47K,阻值非常大.无光照时的电流称为暗电流(饱和反向漏电流很小),Vls1=3.3V.

有光照时的电流称为光电流(饱和反向漏电流很大),Vls1=3.3V-I*R29.

由此可得:光增强、I增大、Vls1减小。

//读取Light Sens的值
//0~100:0,最暗;100,最亮 
u8 Lsens_Get_Val(void)
{
    u32 temp_val=0;
    u8 t;
    for(t=0;t<LSENS_READ_TIMES;t++)
    {
        temp_val+=Get_Adc3(LSENS_ADC_CHX);    //读取ADC值
        delay_ms(5);
    }
    temp_val/=LSENS_READ_TIMES;//得到平均值 
    if(temp_val>4000)temp_val=4000;
    return (u8)(100-(temp_val/40));
}

temp_val的值:0~4000,光照值:0~100,比例是40:1

计算光敏电阻值

相信STM32的ADC读者应该会用,教程也一抓一大把,在此不表。接下来先计算电阻值。我的光敏电阻电路图如下:

 

其中PA6接单片机AD采集引脚,它最大只能输入3.6V电压,而光敏电阻的供电为5V,所以设计了R1与R2两个分压电阻,确保PA6的电压不超过3.6V。

设光敏电阻的阻值为xΩ,PA6的电压为y,可得以下公式:                     

y/1500=5/(x+2500)

STM32的ADC精度为12位,则最大值为4096。采集到的AD值与电压成线性对应关系,系统中最高的电压值为3.3V的电源电压,它与4096对应。假设PA6感受到的电压y对应的AD值为z,则:

y/z=3.3/4096

联立两式,消去y,得到关于x的表达式:

x=10240000/(1.1×z)-2500

使用ADC得到z以后,就可以根据上式算出光敏电阻的值了。我的代码使用了DMA获取多通道AD值,并且取100个数据求算数平均值滤波,然后打印电阻值的代码如下:

//main.c  main()
  while (1)
  {
    if(DMA_Flag)
    {
      for(int i=0;i<ADC_CHANNEL_CNT;i++)
        printf("CH%d value = %d \n",i+2,ADC1_AVG_Buf[i] );
      uint32_t PhotoResistor = (uint32_t)(10240000/(1.1*ADC1_AVG_Buf[4]) - 2500);
      //串口打印采样结果
      printf("The AD value is %d,the PhotoResistor is %d .\r\n",ADC1_AVG_Buf[4],PhotoResistor);
      printf("The DMA count is %d .\r\n",DMA_CNT);
      DMA_Flag = 0;
    }
  }
现象是能够打印出光敏电阻值。

详细讲解可关注此博主:geekYatao_yummy说电子_CSDN博客-电子设计,STM32,PCB系列教程领域博主

 

版权声明:本文为CSDN博主「龙龙吃饱了嘛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_50544950/article/details/121914346

           发现很多人都使用光敏电阻,但只是用了AD读取了电压值,或者算出了电阻值,就发送给上位机或者服务器,美其名曰获取了光照度,但其原理并。。。。。。

              

 图中的 LS1 就是光敏传感器,其实就是一个光敏二极管,周围环境越亮,电流越大,反之 电流越小,即可等效为一个电阻,环境越亮阻值越小,反之越大,从而通过读取 LIGHT_SENSOR 的电压,即可知道周围环境光线强弱。LIGHT_SENSOR 连接在 MCU ADC3_IN6ADC3 通 道 6)上面,即 PF8 引脚。

R29的阻值是47K,阻值非常大.无光照时的电流称为暗电流(饱和反向漏电流很小),Vls1=3.3V.

有光照时的电流称为光电流(饱和反向漏电流很大),Vls1=3.3V-I*R29.

由此可得:光增强、I增大、Vls1减小。

//读取Light Sens的值
//0~100:0,最暗;100,最亮 
u8 Lsens_Get_Val(void)
{
    u32 temp_val=0;
    u8 t;
    for(t=0;t<LSENS_READ_TIMES;t++)
    {
        temp_val+=Get_Adc3(LSENS_ADC_CHX);    //读取ADC值
        delay_ms(5);
    }
    temp_val/=LSENS_READ_TIMES;//得到平均值 
    if(temp_val>4000)temp_val=4000;
    return (u8)(100-(temp_val/40));
}

temp_val的值:0~4000,光照值:0~100,比例是40:1

计算光敏电阻值

相信STM32的ADC读者应该会用,教程也一抓一大把,在此不表。接下来先计算电阻值。我的光敏电阻电路图如下:

 

其中PA6接单片机AD采集引脚,它最大只能输入3.6V电压,而光敏电阻的供电为5V,所以设计了R1与R2两个分压电阻,确保PA6的电压不超过3.6V。

设光敏电阻的阻值为xΩ,PA6的电压为y,可得以下公式:                     

y/1500=5/(x+2500)

STM32的ADC精度为12位,则最大值为4096。采集到的AD值与电压成线性对应关系,系统中最高的电压值为3.3V的电源电压,它与4096对应。假设PA6感受到的电压y对应的AD值为z,则:

y/z=3.3/4096

联立两式,消去y,得到关于x的表达式:

x=10240000/(1.1×z)-2500

使用ADC得到z以后,就可以根据上式算出光敏电阻的值了。我的代码使用了DMA获取多通道AD值,并且取100个数据求算数平均值滤波,然后打印电阻值的代码如下:

//main.c  main()
  while (1)
  {
    if(DMA_Flag)
    {
      for(int i=0;i<ADC_CHANNEL_CNT;i++)
        printf("CH%d value = %d \n",i+2,ADC1_AVG_Buf[i] );
      uint32_t PhotoResistor = (uint32_t)(10240000/(1.1*ADC1_AVG_Buf[4]) - 2500);
      //串口打印采样结果
      printf("The AD value is %d,the PhotoResistor is %d .\r\n",ADC1_AVG_Buf[4],PhotoResistor);
      printf("The DMA count is %d .\r\n",DMA_CNT);
      DMA_Flag = 0;
    }
  }
现象是能够打印出光敏电阻值。

详细讲解可关注此博主:geekYatao_yummy说电子_CSDN博客-电子设计,STM32,PCB系列教程领域博主

 

版权声明:本文为CSDN博主「龙龙吃饱了嘛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_50544950/article/details/121914346

生成海报
点赞 0

龙龙吃饱了嘛

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F4最小系统硬件设计

对于硬件工程师来讲,想要入门STM32相关的开发,我想除了深入阅读一下STM32的数据手册外,最实用且有效的方法就是自己实际做一个STM32的最小系统板了。本文将以一个小的STM32F427VG的电路最