大家好,我是杰哥编程
欢迎关注我的Gitee仓库
最近在做项目时需要stm32f103读取多路光敏电阻电压值,硬件采用1k电阻分压,软件采用HAL库+CubeMX方式采集ADC的通道数据,特来分享一下。
光敏电阻ADC采集+STM32CubeMx配置ADC多通道读取
本次项目使用stm32f103c8t6单片机、1KΩ蓝白可调电阻、5516光敏电阻、18650锂电池、ch340串口模块。
光敏电阻电路设计
光敏电阻原理
光敏电阻的工作原理是基于内光电效应. 在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。用于制造光敏电阻的材料主要是金属的硫化物、硒化物和碲化物等半导体。通常采用涂敷、喷涂、烧结等方法在绝缘衬底上制作很薄的光敏电阻体及梳状欧姆电极,接出引线,封装在具有透光镜的密封壳体内,以免受潮影响其灵敏度。入射光消失后,由光子激发产生的电子 空穴对将复合,光敏电阻的阻值也就恢复原值。在光敏电阻两端的金属电极加上电压,其中便有电流通过,受到一定波长的光线照射时,电流就会随光强的增大而变大,从而实现光电转换。光敏电阻没有极性,纯粹是一个电阻器件,使用时既可加直流电压,也加交流电压。半导体的导电能力取决于半导体导带内载流子数目的多少。
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器。主要用于光的测量、光的控制、和光电转换。光敏电阻器都制成薄片结构,以便能够吸收更多的光能。该类电阻器的特点是入射光越强,电阻值就越小,入射光越弱,电阻值就越大。
下图是其电路图形符号
简单来说
光敏电阻器是一种对光敏感的元件,它的电阻值能随着外界光照强弱(明暗)变化而变化.
光敏电阻器在电路中一般用字母“R”或“RL”、“RG”表示.
我使用的是5516光敏电阻,阻值会随着光照强度上升而下降.
电路设计原理
5516光敏电阻暗电阻几乎达到1MΩ,强光条件下只有几百Ω,
我们使用stm32f103c8t6的adc采集模拟数据,
gpio口可接受最大输入电压为3.3v,而电源电压为5v,
因此我们需要串联1K可调电阻进行限流分压,
否则光敏电阻电阻过低近似导通可能会损坏单片机。
为了适应环境的变化,我采用了可调电阻。
而且光敏电阻可能因为你放的不够平,会使接收到的模拟量大小不同
下图为我初期给光明电阻电压ADC采集大概画的草稿图
经过我的
全新23年最新款钛合金狗眼外壳iPhone15ProMax
机载手电筒测试得,
随着光照强度的上升,光敏电阻的阻值下降,
1K可调电阻分得的电压越高,与光照强度成正比,
且测试点位电压在stm32的ADC的安全电压范围内。
如:当我的
全新23年最新款钛合金狗眼外壳iPhone15ProMax
机载手电筒直射光敏电阻时,
此时光敏电阻阻值位3kΩ,adc电压测量点电压计算得1.25V。
当关闭我的
全新23年最新款钛合金狗眼外壳iPhone15ProMax
机载手电筒,让室内自然光照射时,
此时光敏电阻阻值位8kΩ,adc电压测量点电压计算得0.5V。
stm32会把adc采集数据3.3v分成对应的0-4096的整数值
程序设计编写
1 用CubeMX建立工程
这里采用的是常用的STM32F103C8T6芯片,选择外部高频时钟,SWD调试.
设置主时钟为72MHz,完成CubeMX工程配置。
配置ADC1,选择ADC通道3和通道6,独立模式、右对齐、取消规则转换.
2 编写单独读取ADC通道函数
建立sConfig结构体,选择不同通道实现单独读取
//ch(1-6Chnnal),times(读取次数)
uint32_t ADC_Get_Average(uint8_t ch,uint8_t times)
{
ADC_ChannelConfTypeDef sConfig; //通道初始化
uint32_t value_sum=0;
uint8_t i;
switch(ch) //选择ADC通道
{
case 0:sConfig.Channel = ADC_CHANNEL_0;break;
case 1:sConfig.Channel = ADC_CHANNEL_1;break;
case 2:sConfig.Channel = ADC_CHANNEL_2;break;
case 3:sConfig.Channel = ADC_CHANNEL_3;break;
case 4:sConfig.Channel = ADC_CHANNEL_4;break;
case 5:sConfig.Channel = ADC_CHANNEL_5;break;
case 6:sConfig.Channel = ADC_CHANNEL_6;break;
}
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; //采用周期239.5周期
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1,&sConfig);
for(i=0;i<times;i++)
{
HAL_ADC_Start(&hadc1); //启动转换
HAL_ADC_PollForConversion(&hadc1,30); //等待转化结束
value_sum += HAL_ADC_GetValue(&hadc1); //求和
HAL_ADC_Stop(&hadc1); //停止转换
}
return value_sum/times; //返回平均值
}
主程序代码
int lighVla_left = 0;//ad采集结果 1
int lighVla_up = 0;//ad采集结果
int lighVla_right = 0;//ad采集结果
int lighVla_down = 0;//ad采集结果
while (1)
{
lighVla_left = 1000*ADC_Get_Average(4,1)/4096;
//1000 - 1000*ADC_Get_Average(4,1)/4096; //读取ad值 转化为0-1000
lighVla_up = 1000*ADC_Get_Average(0,1)/4096;
//1000 - 1000*ADC_Get_Average(0,1)/4096; //读取ad值 转化为0-1000
lighVla_right = 1000*ADC_Get_Average(5,1)/4096;
//1000 - 1000*ADC_Get_Average(5,1)/4096; //读取ad值 转化为0-1000
lighVla_down = 1000*ADC_Get_Average(1,1)/4096;
//1000 - 1000*ADC_Get_Average(1,1)/4096; //读取ad值 转化为0-1000
}
如有问题欢迎各位指出!!!
产品实物图
stm32追光储能系统实物图
分压电阻电路实物图
光敏电阻连接实物图