Cortex-M4-模数转换器

模数转换器概述

模数转换器用途

MCU(单片机)种只能处理数字量,但当外界输入模拟量信号时,单片机会通过模数转换器将模拟量信号转化成数字量信号供MCU处理,并且当MCU需要区分多种输入信号时,需要模数转换转换器多通道采集信号,转换成数字量给MCU。

模数转换器原理

模数转换器分为两个步骤: 采样+转换。
ADC:模数转换
ADC:将连续的模拟量转换成离散的数字量
DAC:数模转换
DAC:将离散的数字量转换成连续的模拟量

需要考虑的参数:价格 量程 精度 灵敏度 误差 分辨率………
分辨率:最小单元

示例:传感器测量电压(0~3.3v) 12位的 测量值=1000 电压值=??
(1/2^12) x 3.3 x 1000= 0.8056640625v

例如:转换时间=20us 频率:15MHz 采样周期=?
一个周期:1/15 us
总时间:20us
采样周期:20/(1/15)=300周期

分两种模式: 并联比较型+逐次逼近型

并联比较型:
  该种类型会将参考电压进行分压,并与模拟电压进行比较,输出比较相近的分压值的有效信号,其优缺点是转换比较快 ,数据不准确 ,数据较多较快时容易出问题。

由三个部分组成,分压电路+比较器+编码器
E:参考电压
Ux:模拟电压
举例:E=8V,Ux=3V, C比较器就会发现参考电压和模拟电压值相等,C有机会输出有效信号,最终编码器输出数字量3.

逐次逼近型:
  转换开始前先将所有寄存器清零。开始转换以后,时钟脉冲首先将寄存器最高位置成1,使输出数字为100…0。这个数码被D/A转换器转换成相应的模拟电压uo,送到比较器中与ui进行比较。若ui<uo,说明数字过大了,故将最高位的1清除;若ui>uo,说明数字还不够大,应将这一位保留。然后,再按同样的方式将次高位置成1,并且经过比较以后确定这个1是否应该保留。这样逐位比较下去,一直到最低位为止。比较完毕后,寄存器中的状态就是所要求的数字量输出。其优缺点是转换速度较慢,数据准确。

STM32的模数转换器

STM32的模数转换器简介


在我所学的401xE系列种只有一个ADC(ADC1) 挂靠在APB2(84MHz).
   12 位 ADC 是 逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。 ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。
19 个复用通道=16个外部(IO)+2个内部+1个Vbat
2个内部:
IN16—>温度检测
IN17—>参考电压检测(VREF)

ADC电源部分(独立电源):

器件的工作电压在1.8v~3.6v之间

为了提高转换精度, ADC 配有独立电源,可以单独滤波并屏蔽 PCB 上的噪声。
● ADC 电源电压从单独的 VDDA 引脚输入。
● VSSA 引脚提供了独立的电源接地连接。

模数转换器主要特性

可配置12位、10位、8位或6位分辨率
●在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
●单次和连续转换模式
●用于自动将通道 0 转换为通道“n”的扫描模式
●数据对齐以保持内置数据一致性
●可独立设置各通道采样时间
●外部触发器选项,可为规则转换和注入转换配置极性
●不连续采样模式
●双重/三重模式(具有 2 个或更多 ADC 的器件提供)
●双重/三重 ADC 模式下可配置的 DMA 数据存储
●双重/三重交替模式下可配置的转换间延迟
●ADC 转换类型(参见数据手册)
●ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V
●ADC 输入范围: VREF- ≤ VIN ≤ VREF+
●规则通道转换期间可产生 DMA 请求

模数转换器的框架


  16个外部通道可由GPIO口来采集模拟信号,也可通过定时器外部通道或外部中断线采集信号。

模数转换器功能说明

时钟:
ADC的电源要求:1.8~2.4v慢速运行 2.4~3.6v全速运行
ADC具有两个时钟方案:
1)数字接口时钟
APB2,使能/禁止使能ADC的时钟
2)模拟电路时钟(ADCCLK)
框图内描述的时钟、来自于APB2(84MHz)时钟,预分频器允许 ADC 在 fPCLK2/2、/4、 /6 或 /8 下工作。

选用慢速运行:最大允许时钟频率18MHz,ADCCLK最少进行6分频
选用快速运行:最大允许时钟频率36MHz,ADCCLK最少进行4分频

通道选择

规则转换: 如果有多个通道待转换、按照原设置的顺序(规则通道序列)进行一一转换
注入转换: 类似中断事件、有注入触发需要立马进行转换(优先转换),类似于中断
注入转换有多个时也是需要一一排队按照顺序转换
注:

  • 一个规则转换组最多由 16 个转换构成。必须在 ADC_SQRx 寄存器中选择转换序列的规则通道及其顺序。规则转换组中的 转换总数必须写入ADC_SQR1 寄存器中的L[3:0] 位。
  • 一个注入转换组最多由 4 个转换构成。必须在 ADC_JSQR 寄存器中选择转换序列的注入通道及其顺序。注入转换组中的转换总数必须写ADC_JSQR 寄存器中的L[1:0] 位。
单次转换模式

CONT=0可进入单次模式、ADC执行一次转换、以下方式可触发转换
1)将 ADC_CR2 寄存器中的 SWSTART 位置 1(仅适用于规则通道)
2)将 JSWSTART 位置 1(适用于注入通道)
3)外部触发(适用于规则通道或注入通道)
完成转换所选通道后
规则通道
1) 数据放到ADC_DR寄存器中
2) EOC转换标志置1
3) EOCIE位置1可产生中断
注入通道
1) 数据放到ADC_JDR寄存器中
2)JEOC转换标志置1
3)JEOCIE位置1可产生中断
完成上述操作ADC停止

连续转换模式

  在连续转换模式下,ADC 结束一个转换后立即启动一个新的转换。CONT 位为 1 时,可通过
外部触发或将 ADC_CR2 寄存器中的 SWSTRT 位置 1 来启动此模式(仅适用于规则通道)。
每次转换之后:
● 如果转换了规则通道组:
— 上次转换的数据存储在 16 位 ADC_DR 寄存器中
— EOC(转换结束)标志置 1
— EOCIE 位置 1 时将产生中
注: 无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自
动转换(使用 JAUTO 位)

扫描模式

  通过将 ADC_CR1 寄存器中的 SCAN 位置 1 来选择扫描模式。将此位置 1 后, ADC 会扫描
在 ADC_SQRx 寄存器(对于规则通道)或 ADC_JSQR 寄存器(对于注入通道)中选择的所有通道。为组中的每个通道都执行一次转换。每次转换结束后,会自动转换该组中的下一个通道。如果将CONT 位置 1,规则通道转换不会在组中最后一个所选通道处停止,而是再次从第一个所选通道继续转换

不连续采样模式

  可将 ADC_CR1 寄存器中的 DISCEN 位置 1 来使能此模式。该模式可用于转换含有 n (n ≤8)个转换的短序列,该短序列是在 ADC_SQRx 寄存器中选择的转换序列的一部分。可通过写
入 ADC_CR1 寄存器中的 DISCNUM[2:0] 位来指定 n 的值
例:
IN1 IN3 IN4 IN6 IN8
不连续采样:把长序列分为多个短序列
n—>一个短序列中的通道数
例如:n=3
第一次转换:IN1 IN3 IN4
第二次转换:IN6 IN8 EOCS

采样时间

  ADC 会在数个 ADCCLK 周期内对输入电压进行采样,可使用 ADC_SMPR1和ADC_SMPR2寄存器中的 SMP[2:0] 位修改周期数。每个通道均可以使用不同的采样时间进行采样
例: 计算温度传感器的采样周期

采样时间(Ts_temp) = 10us,时钟频率 = 21MHZ
则采样周期 = 10us/(1/21) = 210
在ADC_SMPR1的18~20位写入一个大于210周期的值
读取温度
温度(单位为 °C)= {(VSENSE — V25) / Avg_Slope} + 25
其中:
V25 = 25 °C 时的 VSENSE 值(VSENSE 为获得相应传感器的电压值)
VSENSE = (3.3xADC获取的值)/4096
Avg_Slope = 温度与 VSENSE 曲线的平均斜率(以 mV/°C 或 μV/°C 表示)

模数转换相关寄存器


配置流程:

  1. 打开时钟(ADC1)
  2. 打开温度传感器
  3. 扫描模式
  4. 不连续采样模式&n值
  5. 分辨率
  6. 转换模式(单次 连续)
  7. 转换结束标志(EOCS)
  8. 数据对齐
  9. 采样周期
  10. 转换顺序
  11. 转换总数
  12. 分频
  13. 使能ADC
  14. 读数据函数
    1)开启转换通道
    2)读取转换完成标志位
    3)读取数据寄存器
void ADC_Config(void)
{/**************************寄存器法***************************************************************/
//  RCC->APB2ENR |= (1<<8);       //打开ADC1时钟
//  ADC->CCR |= (1<<23);          //打开温度传感器
//  ADC1->CR1 &= ~(1<<8);         //扫描模式
//  ADC1->CR1 &= ~(3<<24);        //12位分辨率
//  ADC1->CR2 &= ~(1<<1);         //单次转换模式
//  ADC1->CR2 |= (1<<10);         //结束转换选择
//  ADC1->CR2 &= ~(1<<11);        //右对齐
//  ADC1->SMPR1 |= (7<<18);       //采样时间 480周期
//  ADC1->SQR1 &= ~(0xf<<20); //转换总数 1
//  ADC1->SQR3 |= (0x10<<0);  //转换序列第一次转换
//  ADC->CCR |= (1<<16);          //4分频
//
//  ADC1->CR2 |= (1<<0);          //使能ADC/**************************库函数法***************************************************************/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);   //打开ADC1时钟ADC_InitTypeDef ADC1_InitTypeDef;ADC1_InitTypeDef.ADC_ContinuousConvMode = DISABLE;              //单次转换模式ADC1_InitTypeDef.ADC_NbrOfConversion = 1;                                  //转换总数 1ADC1_InitTypeDef.ADC_Resolution = ADC_Resolution_12b;          //12位分辨率ADC1_InitTypeDef.ADC_DataAlign =  ADC_DataAlign_Right;     //右对齐ADC1_InitTypeDef.ADC_ScanConvMode = DISABLE;                          //结束转换选择ADC_Init(ADC1,&ADC1_InitTypeDef);ADC_CommonInitTypeDef ADC1_CommonInitTypeDef;ADC1_CommonInitTypeDef.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;       //禁止DMAADC1_CommonInitTypeDef.ADC_Mode = ADC_Mode_Independent;                                     //独立模式ADC1_CommonInitTypeDef.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;  //两个采样之间的时间ADC1_CommonInitTypeDef.ADC_Prescaler = ADC_Prescaler_Div4;  //4分频ADC_CommonInit(&ADC1_CommonInitTypeDef);ADC_TempSensorVrefintCmd(ENABLE);                                                      //打开温度传感器ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_480Cycles);//通道16 采样时间 480周期  转换序列第一次转换ADC_Cmd(ADC1,ENABLE);                                                                             //使能ADC
}

ADC模数转换器(STM32系列)相关推荐

  1. STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)

    本篇文章包含的内容 一.ADC 模数转换器 1.1 ADC简介 1.2 逐次逼近型ADC工作原理 1.3 STM32中的ADC基本结构 1.4 STM32中ADC的输入通道 1.5 STM32中的AD ...

  2. STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换

    目录 一.ADC 模数转换器 1.1ADC简介 1.2 逐次逼近型ADC工作原理 1.3STM32中的ADC基本结构 1.4STM32中ADC的输入通道 1.5STM32中的ADC的四种转换模式 1. ...

  3. STM32之ADC模数转换器单通道。

    ADC模数转换器 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁. 12位逐次 ...

  4. 嵌入式学习笔记——ADC模数转换器

    ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...

  5. STM32系列ARM单片机介绍

    STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex-M3内核.按性能分成两个不同的系列:STM32F103"增强型"系列和STM32F101 ...

  6. **浅谈STM32系列单片机的零基础学习方法**

    浅谈STM32系列单片机的零基础学习方法 *很多朋友想必在零基础学习STM32F1这系列单片机时会感觉无从下手,或者不知道写程序时到底是用库函数好还是寄存器好.* 我个人认为一个零基础的朋友可以通过以 ...

  7. STM32系列芯片命名规则——简明

    DIRECTORY STM32系列芯片命名规则 1.产品系列: 2.产品类型: 3.产品子系列: 4.管脚数: 5.Flash存储容量: 6.封装: 7.温度范围: STM32系列芯片命名规则 例图: ...

  8. Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  9. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

最新文章

  1. POJ3335(判断多边形内核是否存在)
  2. VS中每次改代码后运行程序不更新,只有重新编译才生效。
  3. hook 与aspectj_将AspectJ与NetBeans平台开发集成
  4. Huffman编码解码
  5. 我所理解的K8S(有彩蛋哦~)
  6. [导入]《交互设计之路——让高科技产品回归人性》读书笔记(九)
  7. ESX/ESXi 主机上的每个插槽中安装了多少内存
  8. jquery 判断是否是浮点数_jquery或者js获取到元素宽高精确到小数
  9. 在plc中用c语言实现电梯控制程序,三菱FX2N PLC电梯运行控制程序设计
  10. boot客户管理系统源码_「计算机毕设」基于SpringBoot开发的仓库管理系统
  11. shell awk学习3
  12. Mathematica处理高斯光束的分布图像
  13. 相似图片搜索——感知哈希算法
  14. 多台服务器集群部署方案
  15. java excel 数组公式_教你如何快速学习Excel数组公式及运用
  16. 用计算机计算圆的面积,周长直径换算器在线(圆的面积在线计算器)
  17. 如何区分apk游戏引擎
  18. Jetpack(七)—— Room
  19. 区块链研究生专业_“区块链大数据赋能低碳发展”高端研讨活动 在增城低碳总部举行...
  20. CGWallpapers网站不登录下载图片

热门文章

  1. 通向Golang的捷径【21. Go 语言的实际应用】
  2. 修改.srt格式字幕文件
  3. SOFR, So Far ... So Good?
  4. Netty总结(面试须知)
  5. 互联网创业公司的管理
  6. 【PythonPlanet】二手房产成交数据分析
  7. 031_onetab
  8. E450Think pad 开机亮红灯,无法启动修复
  9. WPS关闭不了后台一直运行的解决办法(wpscloudsvr.exe)
  10. Linux管道命令及管道相关命令(详细)