STM32---ADC

news2024/10/2 16:16:12

ADC

概念

众所周知,GPIO只能读入高电平或者低电平,那如果现有一个模拟量,该如何读取呢,比如电压的范围是0~3.3v,如何获取电压的值。就需要ADC(Analog-Digital Converter)了。ADC可以将引脚上连续变化的模拟电压转变为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。

stm32f103自带的是12位逐次逼近型ADC,1us转换时间,这样最多可以输出0-4095的数字量。

框图

请添加图片描述

蓝色框,表示ADC有18个数据来源通道:ADCx_IN0~15、和内部的温度传感器、Verfint。

绿色框,表示注入组最多可以同时转化4个(所谓同时,其实是依次)。规则组最多可以同时转化16个数据。

橙色框:需要注意的是,注入通道数据寄存器有4个,转化好的数据一人一个;而规则通道数据寄存器只有一个,16个转好的数据共用一个。

蓝色箭头:ADC转化的触发源可以如图选择:外部中断触发、TIM…触发、内部软件触发。

在这里插入图片描述

ADC转化模式和扫描模式

**单次转化 非扫描模式:**只转化一次,就停止转化;不管配置几个数据源,只转化第一个,发出EOC信号。

在这里插入图片描述

**单次转化 扫描模式:**只转化一次,就停止转化;配置多个数据源,会依次转化完,然后发出EOC信号。

在这里插入图片描述

**连续转化 非扫描模式:**本轮转化结束后自动开始下一轮;不管配置几个数据源,只转化第一个,发出EOC信号。

在这里插入图片描述

**连续转化 扫描模式:**本轮转化结束后自动开始下一轮:配置多个数据源,会依次转化完,然后发出EOC信号。

在这里插入图片描述

单通道模式

流程:

  1. 初始化GPIO 模拟输入模式
  2. 设置ADC时钟 RCC_ADCCLKConfig()
  3. 设置ADC ADC_Init()
  4. 设置规则组 ADC_RegularChannelConfig
  5. 使能ADC
  6. 校准(4个函数)
  7. 触发,开始转换

代码

void AD_Init()
{
    // PA0 引脚初始化
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    //ADC时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC内部时钟,PCLK2意为APB2总线时钟
    
    // 设置ADC ADC初始化
    ADC_DeInit(ADC1);  //复位ADC1 
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC独立模式
    ADC_InitStruct.ADC_ScanConvMode =DISABLE;//非扫描(因为只有一个通道,不需要扫描)
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//连续转化
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右对齐数据
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发 NONE
    ADC_InitStruct.ADC_NbrOfChannel = 1; //要配置几个通道,这里是一个
    ADC_Init(ADC1, &ADC_InitStruct);
    
    // 配置规则组 ADC1 通道0的优先级是1,采样时间1.5   如果是多个通道,就多次配置该函数
    ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5);
    ADC_Cmd(ADC1, ENABLE);

    // ADC校准
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));

    // ADC软件触发转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

//获取ADC转化后的原始数值
uint16_t AD_GetValue()
{
    // 获取ADC的EOC标志位,转换完成置SET
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    // 获取值,读ADC的DR寄存区,读完后,会自动降EOC置RESET
    return  ADC_GetConversionValue(ADC1);
}

注:RCC时钟不仅要开启GPIO和ADC的,还要配置ADC内部的时钟,这个时钟来自于APB2总线时钟。

多通道模式(手动,非DMA)

在这里插入图片描述

如上就可以被称为多通道,四个模拟量接入PA0-PA3,

这是我们设置扫描模式,使用ADC1CH0-CH3

请添加图片描述

这里的四个通道有数据后,都往DR寄存器中写数据,如果不适用DMA转存,就会被覆盖。当四个通道的数据都搬运完后,才会发出一个EOC信号。

因为本节不涉及DMA,因此推荐另一种手动方法,使用非连续非扫描模式。该模式下,依次转化一个通道的数据,然后停止。

在该模式下,每次我们读取值之前,都设置将要读取的通道设置,然后触发,等待EOC,读值。与单通道模式相似。

//轮流多次配置规则组已达到多通道效果
uint16_t AD_GetValue_CHS(uint8_t ADC_Channel)
{
    // 配置规则组 ADC1 通道0的优先级是1,采样时间1.5   如果是多个通道,就多次配置该函数
    ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_1Cycles5);
    // ADC软件触发转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    // 获取ADC的EOC标志位,转换完成置SET
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    // 获取值,读ADC的DR寄存区,读完后,会自动降EOC置RESET
    return  ADC_GetConversionValue(ADC1);
}

根据形参选择通道

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

童装WP模板

童装WP模板 https://www.wpniu.com/moban/6359.html

学习和认知的四个阶段,以及学习方法分享

本文分享学习的四个不同的阶段,以及分享个人的一些学习方法。 一、学习认知的四个阶段 我们在学习的过程中,总会经历这几个阶段: 第一阶段:不知道自己不知道; 第二阶段:知道自己不知道; 第三…

在 Python 中加速卫星时间合成的生成️

基于 fastnanquantile 库计算基于分位数的时间复合的更快方法 简要背景 为了从卫星图像创建时间合成图像,我们通常只获取云量低于特定阈值(例如 40%)的图像,遮盖云和云阴影,并随时间聚合图像。例如,如果我们一年中有 50 张图像(在云层覆盖限制内以及云/阴影遮罩之后),…

【经管数据-更新】华证ESG评级得分数据(2009-2023年)

一、数据说明 参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG 等级从低到高分别赋值为1至9 二、数据来源:世界银行&am…

Linux多线程之线程控制

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、pthread_crate 二、pthread_join 三、p…

diffusion model(十三):DiT技术小结

infopaperhttps://arxiv.org/abs/2212.09748githubhttps://github.com/facebookresearch/DiT/tree/main个人博客主页http://myhz0606.com/article/ditcreate date2024-03-08 阅读前需要具备以下前置知识: DDPM(扩散模型基本原理):知乎地址 个人博客地址…

英伟达jetson nano第一次进入镜像配置

我所用产品为jetbot Ubuntu18.04LTS CtrlAltT启动终端 设置分辨率 xrandr –output HDMI-0 –mode “1920x1080” 最好在设置中重新配置下 不然重启又得调 联网-更新语言包 reboot重启

【Tauri】(5):本地运行candle和 qwen 大模型,并测试速度

1,本地运行candle 关于candle项目 https://github.com/huggingface/candle Hugging Face 使用rust开发的高性能推理框架。 语法简单, 风格与 PyTorch 相似。 CPU 和 Cuda Backend:m1、f16、bf16。 支持 Serverless(CPU&#xff…

【二分】第十二届蓝桥杯省赛第一场C++ B组/C组《杨辉三角形》(c++)

【题目描述】 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1,1,1,1,2,1,1,3,3&…

Orange3数据预处理(转换器组件)

该组件接收数据,然后重新应用之前在模板数据上执行的转换。 这些转换包括选择变量的子集以及从数据中出现的其他变量计算新的变量, 例如,离散化、特征构建、主成分分析(PCA)等。 在Orange3中,描述的这个组件…

python爬虫(4)

#前期先说明一下为啥爬虫需要学习数组的存储和处理,只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果: 新的代码: import numpy as np im…

使用python翻转图片

原图 代码 from PIL import Imagedef flip_image(image_path):# 打开图片with Image.open(image_path) as img:# 获取图片的模式(RGB/RGBA/其他)mode img.mode# 创建一个新图片,模式与原图一样,大小为原图的翻转大小flipped_img…

【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

目录 🎄API介绍🌸ServerSocket API🌸Socket API 🍀TCP中的长短连接🌳建立TCP回显客户端与服务器🌸TCP搭建服务器🌸TCP搭建客户端 ⭕总结 TCP服务器与客户端的搭建需要借助以下API 🎄…

诚意满满之讲透事务

诚意满满系列每一篇都是精挑细选,从大众知识点到原理再到具体实现,争取把一个知识点从头到尾完整讲下来,足以应付面试与工作。让读者读完之后能够有一种:“这个知识我看这一篇就够了”的感觉是本系列最大愿望。 对于本人而言&…

Unity UGUI之InputField(TMP)基本了解

Unity的InputField组件是用于在Unity中创建可供用户输入文本的输入框的UI组件。通过InputField组件,可以让用户在运行时输入文本,比如用户名、密码、搜索关键字等。其中TMP版本的InputField是基于TextMeshPro的InputField组件,提供了更多的文…

数字建筑欢乐颂,智慧工地共筑美好未来!

在解决农民工人欠薪这一长期困扰建筑业的难题上,某建筑公司响应政策,严格按照实名制管理,实施过程中发现并克服了传统管理模式的痛点:聊天群组的信息时,往往会被淹没在“收到”回复中,影响沟通效率&#xf…

win10阿里云实现内网穿透#frp

win10&阿里云实现内网穿透#frp 文章目录 win10&阿里云实现内网穿透#frp一、什么是内网穿透?下载frp 二、云服务端部署frps三、本地部署frpc 一、什么是内网穿透? 内网穿透是一种网络技术,它允许外部网络用户通过互联网访问局域网&am…

【力扣白嫖日记】1193.每月交易I

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1193.每月交易I 表:Transactions 列名类型idintcountryvarcharstateenumamountinttrans_datedat…

MongoDB 可调节的一致性,其他数据库都不行系列 (白皮书 翻译)--1

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(…

初识C语言—初识C语言

前言 C语言全面了解,全貌认识 细致的学习,细枝末节 什么是C语言 维基百科 C 语言是一种通用的高级语言,最初是由丹尼斯里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 …