当前位置: 首页 > news >正文

ADC的原理

一、介绍

模数转换,即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;		//模式,选择独立模式,即单独使用ADC1ADC_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的数,在非扫描模式下,只能是1ADC_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.mrgr.cn/news/39219.html

相关文章:

  • 二进制字符串的和
  • spring boot项目对接人大金仓
  • CSS 的color-adjust 属性,是给打印机节省墨水的属性
  • 计数排序(counting sort)
  • 文件传输工具 | 闪电藤 v2.5.5 绿色版
  • MFC工控项目实例之十八手动测试界面输入信号实时检测
  • 算法:852.山脉数组的峰顶索引
  • Windows Defender 强力删除工具 Defender Remover 下载
  • 网络游戏通信方案概述
  • Python NumPy 标准数据生成:高效创建与操作数组
  • 泛型中的通配符<?>、<? extends T>、<? super T>的使用场景。ArrayList与LinkedList的区别及适用场景。
  • 计算机知识科普问答--22(106-110)
  • 【Android 14源码分析】Activity启动流程-2
  • LeetCode 每日一题 买票需要的时间
  • 不同的子序列
  • elastic search 后端启动成功标志(二)
  • NLP任务之预测最后一个词
  • 程序员数学 | 用递归将复杂的问题简单化(上)
  • 企业如何提升知识产权管理效率?
  • rocketmq集群模式介绍