STM32的ADC详解

        ADC即模拟数字转换器,通常用于将外部的模拟量信号转换为数字信号。STM32的ADC是12位逐次逼近型的模拟数字转换器,最大可以计数到4095,有18个通道,16个外部通道和2个内部通道。

ADC框图

ADC的功能框图可以分为七个部分:

①输入电压:

        ADC输入范围为:VREF- ≤ VIN ≤ VREF+。由VREF-、 VREF+ 、VDDA 、VSSA、这四个外部引脚决定。

        我们在设计原理图的时候一般把VSSA和VREF-接地, 把VREF+和VDDA 接3V3,得到ADC的输入电压范围为:0~3.3V。 在64脚以下的CPU中,没有VREF-和VREF+这两个引脚,ADC电压输入范围直接由VDDA和VSSA决定。

②输入通道:STM32每个ADC有18个通道,16个外部通道和2个内部通道,具体通道和IO口的匹配关系如下表:

③通道分类:外部通道中又分为规则通道和注入通道,规则通道最多16个,注入通道最多4个。

规则通道:规则通道就是普通的通道,通常使用的都是规则通道。

注入通道:注入通道有点像中断,可以插入到规则通道组中,如果规则通道组转换过程中触发了注入通道,注入通道会打断规则通道的转换,所有注入通道转换完后规则通道才能继续转换。

 ④触发源:ADC触发转换的方式有两种,给ADC_CR2寄存器的ADON位写1或者通过外部事件触发,外部事件包括定时器触发,EXTI触发等。

⑤转换时间:ADC输入时钟ADC_CLK由PCLK2经过分频产生,最大是14M,分频因子由RCC时钟配置寄存器RCC_CFGR的位15:14 ADCPRE[1:0]设置, 可以是2/4/6/8分频,注意这里没有1分频。一般我们设置PCLK2=HCLK=72M。

        ADC使用若干个ADC_CLK周期对输入的电压进行采样, 采样的周期数可通过ADC 采样时间寄存器ADC_SMPR1和ADC_SMPR2中的SMP[2:0]位设置, ADC_SMPR2控制的是通道0~9,ADC_SMPR1控制的是通道10~17。每个通道可以分别用不同的时间采样。其中采样周期最小是1.5个, 即如果我们要达到最快的采样,那么应该设置采样周期为1.5个周期,这里说的周期就是1/ADC_CLK。

        ADC的转换时间公式为:Tconv = 采样时间 + 12.5个周期。当ADCLK = 14MHZ (最高), 采样时间设置为1.5周期(最快),那么总的转换时间(最短)Tconv = 1.5周期 + 12.5周期 = 14周期 = 1us,一般我们设置PCLK2=72M,经过ADC预分频器能分频到最大的时钟只能是12M(6分频),采样周期设置为1.5个周期, 算出最短的转换时间为1.17us,这个才是最常用的。

 ⑥数据寄存器:ADC 规则组数据寄存器 ADC_DR 是一个 32 位的寄存器,独立模式时只使用到该寄存器低 16 位保存 ADC1/2/3 的规则转换数据。因为 ADC 的精度是 12 位的,ADC_DR 寄存器无论高 16 位还是低 16,存放数据的位宽都是 16 位的,所以需要选择数据对齐方式是左对齐还是右对齐。规则组最多有 16 个输入通道,而 ADC 规则数据寄存器只有一个,如果使用多通道转换,那么这些通道的数据也会存放在 DR 里面,按照规则组的顺序,上一个通道转换的数据,会被下一个通道转换的数据覆盖掉,所以当通道转换完成后要及时把数据取走。比较常用的方法是使用 DMA 模式。当规则组的通道转换结束时,就会产生 DMA 请求,这样就可以及时把转换的数据搬运到用户指定的目的地址存放。注意:只有 ADC1 和 ADC3 可以产生 DMA 请求,而由 ADC2 转换的数据可以通过双 ADC 模式,利用 ADC1 的 DMA 功能传输。

⑦中断:ADC有三种中断,规则组转换结束中断,注入组转换结束中断和模拟看门狗中断。当输入模拟电压低于低阈值或高于高阈值时会触发模拟看门狗中断。

扫描模式和连续模式的区别

①扫描模式(Scan Mode):在扫描模式下,ADC可以配置为对多个输入通道进行连续转换。ADC将按照通道号的顺序对设置的多个通道进行转换,并将结果按顺序保存在对应的数据寄存器中。可以通过使用EOC(End of Conversion)标志或DMA传输等方式来获取每个通道的转换结果。

②连续模式(Continuous Conversion Mode):在连续转换模式下,ADC在完成一次转换后自动开始下一次转换,无需外部触发。这种模式适用于需要持续采样的应用场景,如数据采集。

具体到单通道和多通道的情况:

①单通道:在单通道的情况下,扫描模式失能,因为只有一个通道需要进行转换。如果配置为单次模式使能,则该通道转换一次后停止转换;如果配置为连续模式使能,则该通道会不断进行连续的转换。

②多通道:在多通道的情况下,必须使用扫描模式。如果配置为单次模式使能且扫描模式使能,则多个通道会按照配置的顺序依次转换一次后停止转换;如果配置为连续模式使能且扫描模式使能,则多个通道会按照配置的顺序依次转换一次后接着进行下一次转换,实现不断连续的转换。

综上所述,扫描模式只在多通道的条件下有效,使得各个通道按照配置循序依次转换。而单次模式无论在单通道还是多通道下只对这些或者这个通道进行一次转换,连续模式无论是在单通道还是多通道下都对这些或者这个通道不断进行连续的转换。

ADC多通道采集(DMA读取)实验

①使能ADC、DMA和ADC通道IO时钟

②设置ADC分频因子为6分频,72/6=12M

③配置ADC通道IO为模拟输入模式

④复位ADC

⑤配置ADC工作模式

⑥配置ADC规则通道转换顺序

⑦使能ADC,使能复位校准,等待校准技术,开启ADC校准,等待校准结束,使能ADC软件触发

⑧DMA通道复位

⑨DMA配置

⑩使能DMA,使能ADC的DMA

 volatile  uint16_t ADC_ConvertedValue[3]={0,0,0};	//存放ADC数据的缓冲区
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3                                                                       
void  Adc_Init(void)
{     ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );//使能ADC1通道时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M//PA1为ADC通道1 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);    //PA2为ADC通道2 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);//PA3为ADC通道3 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC工作模式:工作在独立模式,只用到一个ADCADC_InitStructure.ADC_ScanConvMode = ENABLE;    //扫描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //模数转换工作在连续转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 3;    //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);    //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   //配置ADC规则通道转换顺序ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,3,ADC_SampleTime_239Cycles5);ADC_Cmd(ADC1, ENABLE);    //使能指定的ADC1ADC_ResetCalibration(ADC1);    //使能复位校准  while(ADC_GetResetCalibrationStatus(ADC1));    //等待复位校准结束ADC_StartCalibration(ADC1);     //开启AD校准while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的软件转换启动功能//DMA初始化DMA_DeInit(DMA1_Channel1);//DMA通道复位DMA_InitStructure.DMA_BufferSize = 3;//三路通道,缓冲区为3DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向由外设到内存DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//没用到内存到内存传输DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;//分配内存地址DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//设置内存数据宽度为半字DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址进行增加,因为需要进行对数据的存储DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//设置传输模式位连续不断的循环模式DMA_InitStructure.DMA_PeripheralBaseAddr=( u32 ) ( & ( ADC1->DR ) );//DMA的外设基地址DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//设置外设数据字长DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设的基地址是否进行增加,否DMA_InitStructure.DMA_Priority=DMA_Priority_High;//设置DMA的转换的优先级为高优先级DMA_Init(DMA1_Channel1,&DMA_InitStructure);DMA_Cmd( DMA1_Channel1 , ENABLE);// 使能 DMA 通道ADC_DMACmd(ADC1,ENABLE);//使能ADC1的DMA//    ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的软件转换启动功能
}                  

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

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

相关文章

记一次springboot jpa更新复杂几何类型报错Only simple geometries should be used

问题: 更新数据时, 几何字段MultiPolygon类型时报错; java.lang.IllegalStateException: Only simple geometries should be used 几何字段Point类型时不报错; 新增时字段存在MultiPolygon不报错。 查看日志可知,…

vscode 使用正则搜索

ctrl c 复制,内容如下: Vue3简介创建Vue3工程Vue3核心语法路由pinia组件通信其它 APIVue3新组件

Go 单元测试完全指南(一)- 基本测试流程

为什么写单元测试? 关于测试,有一张很经典的图,如下: 说明: 测试类型成本速度频率E2E 测试高慢低集成测试中中中单元测试低快高 也就是说,单元测试是最快、最便宜的测试方式。这不难理解,单元…

Baidu Comate:让编码实现无限可能

目录 1 背景介绍2 快速入门2.1 智能推荐功能2.2 智能生成功能2.2.1 智能注释2.2.2 智能生成2.2.3 智能调优2.2.4 代码解释 3 高兼容性4 即刻体验 1 背景介绍 Baidu Comate(智能代码助手)是基于文心大模型,结合百度积累多年的编程现场大数据和…

【MySQL数据库】丨一文详解 JdbcTemplate(Spring中的CRUD)

前言 JdbcTemplate 是 Spring框架 中提供的一个对象,用于简化JDBC操作。它使得数据库操作变得更为简单和方便,大大提高了开发效率。 文章目录 前言为何要使用JdbcTemplate在JdbcTemplate中执行SQL语句的方法大致分为3类:案例代码 JdbcTemplat…

word 毕业论文格式调整

添加页眉页脚 页眉 首先在页面上端页眉区域双击,即可出现“页眉和页脚”设置页面: 页眉左右两端对齐 如果想要页眉页脚左右两端对齐,可以选择添加三栏页眉,然后将中间那一栏删除,即可自动实现左右两端对齐&#x…

Linux 操作系统TCP、UDP

1、TCP服务器编写流程 头文件&#xff1a; #include <sys/socket.h> 1.1 创建套接字 函数原型&#xff1a; int socket(int domain, int type, int protocol); 参数&#xff1a; domain: 网域 AF_INET &#xff1a; IPv4 AF_INET6 &a…

fswatch工具:跟踪Linux中的文件和目录更改

fswatch是一个跨平台的文件更改监视器&#xff0c;当指定文件或目录的内容被更改或修改时&#xff0c;它会收到通知警报。 fswatch在不同的操作系统上执行多种类型的监视器&#xff0c;例如&#xff1a; 基于 Apple OS X 的文件系统事件 API 构建的监视器。基于kqueue的监视器…

WPF之DataGird应用

1&#xff0c;DataGrid相关属性 GridLinesVisibility&#xff1a;DataGrid网格线是否显示或者显示的方式。HorizontalGridLinesBrush&#xff1a;水平网格线画刷。VerticalGridLinesBrush&#xff1a;垂直网格线画刷。HorizontalScrollBarVisibility&#xff1a;水平滚动条可见…

ASP.NET MVC 如何使用 Form Authentication?

前言 .NET 的 Form Authentication 是一种基于表单的简单且灵活的身份验证机制&#xff0c;用户通过输入用户名和密码来登录应用程序&#xff0c;并且通过配置来控制用户访问权限。 在使用 Form Authentication 时&#xff0c;我们需要在 web.config 文件中配置身份验证和授权…

Spring Cloud Consul 4.1.1

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供 Consul 集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用程序内的常见模式&#xff0c;并使用基于 Consul 的组件构建大型分布式系统。提供的模式…

Spark云计算平台Databricks使用,第一个Spark应用程序WordCount

1 上传文件 上传words.txt文件&#xff1a;Spark云计算平台Databricks使用&#xff0c;上传文件-CSDN博客 上传的文件的路径是/FileStore/tables/words.txt&#xff0c;保存在AWS的S3 hello world hello hadoop hello world hello databricks hadoop hive hbase yarn spark …

利用BACnet分布式IO控制器优化Niagara楼宇自动化系统

在智能建筑领域&#xff0c;随着物联网技术的飞速发展&#xff0c;如何实现高效、灵活且安全的楼宇自动化控制成为了行业关注的焦点。BACnet IP分布式远程I/O模块&#xff0c;作为这一领域的创新成果&#xff0c;正逐渐成为连接智能建筑各子系统的关键桥梁&#xff0c;尤其在与…

springboot -多数据源管理方案

多数据源的配置有多种方式 方式一 、依赖dataSource的配置 1.建立多数据源配置 spring:# 数据源配置datasource:pdm:driver-class-name: oracle.jdbc.driver.OracleDriverjdbc-url: jdbc:oracle:thin:10.216.xxx.xxx:3000:orclusername: cfpdmpassword: capecapp:driver-cla…

走进CHEN MEI HUA的设计哲学:书写东方女性力量与态度的时尚篇章

在时尚的舞台中央&#xff0c;品牌不止是商品&#xff0c;更是故事的讲述者、文化的传承者。CHEN MEI HUA&#xff0c;一个源自中国上海的高端女装品牌&#xff0c;以其独特的设计理念及文化内核&#xff0c;成为了时尚界一颗耀眼的明珠。今天&#xff0c;让我们一起走进CMH的世…

如何安装ElasticSearch及相关件

一、简介 ElasticSearch是什么&#xff1f; elasticsearch简写es&#xff0c;es是一个高扩展、开源的全文检索和分析引擎&#xff0c;它可以准实时地快速存储、搜索、分析海量的数据。 ElasticSearch 插件 elasticsearch-head是一款专门针对于elasticsearch的客户端工具&am…

3W 1.5KVDC 隔离单输出 DC/DC 电源模块 ——TPL-3W 系列

TPL-3W系列是一款额定功率为3W的隔离产品&#xff0c;国际标准引脚&#xff0c;宽范围工作温度–40℃ 到 105℃&#xff0c;在此温度范围内都可以稳定输出3W&#xff0c;并且效率非常高&#xff0c;高达88%&#xff0c;同时负载调整率非常低&#xff0c;对于有输出电压精度有要…

ATA-300/3000系列功率放大器全新升级!免费样机“试”不宜迟!

2024年4月&#xff0c;Aigtek安泰电子ATA-300/3000系列功率放大器&#xff0c;迎来了进一步升级&#xff0c;最大输出功率可达1000Wp&#xff0c;最大输出电流20Ap&#xff0c;四象限输出&#xff0c;可驱动功率型负载。新产品的功率密度和可靠性都更高&#xff0c;能够进行的进…

【漏洞复现】某小日子太阳能系统DataCube3审计

漏洞描述 某小日子太阳能系统DataCube3终端测量系统 多个漏洞利用方式 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进…

华普检测温湿度监测系统建设方案

一、项目背景 随着医疗行业的蓬勃发展&#xff0c;药品、试剂和血液的储存安全直接关系到患者的健康。根据《药品存储管理规范》、《医疗器械冷链&#xff08;运输、贮存&#xff09;管理指南》、《疫苗储存和运输管理规范》和《血液存储要求》等相关法规&#xff0c;医院药剂…