STM32 ADC转换器

一、ADC简介

        ADC(Analog-Digital Converter,模拟-数字转换器),可以将引脚上连续变化的模拟量转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁

        模拟量:时间和幅值均连续的信号,例如:变换的电压、电流

        数字量:时间和幅值均离散的信号,例如:单片机中的0和1

        STM32的12位ADC是一种逐次逼近型模/数转换器。它多达18个通道,可测量16个外部和2个内部信号源。个通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐的方式存储在16位数据寄存器中

        STM32F103C8T6的ADC资源:ADC1、ADC2,10个外部输入通道

ADC术语:

        分辨率:满刻度电压与2ⁿ的比值,其中n位ADC的位数。例如:12位ADC能够分辨出满刻度1/2¹²(0.024%)的输入电压变化。一个10V满刻度的12位ADC能够分辨输入电压变化的最小值为2.4mV

        转换速率:ADC能够重复进行数据转换的速度,即每秒转换的次数

        绝对精度:在ADC中任何数码所对应的实际模拟电压与其理想的电压之差的最大值

        相对精度:把这个最大偏差表示为满刻度模拟电压的百分数

        线性度:ADC实际转移函数与理想直线的最大偏移

二、ADC结构

2.1 电压输入范围

ADC的输入范围:Vref- < VIN <Vref+

通常Vref+、Vref-和VDDA、VSSA,所以ADC的输入电压也就是:0~3.3V

如果要测量不在0~3.3V内的电压,需要在外部搭建转化电路

2.2 ADC时钟

        由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器

2.3 输入通道

注意: 温度传感器和VREFINT只能出现在主ADC1

对于STM32F103C8T6而言,ADC1与ADC2的外部输入通道相同,对应至PA0~PB1

ADC有16个多路通道。可以把转换组织成两组:规则组和注入组
● 规则组由多达16个转换组成
● 注入组由多达4个转换组成


规则通道:按照一定的顺序规则井然有序的进行转换输出,默认情况下使用的是规则通道。由于数据寄存器只能存储最后一个通道的转换数据,如果转换多通道数据,还需与DMA配合使用

注入通道:

(1)触发注入:如果在规则通道转换期间产生一个外部触发注入,当前转换被复位,注入通道序列被以单次扫描方式进行转换。然后,恢复上次被中断的规则组通道转换

如果在注入通道转换期间产生一个规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行

(2)自动注入:在此模式下,必须禁止注入通道的外部触发。如果设置了自动注入和连续模式、规则通道至注入通道的转换序列被连续执行。如果ADC时钟的预分频系数为4~8,在两通道的转换期间会自动插入1个ADC时钟间隔;如果分频系数为2,则右2个时钟间隔的延迟

所以,注入通道只有在规则通道存在时才会出现

1.利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。
2.如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。
3.然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
 

2.3 模式控制

(1)单次转换模式和连续转换模式

单次转换模式:ADC只进行一次转换,每次转换需要触发一次(读取结果时,需要判断结束标志位)

连续转换:当前ADC转换结束后立即启动下一次转换(读取结果时,不需要判断结束标志位)

        每次转换结束后,转换数据被存储在相应的数据寄存器中,EOF(转换结束)/JEOF(注入转换结束)被置位,此外还可申请中断

(2)扫描模式和非扫描模式

        ADC扫描被选中的所有通道。每个组的每个通道执行单次转换,在每个转换结束后,同一组的下一个通道被自动转换

注:非扫描模式下,仅第一个序列有效

        如果设置了连续转换,则不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换

(3)间断模式

规则组间断模式:可以用来执行一个短序列的n次转换(n≤8)

例如,n=3,被转换的通道:0、1、2、3、6、7、8、9

①第一次触发,转换序列为0、1、2

②第二次触发,转换序列为3、6、7

③第三次触发,转换序列为8、9,并产生EOC(End of conversion)事件

第四次触发,转换序列为0、1、2

当所有子组被转换完成,下一次触发启动第一个子组的转换

注入组间断模式:可以用来执行一个短序列的n次转换(n≤8)

例如,n=1,被转换的通道:1、2、3

①第一次触发,转换序列为1

②第二次触发,转换序列为2

③第三次触发,转换序列为3,并产生EOC(End of conversion)和JEOF(Injected channel end of conversion)事件

第次触发,转换序列为1

不能同时使用自动注入和间断模式

(4)双ADC模式

2.4 外部触发转换

        转换可以由外部事件触发( 例如定时器捕获, EXTI 线 )。当外部触发信号被选为 ADC 规则或注入转换时,只有它的上升沿可以启动转换。

2.5 DMA请求

        因为 规则通道转换 的值储存在 一个仅有的数据寄存器 中,所以 当转换多个规则通道时需要使用 DMA ,这可以避免丢失已经存储在ADC_DR寄存器中的数据。
        只有在规则通道的转换结束时才产生DMA请求 ,并将转换的数据从 ADC_DR寄存器传输到用户 指定的目的地址。
注: 只有 ADC1ADC3拥有DMA 功能。由 ADC2转化的数据可以通过双ADC模式,利用ADC1的
DMA功能传输

2.6 数据对齐

        注入组通道转换的数据值已经减去了在ADC_JOFRx 寄存器中定义的偏移量,因此结果可以是一 个负值。SEXT 位是扩展的符号值。
        对于规则组通道,不需减去偏移值,因此只有12 个位有效

一般选用右对齐的方式,读出的值就是转换结果

左对齐的方式,相当于将数据左移了4位,也就是:结果=实际数据*16

如果不需要那么高的精度,可以使用左对齐,然后取出高n位,即可

2.7 转换时间

        ADC采样之后,防止外部电压不断变化造成量化、编码的影响,需要将采集到的电压保持一小段时间

        采样时间可由软件进行配置,采样时间越长,越能避免一些毛刺信号的干扰,但相应的转换时间也会延长

2.8 校准

2.9 ADC中断

EOC(End of conversion)和JEOF(Injected channel end of conversion

ADC1 ADC2 的中断映射在 同一个中断向量 上,而 ADC3 的中断有 自己的中断向量

三、ADC相关库函数

3.1 初始化函数:ADC_Init()

3.2 校准函数

3.3 软件触发转换函数

3.4 通道配置:ADC_RegularChannelConfig ()

四、ADC配置

(1)开启ADC、GPIO时钟

(2)配置ADCCLK的分频器

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //APB2六分频

(3)配置GPIO,完成初始化(模拟输入)

(4)配置多路开关,把左边的通道接入右边的规则组列表中

	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_1Cycles5);  //在序列1的位置上写入通道3

(5)配置ADC,完成初始化

	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;  //工作模式:独立模式	
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;  //单次转换
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;  //非扫描模式	
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;  //数据对齐:右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //外部触发源选择:不使用外部触发
	ADC_InitStruct.ADC_NbrOfChannel = 1;  //进行规则转换的数目通道
	ADC_Init(ADC1,&ADC_InitStruct);

(6)中断配置(如果使用中断,需要此步骤)

(7)配置NVIC,完成初始化(如果使用中断,需要此步骤)

(8)校准

	ADC_ResetCalibration(ADC1);  //复位校准
	while(ADC_GetResetCalibrationStatus(ADC1) == SET);  //复位校准完成
	ADC_StartCalibration(ADC1);  //开始校准
	while(ADC_GetCalibrationStatus(ADC1) == SET);  //复位校准完成

(9)使能ADC

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

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

相关文章

IDC首份中国数据安全市场图谱发布,天空卫士实力入选多个版块

IDC于近日发布了《Market Glance&#xff1a;中国数据安全市场图谱&#xff0c;2024》&#xff08;Doc# CHC51544524&#xff0c;2024年3月&#xff09;报告&#xff0c;展示了中国数据安全市场的构成和格局&#xff0c;遴选出不同细分市场领域的主要技术服务供应商&#xff0c…

大模型-入门小知识

大模型是什么 大量参数&#xff08;上亿&#xff09;深度学习模型 人工只能包含机器学习&#xff0c;深度学习,深度学习包括大模型 单个神经元的计算模型&#xff1a; 大模型是怎么训练的 之前是算法&#xff08;神经网络&#xff09;----> 训练&#xff08;门槛降低&…

工业设备管理平台

在这个数字化、智能化的新时代&#xff0c;工业设备管理平台正成为推动工业转型升级的重要力量。在众多平台中&#xff0c;HiWoo Cloud以其卓越的性能、稳定的服务和创新的理念&#xff0c;赢得了广大用户的青睐。今天&#xff0c;就让我们一起走进HiWoo Cloud的世界&#xff0…

python与上位机开发day02

1.常见运算符 1.1 赋值运算符 赋值运算符主要用来对变量进行赋值,包括如下这些: 运算符描述赋值加等于-减等于*乘等于/除等于//整除等于%模等于**幂等于 实例如下: a 10 a 5 # 等价于 a a5 a *2 # 等价于 a a*21.2 比较运算符 比较运算符主要用来比较两个数据的大小…

20240423给飞凌的OK3588-C开发板适配OV13855【绿屏】查找问题

20240423给飞凌的OK3588-C开发板适配OV13855【绿屏】查找问题 2024/4/23 19:43 修改2个部分&#xff1a; 1、DTS中CAM1由ISP0处理修改为ISP1处理。【感觉修改为ISP1之后就不出错了&#xff0c;难道ISP0有问题&#xff1f;】 2、ov13855.c修改为 荣品的RK3588开发板提供的SDK An…

1212332

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统&#xff0c;目前已在多家三级级医院应用&#xff0c;并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

抽象工厂模式设计实验

【实验内容】 楚锋软件公司欲开发一套界面皮肤库&#xff0c;可以对 Java 桌面软件进行界面美化。为了保护版权&#xff0c;该皮肤库源代码不打算公开&#xff0c;而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤&#xff0c;不同的…

骨传导耳机哪个牌子好?5款年度精品骨传导耳机推荐

在骨传导耳机最开始出现的时候&#xff0c;相信很多人都只关心骨传导耳机的外观颜值和特殊的传声方式&#xff0c;但当你真正用过一段时间后&#xff0c;对骨传导耳机有了更加深入的了解后就会关注到骨传导耳机的使用体验、音质表现、蓝牙性能等具体功能&#xff0c;而随着骨传…

【Flutter】多语言方案二:GetX 版

介绍 多语言方案&#xff1a;GetX版&#xff0c;需要手动自定义字符串引用常量&#xff0c;优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹&#xff0c;文件夹下创建一个local.dart文件2.language文件夹下创…

防反接、防过压、缓启动电路相关

一、防反接电路 电源正确接入时 电流从 VIN 端流向负载&#xff0c;经由 Q3(NMOS) 通向地&#xff08;GND&#xff09;。在上电瞬间&#xff0c;由于 MOS 管的体二极管效应&#xff0c;地回路通过体二极管接通。接下来&#xff0c;由于 Vgs(门源电压)大于 Vgsth(门限电压)&…

负载均衡器

服务端负载均衡器 在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如F5&#xff09;&#xff0c;也有软件的&#xff08;比如Nginx&#xff0c;openResty&#xff09; 如Nginx &#xff0c;通过Nginx进行负载均衡&#xff0c;先发送请求…

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 附代码实现

AAAI-24 | EarnHFT:针对高频交易的分层强化学习&#xff08;RL&#xff09;框架 摘要(Abstract):高频交易&#xff08;HFT&#xff09;使用计算机算法在短时间内&#xff08;例如秒级&#xff09;做出交易决策&#xff0c;在加密货币市场&#xff08;例如比特币&#xff09;中…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本&#xff08;Y4tacker这个师傅的&#xff09; # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

Pytest精通指南(27)钩子函数-多重校验(pytest-assume)

文章目录 前言应用场景插件安装注意事项参数分析assert断言示例assume断言示例 前言 pytest-assume是pytest的一个扩展插件&#xff0c;它提供了一种新的断言方式&#xff0c;即**“assume”**。 与常规的assert语句不同&#xff0c;当使用assume进行断言时&#xff0c;即使某个…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时&#xff0c;可以通过bugreport把系统当前时刻点&#xff08;运行BugRepot的时刻&#xff09;的系统相关的状态和信息…

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日&#xff0c;腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型&#xff0c;除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品&#xff0c;腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

fawawf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

区块链钱包开发——专业区块链开发

随着区块链技术的发展&#xff0c;钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性&#xff0c;分析当前面临的挑战&#xff0c;并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

05_FreeRTOS信号量

信号量 信号量信号量简介常用信号量API函数 信号量 信号量简介 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;可以实现任务之间同步或临界资源的互斥访问&#xff0c;常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中&#xf…
最新文章