STM32_7(ADC)
一、ADC
- ADC(Analog-Digital Converter)模拟-数字转换器
- ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
- 12位逐次逼近型ADC,1us转换时间
- 输入电压范围:0~3.3V,转换结果范围:0~4095
- 18个输入通道,可测量16个外部和2个内部信号源
- 规则组和注入组两个转换单元
- 模拟看门狗自动监测输入电压范围(有个需求,如果光线或温度高于或低于某个阈值,就会执行一些操作)
- STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
1. 逐次逼近型ADC

IN0~IN7,通过通道选择开关,选中一路,输入到比较器进行转换和比较。首先是一个电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁大小。 这个比较器有两个输入端,一个是待测电压,另一个是DAC电压输出端,DAC是数模转换器,给它一个数据,他就能输出数据对应的电压。一个是外部输入端的未知编码电压,一个是DAC输出的已知编码电压,他们同时输入电压比较器,进行大小判断。如果DAC输出的电压比较大,就调小DAC数据,如果DAC输出电压小,就增大DAC数据,直到DAC输出的电压和外部通道输入的电压近似相等,那么DAC输入的数据就是外部电压的编码数据。
2. STM32ADC框图

使用规则通道配合DMA就可以不用担心数据被覆盖。
EOC是规则组的完成信号,JEOC是注入组的完成信号,这两个信号都会再状态寄存器里置一个标志位,读取标志位就可以知道是否转换结束。
3. ADC基本结构图

4. 输入通道

5. 转换模式
① 单次转换,非扫描模式

比如序列1为通道2,之后就可以触发转换,ADC对通道2进行模数转换,过一定的时间后,转换完成,转换结果放在数据寄存器里,同时给EOC标志位置1。
② 连续转换,非扫描模式

连续转换与单次转换不同的是,它再一次转换结束后不会停止,而是立刻开始下一轮的转换,之后一直持续下去。
③ 单次转换,扫描模式

单次转换跟上面的单次转换非扫描模式大致一样,但是扫描模式就会用到菜单列表,可以连续对选中的位置进行转换,转换结果都放在数据寄存器里,但为了防止数据被覆盖,需要用到DMA及时把数据挪走,7个通道转换完成之后,产生EOC信号,转换结束。
④ 连续转换,扫描模式

6. 触发控制

7. 数据对齐
① 数据右对齐

② 数据左对齐

12位ADC,但数据寄存器有16位,就分为数据右对齐和左对齐。一般情况下是选择数据右对齐,数据左对齐会让误差变大,因为一位就是要乘2,进4位就是乘16,所以一般不用,除非就用简单的判断,把数据的高8位取出来,舍弃后4位精度。
8. 转换时间
- AD转换的步骤:采样,保持,量化,编码
- STM32 ADC的总转换时间为:TCONV = 采样时间 + 12.5个ADC周期
- 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期,TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
9. 校准
- ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
- 建议在每次上电后执行一次校准
- 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
10. 硬件电路
二、代码部分
1. 单通道配置代码
#include "Bsp_ADC.h"void Bsp_ADC_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 1.时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 2.ADC分频,ADC最大14M,接近来的时候是72M,所以要分频到14M以下GPIO_InitTypeDef GPIO_InitStructure; // 3.GPIO配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 4.配置规则组// ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 2, ADC_SampleTime_55Cycles5); // 相当于填充菜单列表方法ADC_InitTypeDef ADC_InitStructure; // 5.配置ADCADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据对齐ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 外部触发转换选择//ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 连续转换模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE); // 6.开启ADCADC_ResetCalibration(ADC1); // 7.校准ADCwhile (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);ADC_SoftwareStartConvCmd(ADC1, ENABLE); // ADC软件启动转换,因为开启了连续转换模式,所以只开启一次即可// 如果需要看门狗和中断,则需要额外配置(开启看门狗和中断配置)
}uint16_t ADC_GetValue(void)
{//ADC_SoftwareStartConvCmd(ADC1, ENABLE); // ADC软件启动转换//while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 等待ADC读取EOC标志位为1; 并且也不需要判断标志位了return ADC_GetConversionValue(ADC1); // 返回ADC1的值
}
2. 多通道配置代码
#include "Bsp_ADC.h"void Bsp_ADC_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 1.时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 2.ADC分频,ADC最大14M,接近来的时候是72M,所以要分频到14M以下GPIO_InitTypeDef GPIO_InitStructure; // 3.GPIO配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 4.配置规则组// ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 2, ADC_SampleTime_55Cycles5); // 相当于填充菜单列表方法ADC_InitTypeDef ADC_InitStructure; // 5.配置ADCADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据对齐ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 外部触发转换选择ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 连续转换模式// ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE); // 6.开启ADCADC_ResetCalibration(ADC1); // 7.校准ADCwhile (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);// ADC_SoftwareStartConvCmd(ADC1, ENABLE); // ADC软件启动转换,因为开启了连续转换模式,所以只开启一次即可// 如果需要看门狗和中断,则需要额外配置(开启看门狗和中断配置)
}/* 读取ADC的每个通道,在主程序里读取4次即可完成多通道 */
uint16_t ADC_GetValue(uint8_t ADC_Channel)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE); // ADC软件启动转换while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 等待ADC读取EOC标志位为1; 并且也不需要判断标志位了ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);return ADC_GetConversionValue(ADC1); // 返回ADC1的值
}相关文章:
STM32_7(ADC)
一、ADC ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间输入电压范围:0~3.3V,…...
Flink实战(11)-Exactly-Once语义之两阶段提交
0 大纲 [Apache Flink]2017年12月发布的1.4.0版本开始,为流计算引入里程碑特性:TwoPhaseCommitSinkFunction。它提取了两阶段提交协议的通用逻辑,使得通过Flink来构建端到端的Exactly-Once程序成为可能。同时支持: 数据源&#…...
日志技术logback
一,日志概括 二,日志技术的特点 三,日志技术的体系 三,入门 四,案例 package XinZheng;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Main58 {//1,创建一个Logger日志对象public static fi…...
linux(1)之build构建系统基础(一)
Linux(1)之buildroot构建系统(一) Author:Onceday Date:2023年11月12日 漫漫长路,才刚刚开始… 参考文档: The Yocto ProjectBuildroot - Making Embedded Linux Easy 文章目录 Linux(1)之buildroot构建系统(一)1. 概述1.1 如…...
25 Linux I2C 驱动
一、I2C简介 I2C老朋友了,在单片机里面也学过,现在再复习一下。I2C使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL…...
API 设计:使用 Node.js 和 Express.js 的综合教程
API(应用程序编程接口)设计涉及创建一个高效而强大的接口,允许不同的软件应用程序相互交互。 说明 本教程将指导您使用 Node.js 和 Express.js 作为核心技术来规划、设计和构建 API。但是,这些原则可以应用于任何语言或框架。我们…...
vite和webpack的区别和练习
Vite和Webpack都是现代化的前端构建工具,但它们之间存在一些区别: 构建性能:Vite使用ES Modules提高了构建性能,可以在构建时只构建需要的部分,而Webpack则需要在构建时处理整个应用程序。 开发体验:Vite具…...
Python与设计模式--装饰器模式
6-Python与设计模式–装饰器模式 一、快餐点餐系统 又提到了那个快餐点餐系统,不过今天我们只以其中的一个类作为主角:饮料类。 首先,回忆下饮料类: class Beverage():name ""price 0.0type "BEVERAGE"…...
flutter之graphic图表自定义tooltip
renderer graphic中tooltip的TooltipGuide类提供了renderer方法,接收三个参数Size类型,Offset类型,Map<int, Tuple>类型。可查到的文档是真的少,所以只能在源码中扒拉例子,做符合需求的修改。 官方github示例 …...
逆向扒cocosjs安卓包教程-破解加密的js源码
本文只适用于cocosjs引擎打包的游戏apk,针对此类apk进行源码级别的逆向破解,可直接逐个破解工程内的源码部分,让游戏逻辑大白于你的面前,你可以针对js源码进行二次开发。按照我的教程破解过程中遇到什么问题,欢迎留言。 目录 准备apk包 查找加密key 解密jsc文件 方案1…...
Kafka(一)
一:简介 解决高吞吐量项目的需求 是一款为大数据而生的消息中间件,具有百亿级tps的吞吐量,在数据采集、传输、存储的过程中发挥着作用 二:为什么要使用消息队列 一个普通访问量的接口和一个大并发的接口,它们背后的…...
【Amazon】安装卸载AWS CLI操作流程(Windows 、Linux系统)
AWS 命令行界面(AWS CLI)是用于管理 AWS 产品的统一工具。只需要下载和配置一个工具,您就可以使用命令行控制多个 AWS 产品并利用脚本来自动执行这些服务。 AWS CLI v2 提供了多项新功能,包括改进的安装程序、新的配置选项&#…...
Django同时连接多种数据库
我的使用场景需要同时连接达梦数据库和MYSQL数据库,有的功能需要查询达梦,有的功能则需要查询MYSQL。 第一步:在 Django 的 settings.py 文件中,配置多个数据库连接。你可以在 DATABASES 字典中添加多个数据库配置。每个数据库配置…...
【链表之练习题】
文章目录 翻转链表找到链表的中间节点返回倒数第k个节点合并两个有序链表判断链表是否回文注意 翻转链表 //反转链表//实质上是把每一个节点头插法,原本第一个节点变成最后一个节点public ListNode reverseList(){//链表为空if (head null){return null;}//链表只有一个节点if…...
情感对话机器人的任务体系
人类在处理对话中的情感时,需要先根据对话场景中的蛛丝马迹判断出对方的情感,继而根据对话的主题等信息思考自身用什么情感进行回复,最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发,情感对话机器人需要完成以下几…...
【笔记 Pytorch 08】深度学习模板 (未完)
文章目录 一、声明二、工程结构三、文件内容main.pymodel.pydataset.pyutils.py 四、问题汇总 一、声明 非常感谢这些资料的作者: 【参考1】、【PyTorch速成教程 (by Sung Kim)】 二、工程结构 ├── main.py:实现训练 (train) 、验证(validation)和…...
【如何学习Python自动化测试】—— Cookie 处理
前提 网络通信是当今社会最为普及和繁荣的技术之一,其承载了人们生活中瞬息万变的信息传递和交流。而作为网络通信的核心要素,网络协议、socket、cookie和session则是网络通信的灵魂。 一、网络协议 网络协议是计算机和网络设备之间相互通信的规则和标准…...
IOS+Appium+Python自动化全实战教程
由于公司的产品坐落于不同的平台,如ios、mac、Android、windows、web。因此每次有新需求的时候,开发结束后,留给测试的时间也不多。此外,一些新的功能实现,偶尔会影响其他的模块功能正常的使用。 网上的ios自动化方面的…...
华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法
华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法: 第一步:需要自备华硕6个底包工厂安装包(EDN.KIT.OFS.SWP.HDI.TLK)或者自己备份的iso/esd/wim等镜像恢复 支持系列: 灵耀系列原装系统 无畏系列原装系统 枪…...
SpringBoot整合Redis,redis连接池和RedisTemplate序列化
SpringBoot整合Redis 1、SpringBoot整合redis1.1 pom.xml1.2 application.yml1.3 配置类RedisConfig,实现RedisTemplate序列化1.4 代码测试 2、SpringBoot整合redis几个疑问?2.1、Redis 连接池讲解2.2、RedisTemplate和StringRedisTemplate 3、RedisTemp…...
GIS数据质检实战:手把手教你用Arcpy脚本修复CAD导入后的多边形尖锐角问题
GIS数据质检实战:用Arcpy脚本智能修复CAD导入后的多边形尖锐角问题 城市规划师小李最近遇到一个棘手问题——从AutoCAD导入到ArcGIS的用地规划图,在进行空间分析时频繁报错,面积计算结果也比预期小了15%。经过排查,他发现是CAD转换…...
阿里通义Z-Image-Turbo WebUI图像生成:快速体验AI绘画的魅力
阿里通义Z-Image-Turbo WebUI图像生成:快速体验AI绘画的魅力 1. 快速入门指南 1.1 一键启动WebUI服务 对于初次接触AI绘画的用户,Z-Image-Turbo WebUI提供了最简单的启动方式。只需在终端执行以下命令: bash scripts/start_app.sh这个脚本…...
大模型Computer Use能力训练全解析:从原理到实践
大模型Computer Use能力训练全解析:从原理到实践 引言 随着大语言模型(LLM)的快速发展,AI系统正从单纯的文本生成向更复杂的任务执行能力演进。其中,Computer Use(计算机使用)能力成为了大模型领域最受关注的研究方向之一。这种能力使AI能够像人类一样操作计算机——浏…...
华硕Z10PA-D8主板+E5-2696V4实战:手把手教你用IPMI远程安装ESXi 8.0(附BIOS设置避坑指南)
华硕Z10PA-D8主板与E5-2696V4实战:IPMI远程部署ESXi 8.0全流程解析 当企业级硬件遇上最新虚拟化平台,总有些隐藏的默契等待发掘。华硕Z10PA-D8这款基于C612芯片组的双路主板,搭配英特尔至强E5-2696V4处理器,至今仍在许多数据中心和…...
BilibiliDown:一站式B站视频下载解决方案,轻松保存你喜爱的内容
BilibiliDown:一站式B站视频下载解决方案,轻松保存你喜爱的内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitc…...
手机变身应急神器:如何用EtchDroid在电脑崩溃时制作启动盘
手机变身应急神器:如何用EtchDroid在电脑崩溃时制作启动盘 【免费下载链接】EtchDroid An application to write OS images to USB drives, on Android, no root required. 项目地址: https://gitcode.com/gh_mirrors/et/EtchDroid 深夜,你正在为…...
从零搭建 LNMP+WordPress:从环境部署到网站上线全流程教程
在搭建个人博客、企业官网时,LNMP(LinuxNginxMySQLPHP) 是业内最稳定、高效、轻量化的经典组合。不管是阿里云 ECS 云服务器,还是本地 CentOS 虚拟机,跟着这篇教程走,新手也能从 0 到 1 完成网站搭建&#…...
如何快速掌握LSLib:神界原罪与博德之门3文件处理的终极指南
如何快速掌握LSLib:神界原罪与博德之门3文件处理的终极指南 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib 想为《神界原罪》系列或《博德之门3》制作M…...
CTF Pwn新手必看:用ROPgadget找pop rdi地址的保姆级教程(附常见坑点)
CTF Pwn实战指南:ROPgadget高效定位pop rdi的五大核心技巧 引言:为什么pop rdi是ROP链的黄金钥匙 在x64架构的CTF Pwn挑战中,pop rdi这条看似简单的指令往往成为解题的关键转折点。不同于x86时代通过栈传递参数的简单粗暴,x64体系…...
烽火HG5143D光猫折腾实录:用Fiddler抓包+U盘拷贝,手把手教你拿到超级密码
烽火HG5143D光猫深度探索:从抓包分析到权限获取的完整实践 家里刚升级了电信宽带,配套的烽火HG5143D光猫却成了网络自由的第一道障碍。这款设备默认采用网关模式,让很多高级网络功能无法施展。经过几天的摸索,我发现了一套相对可靠…...
