[STM32] ADC 模数转换器 (十)

news2024/12/27 7:15:44

文章目录

      • 1.ADC概述
        • 1.1 转换模式(规则组)
        • 1.2 数据对齐
        • 1.3 转换时间
        • 1.4 校准
      • 2.代码步骤

STM32F103C8T6的12位逐次逼近型ADC的工作原理,包括转换模式、数据对齐、转换时间、校准以及程序配置流程,同时涵盖了关键的库函数和中断管理。

1.ADC概述

  1. ADC(Analog-Digital Converter)模拟-数字转换器

  2. ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

  3. 12位逐次逼近型ADC,1us转换时间

  4. 输入电压范围:0 ~ 3.3V,转换结果范围:0 ~ 4095

  5. 18个输入通道,可测量16个外部(最大16个)和2个内部信号源

  6. 规则组和注入组两个转换单元

  7. 模拟看门狗自动监测输入电压范围

在这里插入图片描述

左侧是ADC的输入通道,包括16个GPIO口,两个内部通道。通过模拟多路开关,选择我们需要的通道。
规则组一次可最多选16个通道,但数据寄存器只有16位,故每个通道的更新数据会覆盖前一个通道的更新数据数据(需使用DMA及时搬运数据,防止数据被覆盖)。
注入组一次最多可选4个通道,数据寄存器有4*16位,可同时读取四个通道的数据。

VREF+,VREF- ADC参考电压
VDDA,VSSA ADC供电电压

ADCCLK:ADC时钟,推动ADC进行逐次比较获得数字信号,最大为14MHZ,由APB2时钟72MHZ经过ADC预分频器获得。

模拟看门狗:存有阈值高限和阈值低限。启功后,一旦数据寄存器的值在阈值范围之外,看门狗就会申请中断,执行中断函数

EOC:规则组完成信号,规则组完成转换完成后,置标志位。
JEOC:注入组完成信号,注入组完成转换完成后,置标志位。
AWD:模拟看门狗事件,转换结果高于阈值时,置标志位。

1.1 转换模式(规则组)

单次转换, 非扫描模式:

在这里插入图片描述

  1. 非扫描模式下,规则组16个可选通道中只有第一个通道有效。
  2. 我们可在序列一的位置转换我们想要选择的通道,触发信号发生后,ADC就会对这个通道的数据进行模数转换,完成之后EOC置一,我们可判断EOC标志位,如果转换完成我们可在数据寄存器中读取结果。
  3. 再次转换需要再次触发。

连续转换, 非扫描模式:

在这里插入图片描述

  1. 与上一个模式相比,该模式会立刻进行下一次转换,不需每次转换前都发生一次触发信号,只在第一次发生触发信号即可,也不用判断是否结束,直接读取即可。

单次转换, 扫描模式:

在这里插入图片描述

  1. 与第一个相比,我们一次可选择多个通道(需指定一共的通道数),扫描各个通道,进行模数转换,但下一个数据会覆盖上一个数据。

多次转换, 扫描模式:

在这里插入图片描述

  1. 与上一个模式相比,该模式会立刻进行下一次转换,不需每次转换前都发生一次触发信号,只在第一次发生触发信号即可,也不用判断是否结束,直接读取即可。
1.2 数据对齐

在这里插入图片描述

数据寄存器是16位的,但ADC数模转换器的12位的,这会造成左右对齐不同时,数据不同。
右对齐:高四位为0,为真实值。(常用)
左对齐:第四位为0,可降低分辨率(使用时,只取出高八位)。

1.3 转换时间

AD: 采样, 保持, 量化, 编码

Tconv = 采样时间 + 12.5ADC 周期

量化和编码是进行比较的时间, 采样和保持时间是如果电压不断的变化, 那么会造成数据的丢失。
故我们在转换过程中,使用电容和开关,存储这段电压,当转换完成时,再输出这段电压(这段过程产生了采样时间)。
采样时间越大,越能避免一些毛刺信号的干扰。

1.4 校准

在这里插入图片描述

2.代码步骤

第一步:开启RCC时钟,GPIO,ADC;ADCCLK分频器配置。

	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	/*配置ADCCLK预分频系数*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);

第二部:配置GPIO为模拟输入。

	/*配置GPIO*/
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;//配置位模拟输入模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0; 
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

第三步:配置多路开关,选择通道进入ADC中。

	ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 0, ADC_SampleTime_55Cycles5);//规则组序列1的位置,配置为通道0
	//多通道配置时,此函数可在ADC_Init()中省略,在取值函数中每次重新配置序列数,以读取不同通道的值。(我们仍然使用的是单次,非扫描模式来实现的ADC多通道读取模拟值。)

第四步:配置ADC转化器,结构体配置。

	/*配置ADC转化器*/
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//独立模式
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right ;//右对齐模式
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//软件触发
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//非连续模式
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;//非扫描模式
	ADC_InitStruct.ADC_NbrOfChannel=1;
	
	ADC_Init(ADC1,&ADC_InitStruct);

第五步:开关控制,开始ADC;进行校准。

	/*开启ADC*/
	ADC_Cmd(ADC1, ENABLE);
	
	/*ADC校准*/
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1)==SET);//等待是否校准完成
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1)==SET);

取值函数:

/*单通道取值*/
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次(对应上文的单词,非连续模式,每次取值前软件重新触发)
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}

/*多通道取值*/
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
	ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);	//在每次转换前,根据函数形参灵活更改规则组的通道1
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}
//上文ADC初始化,是单通道的初始化;多通道配置多通道取值函数,再使能几个引脚即可。

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

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

相关文章

Web3.0安全开发实践:代理合约最佳实践总结

代理模式使智能合约能够升级其逻辑,同时维持其链上地址和状态值。对代理合约的调用会通过delegateCall的方式执行来自逻辑合约的代码,以修改代理合约的状态。 本文将为大家概述代理合约的类型、相关的安全事件和建议,以及使用代理合约的最佳…

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明: 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…

【人工智能基础05】决策树模型

文章目录 一. 基础内容1. 决策树基本原理1.1. 定义1.2. 表示成条件概率 2. 决策树的训练算法2.1. 划分选择的算法信息增益(ID3 算法)信息增益比(C4.5 算法)基尼指数(CART 算法)举例说明:计算各个…

数据结构与算法(排序算法)

我本将心向明月,奈何明月照沟渠。 排序的概念 1. 排序是指将一组数据,按照特定的顺序进行排列的过程。 2. 这个过程通常是为了使数据更加有序,从而更容易进行搜索、比较或其他操作。 常见的排序算法 插入排序 1. 把待排序的记录&#xff0c…

思科实现网络地址转换(NAT)和访问控制列表(ACL)和动态路由配置并且区分静态路由和动态路由配置。

实验拓扑(分为静态路由和动态路由两种) 静态路由互通 动态路由互通 实验背景 这个是想实现外网与内网的连接跟网络的探讨,最终实现互通以及使用并且在网络地址转换后能使用网络然后再这个基础上再配置访问控制列表和网络地址转换的的学习过程。 实验需了解的知识…

开发一套ERP 第八弹 RUst 插入数据

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…

课程答疑微信小程序设计与实现

私信我获取源码和万字论文,制作不易,感谢点赞支持。 课程答疑微信小程序设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了课程答疑微信小程序设计与实现的开发全过程。通过分析…

【时间之外】IT人求职和创业应知【53】-东莞也转型

目录 新闻一:Freysa挑战赛:人类智慧与策略战胜AI,奖金高达4.7万美元 新闻二:中国生成式AI用户规模突破2.3亿,行业应用广泛 新闻三:2024东莞智能终端新技术推广会圆满举行,聚焦AI与智能终端融…

ARP欺骗-监控网络

kali: 使用arp-scan -l 查看同个局域网 windows arp -a 查看地址的物理地址 192.168.21.2 对应的是00-50-56-f5-d5-f0 攻击利用: 我们要让目标ip的流量经过我的网卡,从网关出去 使用的开启 echo 1 > /proc/sys/net/ipv4/ip_forward 当为0时,我们不转发&…

Cesium 当前位置矩阵的获取

Cesium 位置矩阵的获取 在 3D 图形和地理信息系统(GIS)中,位置矩阵是将地理坐标(如经纬度)转换为世界坐标系的一种重要工具。Cesium 是一个强大的开源 JavaScript 库,用于创建 3D 地球和地图应用。在 Cesi…

网络编程项目1

基于TCP通信控制红色机械臂和蓝色机械臂的运作 1、项目要求&#xff1a;通过w&#xff08;红色臂角度增大&#xff09;s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09; #include <myhead.h> #…

使用GitZip for github插件下载git仓库中的单个文件

背景&#xff1a;git仓库不知道抽什么疯&#xff0c;下载不了单个文件&#xff0c;点击下载没有反应&#xff0c;遂找寻其他方法&#xff0c;在这里简单记录下。 使用GitZip for github插件下载仓库中的单个文件 1、首先在浏览器安装插件&#xff0c;并确保为打开状态。 2、然…

Y20030022基于PHP+MYSQL疫苗预约管理网站的设计与实现 源码 初稿

旅游度假区微信小程序 1.摘要2.研究背景和意义3. 系统功能4.界面展示5.源码获取 1.摘要 疫苗预约管理系统是为了提供一个高效、便捷、安全的平台&#xff0c;方便用户进行疫苗预约接种&#xff0c;并优化疫苗接种的管理工作。通过该系统&#xff0c;用户可以随时随地进行预约操…

C#中判断两个 List<T> 的内容是否相等

ET实现游戏中邮件系统逻辑思路&#xff08;服务端&#xff09;_游戏邮件系统设计-CSDN博客 场景&#xff1a;今天遇到一个BUG&#xff0c;在服务器重启的时候&#xff08;体验服&#xff09;&#xff0c;玩家之前接收的邮件又重新接收了一次&#xff0c;但是两封邮件的ID是不同…

算法编程题-优势洗牌

算法编程题-优势洗牌 原题描述方法一、排序二分查找思路简述代码实现复杂度分析 方法二、红黑树思路简述代码实现复杂度分析 方法三、贪心思路简述代码实现复杂度分析 摘要&#xff1a;本文将对LeetCode原题优势洗牌进行介绍&#xff0c;从最容易想到的方法开始&#xff0c;循序…

【从零开始的LeetCode-算法】3264. K 次乘运算后的最终数组 I

给你一个整数数组 nums &#xff0c;一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作&#xff0c;每次操作中&#xff1a; 找到 nums 中的 最小 值 x &#xff0c;如果存在多个最小值&#xff0c;选择最 前面 的一个。将 x 替换为 x * multiplier 。 请你…

ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.

看着这个报错 感觉是版本不对引起的 ERROR in [eslint] Invalid Options: - Unknown options: extensions - extensions has been removed. ERROR in Error: Child compilation failed: [eslint] Invalid Options: - Unknown options: extensions - extensions has b…

SpringCloud书单推荐

重新定义SpringCloud实战 129 疯狂SpringCloud微服务架构实战 SpringBootSpringCloud微服务开发实战 点餐系统 SpringCloud微服务架构实战派 日访问量3000W平台 SpringCloud Alibaba微服务原理与实战 Spring CloudNginx 极简spring cloud实战 Spring Cloud 微服…

试题转excel;试题整理工具;试卷转excel;word转excel

一、问题描述 我父亲是一名教师&#xff0c;偶尔会需要将试卷转excel&#xff0c;方便管理处理一些特别重要的题目 于是&#xff0c;就抽空写一个专门将试题转excel的工具&#xff0c;便于各位教师从业者和教育行业的朋友更好的整理试题&#xff0c;减少一点重复枯燥的工作 …

Node.js Fastify装饰器:提升你的API性能与功能

在Node.js的世界中&#xff0c;Fastify以其卓越的性能和插件化架构脱颖而出&#xff0c;成为构建高效API的首选框架之一。Fastify的装饰器功能&#xff0c;允许开发者以声明式的方式增强和扩展核心对象&#xff0c;如请求&#xff08;Request&#xff09;和响应&#xff08;Res…