STM32 proteus + STM32Cubemx仿真教程(第五课ADC光敏电阻采样教程)

文章目录

  • 前言
  • 一、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概念的详细讲解:

  1. ADC的基本原理
    ADC的主要功能是将连续的模拟信号转换成离散的数字值。STM32的ADC通常使用逐次逼近寄存器(SAR,Successive Approximation Register)类型的ADC,这种类型的ADC在精度和转换速度之间有良好的平衡。

  2. ADC的主要参数
    分辨率:ADC的分辨率决定了其输出数字值的精度。例如,12位的ADC可以产生0到4095之间的数字值(2^12 = 4096)。
    采样率:采样率表示每秒钟ADC可以进行多少次转换。较高的采样率可以更精细地捕捉快速变化的信号。
    输入通道:STM32的ADC通常具有多个输入通道,可以通过选择不同的通道来测量不同的模拟信号。
    参考电压(Vref):参考电压决定了ADC的量程。对于STM32,通常是3.3V或其他指定电压。

  3. ADC的主要功能和特点
    多通道支持:STM32的ADC通常支持多达16个或更多的输入通道,可以通过选择不同的通道来测量多个模拟信号。
    扫描模式:在扫描模式下,ADC可以自动依次对多个通道进行转换。
    连续转换模式:在连续转换模式下,ADC可以不断地对一个或多个通道进行转换。
    触发源:ADC转换可以通过软件或硬件触发源(如定时器、外部事件等)来启动。
    DMA支持:ADC可以与DMA(直接存储器访问)控制器配合使用,以提高数据传输效率,减少CPU负担。

  4. 使用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_StartHAL_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即可领取源码和工程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/353224.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM Cache 及 MMU 系列文章 1.3 -- 如何判断 L2 Cache 是否实现?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 CPU Configuration Register代码实现CPU Configuration Register 在 Armv9 架构中,我们可以通过arm 提供的自定义寄存器IMP_CPUCFR_EL1 来判断当前系统中是否实现了 L2 Cache, 如下所…

Chromium 开发指南2024 Mac篇-Xcode安装(二)

1.引言 在开始编译和开发 Chromium 之前,确保开发环境的正确配置是至关重要的。对于 Mac 用户来说,Xcode 是不可或缺的工具,因为它不仅提供了必需的编译器和工具链,还包含了与 macOS 系统深度整合的开发资源。在本系列指南的第一…

LeetCode | 2879.显示前三行

在 pandas 中,可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行,可以在 head() 方法中传入一个参数 n,读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…

嵌入式中间件_3.嵌入式中间件的一般架构

根据嵌入式中间件的不同类型和其应用对象的不同,其架构也有所不同,通常嵌入式中间件没有统一的架构,这里仅仅列举两种中间件架构。 1.消息中间件 1.1消息中间件原理架构 消息中间件是消息传输过程中保存消息的一种容器。它将消息从它的源中…

uniapp 自定义页面顶部导航栏

效果图 1.移除原生导航栏 {"path": "pages/common/homePage/homePage","style": {"navigationBarTitleText": "","navigationStyle": "custom"} } 2.获取不同手机顶部自带 电量高度、信号、时间导航栏…

玩了两年黑苹果+两年MBP,macOS究竟好在哪?

注:本文仅为个人观点,仅供参考。 前言 今天比较无聊,小白突然盘点了一下自己使用macOS系统的点点滴滴,这也算是一个闲聊帖子吧。 首先,本帖子无任何广告行为,纯属唠嗑文。 声明一下,以防有小…

如何优雅地限制textarea的输入字数?

大家好&#xff0c;我是瑶山&#xff0c;今天聊聊textarea textarea 有基础的同学都知道<textarea>是HTML中的一个标签&#xff0c;用于定义多行的文本输入控件。它允许用户在表单中输入多行文本&#xff0c;相较于单行输入框可以输入更多的内容。 但是&#xff0c;如果…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后&#xff0c;网络层负责添加IP段&#xff0c;包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…

使用Minikube部署Kubernetes环境

使用Minikube部署Kubernetes环境 1. Minikube简介 Minikube是一个轻量级的Kubernetes实现&#xff0c;它在本地运行一个Kubernetes集群&#xff0c;可以是单节点或者集群环境&#xff0c;主要用于开发和测试。Minikube支持Kubernetes的所有主要功能&#xff0c;包括Dashboard…

淘宝镜像地址失效

1. 使用nvm安装node时候报错 报错内容 Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate has expired or is not yet valid:报错原因 淘宝镜像地址的证书过期了 解决 找到nvm安装的根目…

scratch3编程02-使用克隆来编写小游戏

目录 1&#xff0c;游戏效果 2&#xff0c;游戏代码块 1&#xff09;玩家 2&#xff09;障碍物 ​ 3&#xff09;箭头 ​ 4&#xff09;关卡图片 3&#xff0c;scratch文件 1&#xff0c;游戏效果 使用克隆 在这个游戏中&#xff1a; 程序开始&#xff1a;只要点击“…

统计学一(术语,正态)

目录 一&#xff0c;常用术语 二&#xff0c;正态分布&#xff08;Normal Distribution&#xff09; 三&#xff0c;中心极限定理(Central Limit Theorem) 一&#xff0c;常用术语 population(族群)&#xff1a;要统计的总的 populationSize(族群数量)&#xff1a;要统计的总…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题&#xff0c;有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集&#xff0c;本章节将介绍如何在Ardupilot上进行获…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

zerotier自建moon方法

简介 使用zerotier已经有一段时间了&#xff0c;现在偶尔会出现服务器连接不上的情况。我就想自己建个moon来试试。记录一下过程&#xff0c;用作备忘录。 准备工作 准备一个有公网IP的云主机。我用的是“三丰云”&#xff0c;速度很快同时提供"免费虚拟主机"和“免费…

商讯杂志商讯杂志社商讯编辑部2024年第10期目录

案例分享 基于胜任素质的干部选拔和梯队建设体系探讨——以A区卫生健康系统为例 康文雁; 1-4 “家庭五险一金”对居民商业保险购买存在挤出效应——基于江苏省徐州、淮安、泰州三市的实证研究 李炳毅; 5-8 人口老龄化背景下促进徐州市经济高质量发展的探究 李艳秋;…

java:spring actuator扩展原有info endpoint的功能

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437506 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

【热门开源项目推荐】满足不同程序员的需求与关注点

目录 前言一、热门开源项目介绍二、使用开源热门项目的优势&#xff08;一&#xff09;经济方面&#xff08;二&#xff09;技术方面&#xff08;三&#xff09;社区支持及协作方面 三、程序员选择项目模型建议&#xff08;一&#xff09;关键步骤&#xff08;二&#xff09;示…

后端开发中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…

【Spine学习12】之 事件帧

1、新建事件帧&#xff1a; 2、选择第8s的攻击帧&#xff0c;点击第一步新建的attack事件帧前面的钥匙 这样每次动作到8s的时候会自动跳出事件帧提示 这个文字实际动画不会显示 事件是动画过程中所发生情况的触发器。 给程序员识别的