基于ARM内核的智能手环(day6)

模拟量传感器

模拟量传感器可以提供连续的输出信号,通过测量和转换物理量的变化来获取相关信息。其中包括:

光照传感器

光照传感器常用于测量周围环境的光照强度。其特点包括:

  • 使用光敏电阻作为传感器元件。
  • 光敏电阻的阻值随着光照强度的增加而减小。
  • 通过测量电流或电压的变化来确定光照强度的大小。
空气质量传感器

空气质量传感器用于检测周围空气中的污染物浓度,常见的包括二氧化碳、甲醛、颗粒物等。其特点包括:

  • 可以测量多种污染物。
  • 测量原理多样,通常基于化学反应或光学原理。

image-20240407191114309

对应IO口 模拟输入

ADC(模数转换器)

ADC是模数转换器的简称,它负责将模拟信号转换为数字信号。常见的ADC转换方法之一是逐次逼近法。

逐次逼近法

逐次逼近法是一种常见的ADC转换方法,其工作原理如下:

  1. 初始化:首先,ADC将模拟输入信号的范围划分为若干个离散的电平。
  2. 比较:ADC将一个参考电平与输入信号进行比较。
  3. 调整:根据比较结果,ADC调整参考电平,使其更接近输入信号的值。
  4. 重复:反复执行比较和调整步骤,逐渐逼近输入信号的准确值。
  5. 完成:当参考电平与输入信号的差异足够小,ADC将得到一个近似于输入信号的数字输出值。

特点

  • 高精度:逐次逼近法可以提供较高的转换精度。
  • 适用性:适用于需要高精度且转换速度较慢的应用场景。
  • 复杂度:相对于其他转换方法,逐次逼近法的硬件和软件复杂度通常较高。

逐次逼近法是ADC中常用的一种转换方法,它通过不断调整参考电平来逼近输入信号的准确值,从而实现模拟信号到数字信号的转换。

查看技术参考手册:

image-20240407191451442

ADC特点:
  • 数据位数和寄存器对齐:12位ADC的转换结果会被放置在一个16位的寄存器中,右对齐表示高位填充0。
  • 单次和连续转换:ADC可以进行单次转换,即只进行一次模拟信号到数字信号的转换。也可以进行连续转换,即连续地进行多次转换。
  • 扫描和间断模式:ADC可以工作在扫描模式下,它可以按照事先定义好的顺序依次转换多个通道的模拟信号。间断模式下,ADC只进行单次转换。
  • 时钟频率限制:ADC的时钟频率不能超过14MHz,这个限制保证了转换的准确性和稳定性。
  • 通道数量:ADC具有18个通道,其中16个是外部通道,用于连接外部模拟信号源;另外2个是内部通道,用于测量芯片内部的参考电压等。

image-20240407191538166

光照传感器

  • 引脚连接:
    • 光照传感器的输出引脚(ILLU)连接到PA5引脚。
  • ADC通道:
    • 光照传感器的模拟输出信号通过ADC进行转换。
    • 连接到了ADC1或ADC2的IN5通道。

光照传感器和ADC配置步骤

  1. 配置PA5引脚为模拟输入模式

    Copy CodeExplain// 设置PA5引脚为模拟输入模式
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
  2. 配置ADC模式

    Copy CodeExplainADC_HandleTypeDef hadc;
    // 配置ADC参数
    hadc.Instance = ADC1; // 或者ADC2,根据实际情况选择
    hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
    hadc.Init.Resolution = ADC_RESOLUTION_12B;
    hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc.Init.ScanConvMode = ADC_SCAN_DISABLE; // 禁用扫描模式
    hadc.Init.ContinuousConvMode = DISABLE; // 选择单次转换模式
    hadc.Init.DiscontinuousConvMode = DISABLE; // 禁用间断模式
    hadc.Init.NbrOfConversion = 1; // 转换通道数量,此处为1
    hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发转换
    HAL_ADC_Init(&hadc);
    
  3. 执行ADC自校准

    Copy Code// 执行ADC自校准
    HAL_ADCEx_Calibration_Start(&hadc);
    

完整代码:

adc2.c

#include "ADC2.h"

void ADC2_Config()
{
	//PA5 ADC2 IN5
	//配置IO口 模拟输入
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;	

  GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//配置ADC2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
	//时钟最大不超过14MHZ
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72/6 12MHZ
	//配置模式
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件启动
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//独立模式
	ADC_InitStruct.ADC_NbrOfChannel = 1;//转换通道数目
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//单通道
	//初始化
	ADC_Init(ADC2,&ADC_InitStruct);
	
	//使能
	ADC_Cmd(ADC2,ENABLE);
	
	//校准
	//充值校准器
	ADC_ResetCalibration(ADC2);
	while(ADC_GetResetCalibrationStatus(ADC2) == 1)//等待重置成功
	{}
	//开始校准
	ADC_StartCalibration(ADC2);
	while(ADC_GetCalibrationStatus(ADC2) == 1)//等待校准成功
	{}
}

u16 illu;
u16 mq;
void ADC2_GetValue(void)
{
	//配置ADC通道
	ADC_RegularChannelConfig(ADC2,ADC_Channel_5,1,ADC_SampleTime_55Cycles5);
	
	//开始转换
	ADC_SoftwareStartConvCmd(ADC2,ENABLE);
	while(ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC) == 0)
	{}
	illu = ADC_GetConversionValue(ADC2);
		printf("illu=%d\r\n",illu);
		//配置ADC通道
	ADC_RegularChannelConfig(ADC2,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);
		//开始转换
	ADC_SoftwareStartConvCmd(ADC2,ENABLE);
		while(ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC) == 0)
	{}
	mq = ADC_GetConversionValue(ADC2);
		printf("mq=%d\r\n",mq);
}

adc2.h

#ifndef __ADC2_H
#define __ADC2_H

#include "main.h"

void ADC2_Config();
void ADC2_GetValue();

extern u16 mq;
extern u16 illu;

#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3D数据发布工具HOOPS Publish如何将3D模型转换成PDF格式?

在现代科技发展的推动下,3D技术在各个行业中扮演着越来越重要的角色。从工程设计到医疗保健,从建筑规划到教育培训,3D模型都成为了理解、沟通和展示复杂数据的主要工具。而将这些3D模型转换成PDF格式,能够使其更易于共享、存档和展…

让智能体像Excel易用还要多久?

2023年,国内AI产业迎来狂飙时代。大模型热潮推动AI智能体(AI Agent)发展,继ChatGPT成功后,OpenAI目标直指AI Agents。上半年,行业竞相扩大模型规模、提升参数和计算能力,抢占AI浪潮先机。然而&a…

单身女孩的心事26岁的我在寻找另一半微信脱单群

在繁华的都市中,有一个名叫小雅的26岁女孩,她每天穿梭在拥挤的人群中,过着看似平凡却充满期待的生活。小雅是一个性格开朗、独立自主的女孩,她有着稳定的工作和不错的收入,朋友们都羡慕她的生活。然而,小雅…

IP-GUARD内置用户系统同步飞书组织架构使用说明

一、功能简介 实现将飞书的通讯录组织架构同步到内置用户系统。 二、功能配置 2.1 飞书创建自建应用 在浏览器上打开飞书开放平台 https://open.feishu.cn ,登录管理员账号后点击开发 者后台 在开发者后台点击创建企业自建应用,填写自建应用程序名称以及描述,设置图标,点…

nestjs 全栈进阶--module

视频教程 10_模块Module1_哔哩哔哩_bilibili 1. 模块Module 在 Nest.js 中,Module 是框架的核心概念之一,用于组织和管理应用程序的不同部分,包括服务、控制器、中间件以及其他模块的导入。每个 Nest.js 应用程序至少有一个根模块&#xf…

【QT+QGIS跨平台编译】076:【libdxfrw跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libdxfrw介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、libdxfrw介绍 libdxfrw是一个用于读取和写入DXF(Drawing Exchange Format)文件的开源C++库。DXF是一种由AutoCAD开发的文件格式,用于存储CAD(计算机辅助设计)图形数据,它…

【代码随想录】哈希表

文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …

基于计算机视觉的交通信号违章检测系统(闯红灯违章检测)

Introduce: 该系统可以实时检测交通信号灯违规: 城市中越来越多的汽车会导致大量交通拥堵,这意味着如今在孟加拉国和世界各地,交通违规行为变得更加严重。这造成了严重的财产破坏和更多可能危及人民生命的事故。为了解决令人震惊的问题并防止这种深不可…

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置 SQLAlchemy官方文档地址实战的代码分享数据类型列约束配置自定义方法 SQLAlchemy官方文档地址 SQLAlchemy官方文档地址 实战的代码分享 Flask-SQLAlchemy框架为创建数据库的实例提供了一个基类…

Stirling PDF:免费PDF开源编辑工具

Git地址:https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF是一个基于spring-boot开发的开源项目,旨在提供一个功能强大的基于Docker的本地托管PDF操作工具。它使您能够对PDF文件进行多种操作,包括拆分、合并、转换、重新组织、…

git系列之--- git pull 和 git fetch理解与区别

标题一般远端仓库里有新的内容更新&#xff0c;当我们需要把新内容下载的时候&#xff0c;就使用到git pull或者git fetch命令 fetch 用法如下&#xff1a; git fetch <远程主机名> <远程分支名>:<本地分支名>例如从远程的origin仓库的master分支下载代码…

如何在 iPhone 15/14/13/12/11/XS/XR 上恢复误删除的短信?

无论你的iPhone功能多么强大&#xff0c;数据丢失的情况仍然时有发生&#xff0c;所以当你发现一些重要的消息有一天丢失了。别担心&#xff0c;让自己冷静下来&#xff0c;然后按照本页的方法轻松从 iPhone 中检索已删除的短信。 在这里&#xff0c;您需要奇客数据恢复iPhone…

2024-4-7 QT day1作业

myWidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\张谦\\Desktop\\pictrue\\qq.png"));//设…

网络——初识网络

在现如今&#xff0c;网络已经成了一种基础设施&#xff0c;大到国家&#xff0c;小到个人&#xff0c;网络已经充斥在我们每个人的身 边&#xff0c;如果一个人突然失去了网络&#xff0c;那么它的生活或多或少会出现一些不方便的地方&#xff0c;网络现在已 经伴随着我们的吃…

【Python-数据类型】

Python-数据类型 ■ 类型简介■ Number&#xff08;数字&#xff09;■ String&#xff08;字符串&#xff09;■ Python 转义字符■ Python 字符串运算符■ Python 字符串格式化■ Python三引号■ f-string ■ bool&#xff08;布尔类型&#xff09;■ List&#xff08;列表&a…

OSPF实例是什么?

OSPF实例是什么&#xff1f; **OSPF实例指的是一个OSPF路由进程&#xff0c;它是在一个设备上运行的单独的OSPF路由协议实体**。 在详细解释这个概念之前&#xff0c;需要了解OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff08;IGP&#x…

【pycharm报错】rror: Microsoft Visual C++ 14.0 or greater is required.

一、报错 二、下载vs 路径&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ 三、安装 四、安装成功并启动 重新安装chromadb成功

如何在 Node.js 中使用 bcrypt 对密码进行哈希处理

在网页开发领域中&#xff0c;安全性至关重要&#xff0c;特别是涉及到用户凭据如密码时。在网页开发中至关重要的一个安全程序是密码哈希处理。 密码哈希处理确保明文密码在数据库受到攻击时也难以被攻击者找到。但并非所有的哈希方法都是一样的&#xff0c;这就是 bcrypt 突…

实战webSocket压测(三)Jmeter真实接口联调

背景&#xff1a; 接口地址为&#xff1a;ws://sunlei.demo 接口说明&#xff1a;websocket接口&#xff0c;首次连接&#xff0c;通过Text请求设置开启标志&#xff0c;然后通过wav文件流传输&#xff0c;达到后端服务可以根据传输信息进行解析满足指定标准后&#xff0c;web…

【Linux】有关时间的命令(date、timedatectl)

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、data命令 1.介绍 2.常用参数 3.常用选项 二、timedatectl命令 1.介绍 2.常用子命令 一、data命令 1.介绍 date命令用于显示或设置系统的时间与日期&#xff0c;语法格式为&a…