stm32下通过光敏电阻到底是如何获取光照度呢?
见图如下:RL1为光敏电阻,PC3为芯片引脚
光敏电阻RL1随着光照度变化而变化,是一个模拟量,电压Y也是一个模拟量,当电压通过PC3引脚输入到芯片时,会交给ADC,转换成一个数字量。所以ADC实际上转换的是电压。
我这里芯片内部ADC器件是12位的,也就是转换出来的数字用12bit位来存储。所以输出的数字范围为0-4096.
ADC输入电压范围的确定:当光照强度最强时,RL1电阻最小,小到可以忽约不计,此时输入电压是3.3v;当无光照时,RL1电阻无穷大,此时Y点电压为0,因此输入电压Y的范围位0-3.3V
如上图所示,输入电压为0时,输出也为0,输入为3.3时,输出为4096. 那如果输入的电压是Y,输出值(设为AD)是多少呢?将光敏电阻值随光照变化设为斜率不变的直线,得出如下公式:
3.3/4096 = Y/AD
AD值可以调用库函数HAL_ADC_GetValue获取,所以可以计算出Y值。(注意该库函数要在ADC转换完成去调用哦,一般是ADC中断中调用)
3.3/(RL1+4700) = Y/4700 (根据电流相等)
两个公式消去Y,可以得到RL1的阻值与AD值关系。
此时得到光敏电阻,那如何获取光照度呢?
一种方式是,使用电阻与光照强度之间的数学关系,通过公式计算出来。往往是非线性的,所以单片机计算速度会很慢;
第二种是通过电阻与光照强度之间建立一张表格,比如把光照强度1到1000lux对应的电阻值,两者之间建立一张表格(厂家提供),通过查表得到。
typedef struct
{
unsigned short ohm; //光敏电阻值
unsigned short lux; //流明
}PhotoRes_TypeDef;