ADC的原理

news/2024/9/30 2:27:35 标签: 单片机, 嵌入式硬件

一、介绍

模数转换,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件,比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101,这样ADC就建立了模拟世界的传感器和数字世界的信号处理与数据转换的联系。当然,数字信号通过处理器处理后,也可以通过DAC还原回去,但是还原也不可能是百分百的,必然是有损的。
 

二、工作原理

ADC完成了模拟信号向数字信号的转变,实现ADC转换的器件主要包括下面4个过程:

采样——保持——量化——编码。

 

单个ADC的电路图

ADC引脚

名称信号类型注解
VREF+输入,模拟参考正极ADC使用的高端/正极参考电压, 2.4V ≤ VREF+ ≤ VDDA
VDDA(1)输入,模拟电源等效于VDD的模拟电源且: 2.4V ≤ VDDA ≤ VDD(3.6V)
VREF-输入,模拟参考负极ADC使用的低端/负极参考电压, VREF- = VSSA
VSSA(1)输入,模拟电源地等效于VSS的模拟电源地
ADCx_IN[15:0]模拟输入信号16个模拟输入通道



 

三、应用

在stm32中,12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。

各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在
校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换
中每个电容器上产生的误差。

下面使用stm32的ADC功能采集电压,只采集一次

#include "stm32f10x.h"                  // Device header

/**
  * 函    数:AD初始化
  * 参    数:无
  * 返 回 值:无
  */
void AD_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
	
	/*设置ADC时钟*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	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);					//将PA0引脚初始化为模拟输入
	
	/*规则组通道配置*/
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);		//规则组序列1的位置,配置为通道0
	
	/*ADC初始化*/
	ADC_InitTypeDef ADC_InitStructure;						//定义结构体变量
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,选择独立模式,即单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据对齐,选择右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部触发,使用软件触发,不需要外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//连续转换,失能,每转换一次规则组序列后停止
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//扫描模式,失能,只转换规则组的序列1这一个位置
	ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1
	ADC_Init(ADC1, &ADC_InitStructure);						//将结构体变量交给ADC_Init,配置ADC1
	
	/*ADC使能*/
	ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC开始运行
	
	/*ADC校准*/
	ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

/**
  * 函    数:获取AD转换的值
  * 参    数:无
  * 返 回 值:AD转换的值,范围:0~4095
  */
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转换的结果
}

 

参考:

ADC的工作原理 - 模拟技术 - 电子发烧友网

ADC的工作原理总结_adc原理-CSDN博客


http://www.niftyadmin.cn/n/5684088.html

相关文章

大模型+AIGC技术实操:GPT 大模型部署使用 AIGC实战落地方案

一、GPT大模型简介 GPT是基于Transformer架构的预训练语言模型,通过大规模的无监督学习,它已展现出了惊人的文本生成和理解能力。部署GPT大模型意味着将其融入到实际应用中,如智能写作、客服对话、内容推荐等领域。 二、GPT大模型部署步骤 …

(undone) 阅读 MapReduce 论文笔记

参考:https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf 摘要:简单介绍了 MapReduce 是在大型分布式系统上工作的 Introduction 的内容总结: 1.介绍背景:为什么我们需要分布式系统?MapReduce 的意义是哪些 2.简…

【AI创作组】Matlab简介

1. MATLAB 简介 1.1 科学计算语言 MATLAB是一种高性能的科学计算语言,广泛应用于工程计算、控制设计、信号处理和图形显示等领域。 语言特性:MATLAB语言简洁明了,接近自然数学语言,使得用户能够轻松编写数学表达式和算法,进行高效的数值计算和符号运算。计算能力:MATLA…

Qt+toml文件读写

Qttoml 使用 cpptoml 库示例Qt 项目中的代码示例解释注意事项 在Qt中使用TOML(Tom’s Obvious, Minimal Language)格式的文件,可以通过第三方库来实现,例如 cpptoml。TOML是一种易于阅读和写入的配置文件格式,与JSON和…

nodejs学习前的准备是环境搭建

Node.js 浏览器是 JavaScript 的前端运行环境。Node.js 是 JavaScript 的后端运行环境Node.js 中无法调用 DOM 和 BOM 相关的 API。 Node.js 可以做什么? 基于 Express 框架,可以快速构建 Web 应用。基于 Electron 框架,可以构建跨平台的桌…

深入剖析 Android Lifecycle:构建高效稳定的应用

在 Android 开发中,管理应用组件的生命周期是至关重要的。正确处理生命周期事件可以确保应用的性能、稳定性和用户体验。Android Framework 提供了一系列的机制来管理应用组件的生命周期,而android.arch.lifecycle库则为我们提供了更简洁、更灵活的方式来…

【JavaEE初阶】文件IO(下)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 文件内容操作 打开 关闭文件 文件描述符表 字节流 读文件 写文件 字符流 读文件 写文件 Scanner 示例一:通过scanner读取文件中的数字 示例二:扫描指定⽬录 示例三:实…

9.16上午10点,你在哪儿浪

还记得9月16日上午10点,你在哪儿浪吗? 别说上午10点,可能这一天去过哪里都不记得了吧? 9月16日上午10点,我在哪里? 不记得某一天去过哪里很正常,尤其是对你来说不是特别重要的日子&#xff0…