STM32F0-寄存器ADC配置指南

目录

输入方式:

模拟看门狗功能:

ADC中断

配置一个Demo

设置时钟

自校准

通道选择

采样时间选择

转换模式选择

断续模式

启动转换

软件触发

外部触发

转换结束

关于DMA

模拟看门狗

​编辑ADC数据位置​编辑


在STM32F中,ADC可配置分辨率 有12位,10位,8位,6位

ADC供电要求为 2.4V~3.6V

输入方式

-- 外部GPIO口16路输入

-- 内部温度传感器输入

-- 内部参考电压输入

--- 外部电池VBAT输入

模拟看门狗功能:

AWD模拟看门狗功能由在ADC_CFGR1寄存器的AWDEN位置位来开启,它可用于监控所选的单一通道或所有使能通道所配置的电压范围。

如果模拟电压转换由ADC高于高阈值或低于低阈值时,AWD模拟看门狗的状态为被置位,模拟看门狗中断可用设置ADC_IER寄存器中的AWDIE位来使能。

ADC中断

ADC中断可由一下任意事件产生

配置一个Demo

要求如下:配置ADC1IN1,ADC1IN2,ADC1IN3,使用内部专用14Mhz振荡器,过采样为7.5个ADC周期,由TIM1中断作为触发信号,DMA搬运

并且开启模拟看门狗监控ADC1IN1,阈值为3.3v~3.0v并且开启模拟看门狗中断

设置时钟

1.首先要设定ADC的时钟,需要注意的是ADC是双时钟架构,可以选择以下任意一个

选项1:专用的14MHz内部振荡器

选项2:PCLK时钟/2 或/4 最大不能超过14MHz

选项1的优势是ADC一直具有最佳的ADC采样频率,它还提供了为了节能,可自动打开/关闭内部14MHz振荡器的能力。

可以看到选项1的优点为快速,选项2优点为无抖动

从RCC的图里也可以看到HSI14为内部14Mhz专用振荡器独立于任何时钟

HSI14在SystemInit的时候已经被关掉了所以需要在用的时候再开启,在我上篇博客里有解释

STM32F0-标准库时钟配置指南

控制HSI14的寄存器为RCC_CR2

通过寄存器可以看到HSI14也需要校准,步骤为

1.HSI14ON=1,使能HSI14

2.等待HSI14DRY=1,等待HSI14就绪

3.HSI14DIS=0,允许ADC打开HIS14振荡器

经过这三步,HSI14就已经被打开而且可由ADC使用了。

使用HSI14需要注意ADC的这个功能

自动关断模式 (AUTOFF)
        ADC 含有一个本身电源自动管理的功能,该功能为自关断模式。当设置 ADC_CFGR1 寄存器中的 AUTOFF=1 时,开启该功能。
        当AUTOFF=1时, 无转换时ADC经常自断电;转换开始(由软件或硬件触发)时ADC自动唤醒。一个启动时间在触发开始转换与采样之间自动插入。一旦序列转换结束后 ADC 自动关闭。自动关断模式可大大降低应用的功耗, 其适用于需要相对较少转换或转换请求的时间间隔足够长 ( 如低频的硬件触发 ) 的应用。

自校准

2.注意在开启ADC之前需要进行自校准,否则无法使用ADC,在校准期间,ADC计算一个用于ADC校准的7为校准因子(ADC掉电后丢失),在ADC校准期间和校准未完成前,不能使用ADC模块。

校准是由软件设置ADCAL=1来初始化,且只能在ADC禁用(ADEN=0)时完成初始化,校准完成后,ADCAL被硬件清0,校准完成后可由ADC_DR的[6:0]读出校准因子。

使用ADC_CR寄存器完成自校准

软件过程

确认ADEN=0

设置ADCAL=1

等待ADCAL=0

校准完成(可由ADC_DR的[6:0]读出校准因子)

 在ADC配置过程中需要注意

通道选择

通道可以选择:
●16个从GPIO引脚引入的模拟输入

●3个内部模拟输入(温度传感器ADC_IN16,内部参考电压ADC_IN17,VBAT通道ADC_IN18)

ADC可以选择单个或者多个序列

被转换的ADC在通道选择寄存器ADC_CHSELR 中编程选择

ADC扫描的通道顺序由ADC_CFGR1 中 SCANDIR 位的配置来决定:

● SCANDIR=0: 向前扫描 : 从通道 0 到通道 18.

● SCANDIR=1: 回退扫描:从通道 18 到通道 0        

采样时间选择

启动ADC之前,ADC需要在被测电压源内嵌采样电容间建立一个直接连接,采样时间必须足够长以便输入电压源对内嵌电容充电到输入电压水平。

 ADC采样事件对所有通道都适用,通过修改ADC_SMPR来确认采样时间

转换模式选择

单次转换模式

连续转换模式

寄存器如下

断续模式

 该模式由设置 ADC_CFGR1 寄存器中的 DISCEN 位来开启。 在这个模式(DISCEN=1)下,需要硬件或软件的触发事件去启动定义在一个序列中的每次转换。 相反,DISCEN=0 时 , 一个硬件或软件的触发事件就可以启动定义在一个序列中的所有转换。

即序列不是一次转换,而是一个一个转换,在每次触发的时候转换一个。

启动转换

软件触发

需要注意在硬件触发情况下也需要第一次开启ADSTART

ADSTART在

外部触发

一次转换或一个序列的转换可由软件或外部事件 ( 例如:定时器捕获、输入引脚 ) 触发。

输入引脚触发为:

定时器触发为:

设置触发位于

转换结束

状态寄存器会改变

关于DMA

对于减轻CPU负担,建议使用DMA等待和搬运ADC数据

        因为所有通道的转换结果数据存放到一个单一的数据寄存器中,故当转换通道超过 1 个时用
DMA 方式会更有效。这样可以避免丢失存在 ADC_DR 寄存器中的转换结果。

        DMA 模式开启时 (ADC_CFGR1 寄存器中的 DMAEN =1), 每次转换结束时都会产生一个
DMA 请求。这样就允许把在 ADC_DR 寄存器中的转换数据传送到软件指定的目标地址中。

        尽管如此,因 DMA 不能够及时为 DMA 请求服务而产生的过冲 (OVR=1) 时,ADC 就会停止
产生 DMA 请求且相应结果是新的转换数据也不会再由 DMA 进行传输 ( 当 OVR=0 时,会继
续传输 )。这也可以认为所有传输到 RAM 中的数据都是有效的 ( 因无效的数据再也不传输了 )。也就是DMA 传输请求会被阻止直到软件清除 OVR 位。

        根据 OVRMOD 位的配置,ADC_DR 寄存器中的数据可选择为:保持或覆盖。

有两种不同的 DMA 模式,其取决于 ADC_CFGR1 寄存器中的 DMACFG 位的配置:
        ● DMA 一次模式 (one shot mode)(DMACFG=0).
                当 DMA 编程用于传输固定长度的数据时,可选用该模式。在该模式下,每次使能仅进行一轮传输,一旦计数器的值减至0时,DMA传输会停止。想要再次传输,必须重新设置计数器CNDTR的数值。
        ● DMA 循环模式 (DMACFG=1)
                当 DMA 编程为循环模式或双缓冲模式时,可选用该模式。主要处理连续的数据传输,每进行一轮传输,计数器会被自动恢复为初始值,同时DMA传输进入下一轮,非常适合同ADC多通道(扫描)模式一起工作。

寄存器如下:

模拟看门狗

这里选择模拟看门狗监控通道
模拟看门狗中断在这里配置

模拟看门狗阈值寄存器:


ADC数据位置

以上是ADC的所有介绍,接下来开始写Demo
/*要求如下:配置ADC1IN1,ADC1IN2,ADC1IN3,使用内部专用14Mhz振荡器,过采样为7.5个ADC周期,由TIM1中断作为触发信号,DMA搬运
并且开启模拟看门狗监控ADC1IN1,阈值为3.3v~3.0v并且开启模拟看门狗中断。ADC分辨率为默认的12位*/
void Demo(void){//打开HSI14时钟RCC->CR2 |=  0x00000001;//开启HSI14while(!(RCC->CR2 |= 0x00000002));//等待HSI14稳定RCC->CR2 |= 0x00000004;//允许ADC打开HSI14       //ADC自校准ADC1->CR |= 0x00000001; //ADC禁用ADC1->CR |= 0x80000000; //开启自校准while((ADC1->CR |= 0x80000000)); //等待自校准完成//ADC通道选择ADC1->CHSELR |= 0x0000000E; //选择通道1 2 3ADC1->CFGR1 |= 0X00000004; //前向扫描//ADC采样时间选择ADC1->SMPR |= 0x00000001; //7.5个采样周期//转换模式选择ADC1->CFGR1 &= 0XFFFFDFFF; //单次转换模式ADC1 ->CFGR1 &= 0xFFFFF3FF; //外部触发禁止ADC1 ->CFGR1 &= 0xFFFFFE3F;//使用TIM1_TRGO作为触发事件源//开启模拟看门狗ADC1->ISR |= 0x00000080;//开启模拟看门狗中断ADC1->IER |= 0x00000080;//模拟看门狗中断使能ADC1 ->CFGR1 |= 0x4C00000;//模拟看门狗监视通道1 模拟看门狗使能 在单一通道上使能模拟看门狗ADC1->TR |=0xE8C0FFF;//阈值为 4095~3723 即3.3v~3.0v//DMA设置ADC1 ->CFGR1 |= 0x00000003;//DMA使能 循环模式//开始转换ADC1->CR &= 0xFFFFFFFE; //ADC解除禁用ADC1->CR |= 0x00000004; //开始转换
}

具体DMA配置见下篇博客介绍

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

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

相关文章

AV1技术学习:Loop Restoration Filter

环路恢复滤波器(restoration filter)适用于64 64、128 128 或 256 256 像素块单元,称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器(Wiener filter)或使用自导滤波器&#…

pyenv-win | python版本管理,无需卸载当前版本

系统:windows,且已安装git。 使用 pyenv-win 在Windows中管理多个python版本,而无需卸载当前版本。安装步骤如下: 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

Word 导入导出

在实际的开发过程中,也会遇到导入导出的功能,今天就简单的做一下总结。 1.需求:将下面word 数据导入到数据库并进行存储 在Controller中 RequestMapping(value "/ImportWord")public RawResponseBodyObject ImportWord(HttpServl…

深入解析Linux目录结构及其功能

深入解析Linux目录结构 Linux 系统的目录结构采用层次化设计,从根目录 / 开始逐级扩展,了解和掌握这些目录的作用和内容有助于我们更好地管理和维护系统。本文将深入解析每个常见目录的功能,并提供相关命令和示例。 目录结构概览 根目录 / …

【BUG】已解决:ERROR: No matching distribution found for PIL

ERROR: No matching distribution found for PIL 目录 ERROR: No matching distribution found for PIL 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身&#xff0…

css大屏设置中间元素四周渐变透明效果

css大屏设置中间元素四周渐变透明效果 四周透明效果: // 设置蒙版上下左右渐变显示mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 100%),linear-gradient(to bottom, rgba(0, 0, 0…

《Java初阶数据结构》----5.<二叉树的概念及使用>

前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

6.6 使用dashboard商城搜索导入模板

本节重点介绍 : 模板商城中搜索模板导入模板修改模板 大盘模板商城地址 免费的 地址 https://grafana.com/grafana/dashboards 搜索模板技巧 详情 导入dashboard 两种导入模式 url导入id导入json文件导入 导入 node_exporter模板 https://grafana.com/grafana/dashboa…

流量录制与回放:jvm-sandbox-repeater工具详解

在软件开发和测试过程中,流量录制与回放是一个非常重要的环节,它可以帮助开发者验证系统在特定条件下的行为是否符合预期。本文将详细介绍一款强大的流量录制回放工具——jvm-sandbox-repeater,以及如何利用它来提高软件测试的效率和质量。 …

Python | Leetcode Python题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution:def moveZeroes(self, nums: List[int]) -> None:n len(nums)left right 0while right < n:if nums[right] ! 0:nums[left], nums[right] nums[right], nums[left]left 1right 1

SpringCloud之@FeignClient()注解的使用方式

FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构&#xff0c;难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法&#xff0c;FeignClient()注解就是为了解决这个问题的…

汽车免拆诊断案例 | 2014 款上汽名爵 GT 车发动机无法起动

故障现象 一辆2014款上汽名爵GT车&#xff0c;搭载15S4G发动机&#xff0c;累计行驶里程约为18.4万km。该车因左前部发生碰撞事故进厂维修&#xff0c;更换损坏的部件后起动发动机&#xff0c;起动机运转有力&#xff0c;但无着机迹象。用故障检测仪检测&#xff0c;发现无法与…

初识c++:string类(2)

#本节主要讲解c&#xff1a;string类的模拟实现 全部代码的实现在最后面&#xff01;&#xff01;&#xff01;有需要的自己往下滑&#xff0c;自取&#xff01;&#xff01;&#xff01;1.string类的模拟实现 2.浅拷贝 3.深拷贝 目录 #本节主要讲解c&#xff1a;string类…

VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器

一、引言 如上图&#xff0c;我有一个解决方案【EtchDevice】&#xff0c;他包含两个&#xff08;甚至更多个&#xff09;子项目&#xff0c;分别是【DeviceRT】和【DeviceWin】&#xff0c;见名知意&#xff0c;我需要一个项目编译运行在RTOS上&#xff0c;譬如一个名叫INTime…

用重建大师进行空三解算时,引擎出现“不能访问目录或文件”怎么解决?

答&#xff1a;之前的工程还有在做的任务&#xff0c;可以更换任务目录重新提交空三试试。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格模型…

数据中心服务器搬迁团队

数据中心机房服务器搬迁&#xff0c;需要专业的数据中心机房服务器提供技术保障服务。友力科技&#xff08;广州&#xff09;有限公司&#xff0c;作为华南地区主流的数据中心服务商&#xff0c;专业从事数据中心机房搬迁服务。 数据中心机房搬迁涉及设备数量多、系统复杂&…

数据结构: 链表回文结构/分割链表题解

目录 1.链表的回文结构 分析 代码 2.链表分割 ​编辑分析 代码 1.链表的回文结构 分析 这道题的难点是空间复杂度为O&#xff08;1&#xff09; 结合逆置链表找到链表的中间节点就可以解决了。 先找到链表的中间节点&#xff0c;再对中间节点的下一个节点进行逆置&…

什么是大型语言模型 (LLM)

本章探讨下&#xff0c;人工智能如何彻底改变我们理解和与语言互动的方式 大型语言模型 (LLM) 代表了人工智能的突破&#xff0c;它采用具有广泛参数的神经网络技术进行高级语言处理。 本文探讨了 LLM 的演变、架构、应用和挑战&#xff0c;重点关注其在自然语言处理 (NLP) 领…

三、建造者模式

文章目录 1 基本介绍2 案例2.1 Car 类2.2 CarBuilder 抽象类2.3 EconomyCarBuilder 类2.4 LuxuryCarBuilder 类2.5 CarDirector 类2.6 测试程序2.7 测试结果2.8 总结 3 各角色之间的关系3.1 角色3.1.1 Product ( 产品 )3.1.2 Builder ( 抽象建造者 )3.1.3 ConcreteBuilder ( 具…

SvelteKit - 1. 初始化项目

官方 doc - create a project 1、基本环境 &#xff08;下面是我这里的环境&#xff0c;亲测用 node 14 和 16 install 会报错&#xff09; node&#xff1a;20.9.0 npm&#xff1a;10.1.0 2、初始化项目 npm create sveltelatest my-app cd my-app npm install npm run de…