STM32F103ZET6 — ADC

发布者:sdlg668最新更新时间:2018-08-14 来源: eefocus关键字:STM32F103ZET6  ADC 手机看文章 扫描二维码
随时随地手机看文章

介绍

STM32F103ZET6 拥有12位ADC,是一种逐次逼近型模拟数字转换器。

12bits ADC 代表了 ADC 的转换精度。存在输入参考电压的情况下,ADC 将模拟信号经信号线输入,进行模拟信号的采样,再将采样后的数字信号存放于数据寄存器中,以供软件进行读取(CPU或者DMA方式),存储的数据是经过参考电压比较后,按照12bits 进行换算得到。

ADC输入范围:Vref- ≤ Vin ≤ Vref+


ADC 时钟

ADC 的输入时钟 ADCCLK 不能超过 14MHz(Datasheet规定)它是由PCLK2经分频产生。


转换模式

支持单次转换和连续转换,顾名思义,单次转换就仅仅只进行一次转换,然后就将值写入数据寄存器,连续转换时不间断的进行ADC操作,并将值写入到数据寄存器。


通道描述

ADC有两组通道:规则通道组和注入通道组。

规则通道组:相当于你正常运行的程序。

注入通道组:就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。 

也就是说,注入通道可以来打断当前正在进行的规则的 ADC 数据转换,暂时理解成为优先级的概念即可。

● 规则通道组:由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。 

● 注入通道组:由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。 

也就是说,在规则通道组,支持 16 路模拟信号同时输入,并进行这些通道的模拟信号转数字信号的采样,注入通道也是一样。



中断描述

● 如果一个规则通道被转换:
─  转换数据被储存在16位ADC_DR寄存器中
─  EOC(转换结束)标志被设置

─  如果设置了EOCIE,则产生中断。

● 如果一个注入通道被转换:
─  转换数据被储存在16位的ADC_DRJ1寄存器中
─  JEOC(注入转换结束)标志被设置
─  如果设置了JEOCIE位,则产生中断。


中断事件事件标志  使能控制位
规则组转换结束EOCEOCIE
注入组转换结束JEOCJEOCIE
设置了模拟看门狗状态位AWDAWDIE


通道扫描

此模式用来扫描一组模拟通道。

扫描模式可通过设置 ADC_CR1 寄存器的 SCAN 位来选择。一旦这个位被设置,ADC 扫描所有被 ADC_SQRX 寄存器(对规则通道)或 ADC_JSQR (对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中


校准

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

建议在每次上电后执行一次校准。

启动校准前, ADC 必须处于关电状态 (ADON=’0’) 超过至少两个 ADC 时钟周期。


采样时间

ADC 的转换时间不仅仅和 ADC 的时钟有关,还和采样时间有关,ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过 ADC_SMPR1 和 ADC_SMPR2 寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。

ADC  的转换时间的计算公式是:Tconv = 采样时间+ 12.5个周期

例如:当ADCCLK=14MHz,采样时间为1.5周期,Tconv = 1.5 + 12.5 = 14周期 = 1μs


环境描述

参考电压中,单板上Vref-直接接到了 GND,Vref+接到了Vcc 3.3V。

单板上,使用分压电阻进行模拟输入,电阻可调,并使用 PC1 端口进行输入



配置过程

配置过程分为三段:

● GPIO 口的配置

● DMA 的配置

● ADC 的配置

GPIO 口的配置


static void SK_ADC1GPIOInit(void)
{
    GPIO_InitTypeDef stGpioInit;
 
    /* Enable ADC1 and GPIOC clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
 
    /* Configure PC.01  as analog input */
    stGpioInit.GPIO_Pin = GPIO_Pin_1;
    stGpioInit.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOC, &stGpioInit);
}

DMA 的配置

DMA配置,使用了 DMA1 通道,故配置 DMA1 的相关寄存器:


1. 开启 DMA1 时钟

2. 复位 DMA1

3. 配置外设地址和数据传送的内存地址

4. 数据传送方向为外设-->内存

5. 数据传送大小为 1 个(half word,16bit)

6. 关闭内存和外设地址增长

7. 配置内存数据和外设数据宽度为 16bit

8. 配置循环模式

9. 配置优先级,同时禁用mem2mem

static void SK_ADC1DMAInit(void)

{

    DMA_InitTypeDef stDMA_Init;

 

    /* Enable DMA clock */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 

    /* DMA channel1 configuration */

    DMA_DeInit(DMA1_Channel1);

 

    stDMA_Init.DMA_PeripheralBaseAddr = ADC1_DR_Address;

    stDMA_Init.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;

    stDMA_Init.DMA_DIR = DMA_DIR_PeripheralSRC;

    stDMA_Init.DMA_BufferSize = 1;

    stDMA_Init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    stDMA_Init.DMA_MemoryInc = DMA_MemoryInc_Disable;

    stDMA_Init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    stDMA_Init.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

    stDMA_Init.DMA_Mode = DMA_Mode_Circular;

    stDMA_Init.DMA_Priority = DMA_Priority_High;

    stDMA_Init.DMA_M2M = DMA_M2M_Disable;

 

    DMA_Init(DMA1_Channel1, &stDMA_Init);

    /* Enable DMA channel1 */

    DMA_Cmd(DMA1_Channel1, ENABLE);

}


ADC 的配置


由于测试的应用场景较为简单,很多用法都用不到,故在配置的时候,就没有使能:


比如模拟看门狗,注入转换,双 ADC 等等,这里只使用了最简单的单通道的 ADC

配置流程如下:

1. 首先配置 ADC 时钟,由于 ADC 的时钟最大支持 14MHz,系统主频为 72MHz,分给  PCLK2 也为 72MHz,而 ADC 的分频器支持的分频系数仅为:2/4/6/8,暂时设置成为 8 分频,即 72/8 = 9MHz


2. 配置 ADC 为独立模式(双模式选择中配置)

3. 关闭 SCAN 模式(多路 ADC 使用到,单路就暂时不用)

4. 开启连续转换模式

5. 关闭外部触发,由软件独立触发

6. 数据右对齐

7. 转换通道数目为 1个规则通道

由于这里没有使用到注入通道和外部触发,所以少配置很多寄存器。

8. 配置 ADC 1的 Ch11 的采样时间和规则采样的通道数目

9. 开启 ADC1 的 DMA

10. 开启并唤醒 ADC1

11. 初始化校准寄存器并进行 ADC1 的校准


void SK_ADC1Init(void)

{

    ADC_InitTypeDef stADC_Init;

 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

 

    /// Step 1 : Configure I/O Pin First

    SK_ADC1GPIOInit();

 

    /// Step 2 : Configure DMA

    SK_ADC1DMAInit();

 

    /// Step 3 : PCLK2 div in 8, ADC CLK => 9Mhz

    RCC_ADCCLKConfig(RCC_PCLK2_Div8);

 

    /// Step 4 : Configure Basic function of ADC1

    stADC_Init.ADC_Mode = ADC_Mode_Independent;

    stADC_Init.ADC_ScanConvMode = DISABLE;

    stADC_Init.ADC_ContinuousConvMode = ENABLE;

    stADC_Init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    stADC_Init.ADC_DataAlign = ADC_DataAlign_Right;

    stADC_Init.ADC_NbrOfChannel = 1;

    ADC_Init(ADC1, &stADC_Init);

 

    /// Step 5 : Configure Ch11 sample rate

    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);

 

    /// Step 6 : Enable ADC1 DMA

    ADC_DMACmd(ADC1, ENABLE);

 

    /// Step 7 : Enable ADC1

    ADC_Cmd(ADC1, ENABLE);

 

    /// Step 8 : Reset Calibration Register

    ADC_ResetCalibration(ADC1);

    while(ADC_GetResetCalibrationStatus(ADC1));

 

    /// Step 9 : Start Calibration

    ADC_StartCalibration(ADC1);

    while(ADC_GetCalibrationStatus(ADC1));

 

    /// Step 10 : Software trigger ADC1

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

最后别忘了,12 bit 精度对应的是 4096 的颗粒度,即,将得到的数字划分成为 4096 份,转换成为电压的话,就是:


(float)ADC_ConvertedValue/4096*3.3


关键字:STM32F103ZET6  ADC 引用地址:STM32F103ZET6 — ADC

上一篇:STM32F103ZET6 时钟(2)—— 代码篇
下一篇:STM32F103ZET6 — EXTI

推荐阅读最新更新时间:2024-03-16 16:11

24位高精度模数转换器ADSl258的原理应用
  1 概述   ADSl258是TI公司推出的一款高精度、低功耗、低噪声的16通道(多路复用的)24位△一∑型模数转换器(ADC),其内部集成了输入多路复用器、模拟低通滤波器、数字滤波器等功能。内部有多种控制寄存器,用户通过不同的配置得到不同的A/D采样速率、采样模式、A/D转换精度等。适用于对性能、功耗要求高、模拟通道要求多的数据采集系统。   2 ADSl258主要特点及引脚功能   2.1 主要特点   △一∑ADC,24位转换精度,定通道采样速率为125 Ks/s(可编程),自动通道检测通道采样速率为23.7 Ks/s(可编程);   模拟输入多路复用器可配置成8路差分输入或16路单极输入。多路复用器的输出
[模拟电子]
24位高精度<font color='red'>模数转换器</font>ADSl258的原理应用
基于stm32f103zet6的串口学习
进行串口配置的步骤 一、初始化GPIO,配置GPIO模式 一个结构体 GPIO_InitTypeDef{ GPIOMode_TypeDef GPIO_Mode//GPIO模式,输入,输出? uint16_t GPIO_Pin //哪个管脚? GPIOSpeed_TypeDef GPIO_Speed//输出响应速度?如果为输入则可以不设置 } //GPIO_Mode包括以下几种方式 Enumerator: 枚举类型 GPIO_Mode_AIN //模拟输入 GPIO_Mode_IN_FLOATING //悬浮输入 GPIO_Mode_IPD //下拉输入 GPIO_Mode_IPU //上拉输入 GPIO_Mode_Out_
[单片机]
LPC1343内部ADC的使用
本节来讲述LPC1343内部ADC的使用。设计一个实验,使用ADC的0通道进行AD转换,并且将转换结果通过UART发送在PC端的串口终端软件观察。 这次仍然以NXP提供的example作为例子,但是LPC1343内部ADC工作方式众多,所以该example用了许多的预编译结构,笔者在此将本次实验不会用到的语句全部去掉,程序变得简洁,也更易于理解。 同样的,在此节中将不再将所用到的寄存器一一列出,而只是一个各个寄存器设置的 线索 ,因为至此各个读者一定已经拥有了自己翻阅用户手册查看对应寄存器内容的能力。 从主函数我们可以看出本次实验的进展过程: int main (void) { uint32_t i,j;
[单片机]
STM32f407的数字采集电路ADC的设计与使用
(1)简介 stm32 具有2路12位的ADC,具有18个通道(其中两个为内部通道)。各通道 的 ADC转换可以单次,连续,扫描或者间断模式执行。 ADC的数据可以选择左对齐或者右对齐存储在16位的数据寄存器里面。 其中模拟看门狗可以检查输出的电压是否在设定的范围内。 (2)ADC的主要技术指标 分辨率:12分辨率,不能够测量负压,无符号。做小的量化单位LSB=Vref+/2^12. 0-3.3V 时每份度为0.805mV 0-10V 时10V/4096=2.44mv 转换时间: 采样一次至少14个时钟周期,ADC的时钟频率最高14MHZ,也就是说最短时间1us.理论上可以采样50
[单片机]
ATtiny13A ADC查询法使用
void adc_init(void) { ADCSRA = 0x00; //禁用ADC ADMUX = 0x03; ACSR = 0x80; //禁用模拟比较器 ADCSRB = 0x00; ADCSRA = 0x83; } uint read_adc(void) { uint temp = 0; ADCSRA |= (1 ADSC); //使能AD转换,第一次转换,结果丢弃 while((ADCSRA & (1 ADIF)) == 0); //等待AD转换结束 ADCSRA |= (1 ADIF); //ADIF写1用来清除ADIF,规格书上要求的 ADCSRA |= (1
[单片机]
AVR之简单的ADC程序
最近看了ATmega16的ADC,写下这个简单的程序,了解下ADC的简单控制。 程序用Proteus仿真的,用的是ICCAVR7 的编译器(头文件有所不同,自己掂量) 程序的内容是:通过PA1外部电压的读入并动态的显示在3位数码管上 #include iom16v.h #include AVRdef.h unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9 void display(unsigned char smg); unsigned char temp; void delay_1ms(unsigned int z
[单片机]
低功耗ADC实现“绿色”采集方案
很久以前,精确的电气测量是在原始实验室环境中进行的,在这类环境中具有充足的电力供应,时间分配也能确保极高的准确性。而今天,人们希望将仪表携带到现场,让其靠电池电源运行,甚至立即实现更高的准确性。模拟电路与数字电路不同,它不会从较小几何尺寸产生的尺度效应中受益。如果功率消耗较少,那么噪声(精确测量的大敌)实际上将会增加。可以理解,随着新低压工艺的出现,信噪比(SNR)将变得更差,因为信号幅度在减小。那么,在提高性能的同时,模拟信号链怎样才能"走向绿色"呢?   很多高速仪表的核心是一个高速模数转换器( ADC )。例如:金属物体的非破坏性测试就采用了一种类似于医疗超声的成像方法,采用这种方法时,数字图像传感器为高速ADC馈送信号。在
[嵌入式]
ADC输出转换采样生成FFT图详解
可以通过周期性地收集大量的 ADC 输出转换采样来生成 FFT图。一般而言,ADC 厂商们将一种单音、满量程模拟输入信号用于其产品说明书的典型性能曲线。您从这些转换获得数据,然后绘制出一幅与图 1 相似的图。该图的频率标度始终为线性,从零到 1/2 转换器采样频率。      图 1 FFT 图中 12 位转换器共有 4096 个数据集。   通过将一个 100ksps 的采样频率应用到一个 9.9 kHz 模拟输入信号的12 位 ADC,您可以得到图1中的FFT图。9.9 kHz 下的信号便为基本输入信号 (A)。该基本输入信号寄生接近于 0 dB。   FFT 图中4条规范包括基本输入信号、信噪比、总谐波失真
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved