文章目录[隐藏]
发现很多人都使用光敏电阻,但只是用了AD读取了电压值,或者算出了电阻值,就发送给上位机或者服务器,美其名曰获取了光照度,但其原理并。。。。。。
图中的 LS1 就是光敏传感器,其实就是一个光敏二极管,周围环境越亮,电流越大,反之 电流越小,即可等效为一个电阻,环境越亮阻值越小,反之越大,从而通过读取 LIGHT_SENSOR 的电压,即可知道周围环境光线强弱。LIGHT_SENSOR 连接在 MCU 的 ADC3_IN6(ADC3 通 道 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_IN6(ADC3 通 道 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
暂无评论