文章目录
- 前言
- 一、ADC概念
- 二、光敏电阻的概念
- 1. 光敏电阻的工作原理
- 2. 光敏电阻的特性
- 3. 光敏电阻的应用
- 4. 光敏电阻的电路设计
- 5. 实际使用中的注意事项
- 总结
- 三、STM32Cubemx创建工程
- 四、proteus仿真电路图
- 五、代码编写
- 1. HAL_ADC_Start 函数
- 原型
- 参数
- 返回值
- 功能描述
- 示例
- 2. HAL_ADC_GetValue 函数
- 原型
- 参数
- 返回值
- 功能描述
- 总结
前言
本篇文章开始带大家学习如何使用proteus和STM32Cubemx来完成STM32的学习,第五节课我们来学习ADC光敏电阻采样实验。
proteus使用8.9版本。
STM32Cubemx使用6.3版本。
一、ADC概念
在STM32微控制器中,ADC(Analog-to-Digital Converter,模数转换器)是一个非常重要的外设,用于将模拟信号转换为数字信号,以便在微控制器内部进行处理。下面是对STM32中ADC概念的详细讲解:
-
ADC的基本原理
ADC的主要功能是将连续的模拟信号转换成离散的数字值。STM32的ADC通常使用逐次逼近寄存器(SAR,Successive Approximation Register)类型的ADC,这种类型的ADC在精度和转换速度之间有良好的平衡。 -
ADC的主要参数
分辨率:ADC的分辨率决定了其输出数字值的精度。例如,12位的ADC可以产生0到4095之间的数字值(2^12 = 4096)。
采样率:采样率表示每秒钟ADC可以进行多少次转换。较高的采样率可以更精细地捕捉快速变化的信号。
输入通道:STM32的ADC通常具有多个输入通道,可以通过选择不同的通道来测量不同的模拟信号。
参考电压(Vref):参考电压决定了ADC的量程。对于STM32,通常是3.3V或其他指定电压。 -
ADC的主要功能和特点
多通道支持:STM32的ADC通常支持多达16个或更多的输入通道,可以通过选择不同的通道来测量多个模拟信号。
扫描模式:在扫描模式下,ADC可以自动依次对多个通道进行转换。
连续转换模式:在连续转换模式下,ADC可以不断地对一个或多个通道进行转换。
触发源:ADC转换可以通过软件或硬件触发源(如定时器、外部事件等)来启动。
DMA支持:ADC可以与DMA(直接存储器访问)控制器配合使用,以提高数据传输效率,减少CPU负担。 -
使用ADC的基本步骤
初始化ADC外设:
配置ADC的分辨率、转换模式(单次或连续)、数据对齐方式等。
配置ADC的时钟源,以确保其工作在合适的频率范围内。
配置输入通道:
选择要使用的ADC输入通道,并配置相应的GPIO引脚为模拟模式。
启动ADC转换:
启动ADC转换,可以选择单次转换、连续转换或扫描模式。
使用软件或硬件触发源来启动转换。
读取转换结果:
等待转换完成,可以通过轮询、中断或DMA方式获取转换结果。
二、光敏电阻的概念
光敏电阻(Photocell),又称光电导管或光电导体,是一种具有光电导效应的电子元件。它的电阻值会随着入射光强度的变化而变化,通常用于感测光线强度。下面是关于光敏电阻的详细讲解:
1. 光敏电阻的工作原理
光敏电阻的核心材料通常是半导体材料(如硫化镉 CdS),当光子(光粒子)照射到光敏电阻表面时,半导体材料内部的电子会被激发,从而跃迁到导带中,形成自由电子和空穴对。这种电子跃迁会增加半导体材料的电导率(即降低电阻值)。因此,光敏电阻的电阻值随着入射光强度的增加而减小。
2. 光敏电阻的特性
- 光电导效应:光敏电阻对光强度敏感,其电阻值会随光强度变化。
- 非线性特性:光敏电阻的电阻值与入射光强度之间的关系通常是非线性的。
- 响应时间:光敏电阻的响应速度较慢,通常在几十毫秒到几百毫秒之间。
- 光谱响应:不同材料的光敏电阻对不同波长的光有不同的响应,常见的光敏电阻对可见光敏感。
3. 光敏电阻的应用
光敏电阻广泛应用于各种光感测和自动控制领域,包括但不限于:
- 光控开关:用于自动灯光控制,例如夜间自动开启的路灯。
- 亮度调节:用于显示器或屏幕的自动亮度调节。
- 光强测量:用于光强度测量仪器中。
- 安全报警:用于光线变化检测的安全系统中。
4. 光敏电阻的电路设计
光敏电阻通常与其他电阻元件组合,构成一个分压电路,以实现光强度到电压信号的转换。下面是一个简单的光敏电阻应用电路示例:
// 简单光敏电阻电路
//
// +Vcc
// |
// R
// |
// |--------------------> 输出电压 (Vout)
// |
// 光敏电阻
// |
// GND
// Vout = Vcc * (R / (R + 光敏电阻))
在这个电路中,输出电压 ( V_{out} ) 随着光敏电阻的电阻值变化。当入射光强度增加时,光敏电阻的电阻值减小,导致 ( V_{out} ) 增加;当入射光强度减小时,光敏电阻的电阻值增加,导致 ( V_{out} ) 减小。
5. 实际使用中的注意事项
- 温度影响:光敏电阻的特性会受到温度的影响,在设计电路时需要考虑温度补偿。
- 老化效应:长时间使用后,光敏电阻的特性可能会发生变化,应定期校准和更换。
- 线性范围:在设计电路时,应尽量工作在光敏电阻的线性响应范围内,以获得较好的线性度和精度。
总结
光敏电阻是一种常用的光感测元件,广泛应用于光控开关、亮度调节、光强测量等领域。通过合理的电路设计和使用,可以将光强度信号转换为电压信号,方便后续的处理和应用。在具体应用中,需要考虑光敏电阻的非线性特性、响应时间、温度影响等因素,以实现稳定和准确的光强度检测。
三、STM32Cubemx创建工程
在之前的串口工程中添加入ADC模块,这里的话实验PA1作为ADC的采样端口,并且设置一下采样的时间间隔。
四、proteus仿真电路图
输入LDR找到光敏电阻:
整体电路连接图:
五、代码编写
在STM32的HAL库中,HAL_ADC_Start
和 HAL_ADC_GetValue
是两个常用的ADC相关函数,用于启动ADC转换和获取转换结果。下面是对这两个函数的详细讲解。
1. HAL_ADC_Start 函数
HAL_ADC_Start
函数用于启动指定ADC的转换过程。
原型
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc);
参数
hadc
:指向 ADC 句柄的指针,这个句柄包含了ADC的配置和状态信息。
返回值
HAL_StatusTypeDef
:返回操作的状态,可以是以下值之一:HAL_OK
:操作成功。HAL_ERROR
:操作失败。HAL_BUSY
:ADC正在忙碌。HAL_TIMEOUT
:操作超时。
功能描述
HAL_ADC_Start
函数启动ADC的转换过程。该函数通常在单次转换模式或连续转换模式下使用。
示例
ADC_HandleTypeDef hadc1; // 假设已经初始化过
HAL_ADC_Start(&hadc1);
在上述示例中,我们启动了ADC1的转换过程。
2. HAL_ADC_GetValue 函数
HAL_ADC_GetValue
函数用于获取最近一次ADC转换的结果。
原型
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);
参数
hadc
:指向 ADC 句柄的指针。
返回值
uint32_t
:返回ADC转换结果,这是一个无符号32位整数,具体值取决于ADC的分辨率(如12位、10位或8位)。
功能描述
HAL_ADC_GetValue
函数用于获取最近一次ADC转换的结果。这个函数通常在转换完成后调用,可以通过轮询、中断或DMA方式来确定转换是否完成。
整体代码:
实验效果:
这里将采集道的光敏电阻数据通过串口打印出来:
总结
本篇文章就讲解到这里,大家有什么疑问都可以留言。
本篇文章代码和工程将放在微信公众号中。
回复 STM32仿真ADC
即可领取源码和工程。