历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2018年08月14日 | STM32F103ZET6 — ADC

2018-08-14 来源:eefocus

介绍

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


推荐阅读

史海拾趣

Data Delay Devices公司的发展小趣事

在竞争激烈的电子行业中,质量管理是企业生存和发展的关键。DDD公司高度重视产品质量管理,建立了完善的质量管理体系和检测机制。公司从原材料采购、生产过程到成品检验都实行严格的质量控制,确保每一件产品都符合客户的要求和行业标准。这种对质量的执着追求使得DDD公司的产品在市场上赢得了良好的口碑和信誉。

BOOKLY公司的发展小趣事

在电子行业的激烈竞争中,BOOKLY公司以其卓越的技术创新能力脱颖而出。公司初创时,仅是一个由几位电子工程师组成的小团队,专注于研发高效能、低功耗的芯片技术。经过数年的艰苦努力,BOOKLY成功推出了一款颠覆性的芯片产品,被广泛应用于智能手机和电脑领域,迅速赢得了市场份额。此后,公司不断投入研发,拓展产品线,逐渐在电子行业建立了自己的品牌地位。

Datalogic公司的发展小趣事

随着公司业务的不断发展,Datalogic意识到全球市场的巨大潜力。从2000年代开始,公司加快了全球化步伐,通过设立销售和服务中心,覆盖了全球100多个国家。这种全球布局不仅使Datalogic能够更好地服务全球客户,还为公司带来了更多的市场机会。

Electroswitch公司的发展小趣事

在80年代,Electroswitch迎来了一个重要的技术突破期。公司成功开发了一系列符合MIL规格的旋转开关,这些产品凭借其坚固耐用和高品质的特性,迅速赢得了市场的认可。同时,Electroswitch还积极适应新的生产线,不断扩大在工业和电气实用市场的份额。此外,公司还成功收购了西屋电气开关部,进一步增强了其在电力行业中的竞争力。

Adafruit公司的发展小趣事

面对快速变化的电子行业环境,Electroswitch始终保持着敏锐的洞察力和创新精神。公司不断加大对新技术和新产品的研发力度,推出了一系列具有领先水平的开关产品。同时,公司还积极探索新的业务领域和市场机会,为未来的发展做好充分准备。展望未来,Electroswitch将继续秉承“质量、选择、产品创新和出色的支持”的理念,为客户提供更加优质的产品和服务。

请注意,以上故事框架仅供参考,您可以根据这些框架进一步扩展和丰富故事内容。

HP(Keysight)公司的发展小趣事

进入21世纪后,Electroswitch开始积极实施国际化战略。公司通过收购和兼并等方式,不断拓展海外市场。同时,公司还加强了与国际知名企业的合作,共同开发新产品和新技术。这些举措使得Electroswitch的国际化水平得到了显著提升,也为公司的未来发展奠定了坚实的基础。

问答坊 | AI 解惑

各种版本PROTEL的常用快捷键一览

在设计过程中,速度是很重要的,如果单用鼠标进行操作,不但单手负担太重容易麻木疲劳而且效率低下。为此Protel提供了极为方便的快捷方式。两手配合操作与单手操作的效率相比远不止翻倍。 以下是一些常用的快捷键: Page Up 以鼠标为中心放大 ...…

查看全部问答>

飞思卡尔单片机ps2键盘demo

原文见我在ednchina的博客:http://blog.ednchina.com/bluehacker/240730/Message.aspx这个程序是NSS08Kit-R1开发板上的PS2接口演示程序,通过PS2接口连接普通PC键盘,MC9S08AC16读用户按键的值。 下面是ps2keyboard.c文件,驱动程序 /****** ...…

查看全部问答>

关于USB组件定制及USB PCI打印机问题

大家好,来咱论坛有一阵子了,这是我头一次发贴,我是WINCE的新手,问的问题很初级幼稚,希望大家能给点帮助,有时你们的一句话,就会让我受益良多!谢谢!我现在正在做一个医疗器械的项目要用到WINCE 4.2系统,我现在在定制所需的系统,以及要解决 ...…

查看全部问答>

at89s52与at89c51

我想把c51的程序移植到s52上,需要注意什么问题呢,我仿真了一下,发现定时器0的中断貌似已经不能用了………

查看全部问答>

菜鸟问问题

我现在用DZ96的学习板,试了一下CAN 程序,两块学习板之间可以连通,学习板和自己画的板之间就不能连通了 我看了程序发现没有MCG时钟设置,那么应该说明它是用的内部时钟,我找了一天的数据手册也不知道内部时钟的频率是多少或是该怎么计算 请问 ...…

查看全部问答>

5438中关于SPI的问题

中间那条线上信号的方向是由从机到主机,是说明从机控制主机的UCxSTE位吗? 可是我觉得应该是人为的在程序中决定主机工作还是不工作,有点糊涂,请高手讲一下  …

查看全部问答>

关于系统电源防接反保护电路的问题

最简单防止接反的方法也就是在电源处加上二极管来防止接反,但这种二极管应该选择哪种型号的二极管呢?是否应该要选择开启电压非常稳定的二极管,开启后,电压几乎不随整机电流而变化的二极管。可这种几乎像理想二极管的二极管会有哪些型号呢?谢谢 ...…

查看全部问答>

会要用到瑞萨的产品吗

13年要用瑞萨的芯片,可是平时就没用过,好担心今年又是指定芯片。。。 …

查看全部问答>

我通过protues软件画完了原理图,转化成PCB图后,发现就剩蜂鸣器没有封装,

我通过protues软件画完了原理图,转化成PCB图后,发现就剩蜂鸣器没有封装,从网上查了后发现,要自己画封装然后在导入到pcb图中,求用protues画蜂鸣器的封装教程,谢谢,求大神解答 …

查看全部问答>