STM32系列 ADC 模数转换器

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;									//转换总数 1
    	ADC1_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;		//禁止DMA
    	ADC1_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
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32系列 ADC 模数转换器

    发表评论