历史上的今天
返回首页

历史上的今天

今天是:2024年12月08日(星期日)

正在发生

2020年12月08日 | STM32——ADC

2020-12-08 来源:elecfans

一、ADC指标

        有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 ;ADC的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中 ;模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高 / 低阈值。

对于 ADC 来说,我们最关注的就是它的分辨率、转换时间、ADC 类型、参考电压范围:

(1)分辨率:12 位分辨率。不能直接测量负电压,所以没有符号位,即其最小量化单位 LSB= Vref+ / 212 。

(2)转换时间:转换时间是可编程的。采样一次至少要用 14 个 ADC 时钟周期,而 ADC 的时钟频率最高为 14MHz,也就是说,它的采样时间最短为 1us。足以胜任中、低频数字示波器的采样工作。

(3)ADC类型:STM32 的是逐次比较型 ADC。

(4)参考电压

        STM32的 ADC 是不能直接测量负电压的,而且其输入的电压信号的范围为 :V REF- ≤ V IN ≤ V REF+。当需要测量负电压或测量的电压信号超出范围时,要先经过运算电路进行平移或利用电阻分压。

 

二、ADC工作过程

        输入信号经过这些通道被送到 ADC 部件,ADC 部件需要受到触发信号才开始进行转换,如 EXTI 外部触发、定时器触发,也可以使用软件触发。ADC 部件接收到触发信号之后,在 ADCCLK 时钟的驱动下对输入通道的信号进行采样,并进行模数转换,其中ADCCLK 是来自 ADC 预分频器的。

        ADC 部件转换后的数值被保存到一个 16 位的规则通道数据寄存器(或注入通道数据寄存器)之中,我们可以通过 CPU 指令或 DMA 把它读取到内存(变量)。模数转换之后,可以触发 DMA 请求或者触发 ADC 的转换结束事件。如果配置了模拟看门狗,并且采集得的电压大于阈值,会触发看门狗中断。

 

三、ADC采集数据【DMA模式】

        在 STM32 中,使用 ADC 时往往采用 DMA 传输方式,由 DMA 把 ADC 外设转换的数据传输到 SRAM,再进行处理,甚至直接把 ADC 的数据转移到串口发送给上位机。【中断效率还是不够】

1、配置GPIO端口

        配置完成 ADC 及 DMA 后,ADC 就不停地采集数据,而 DMA自动地把 ADC 采集的数据转移至内存中的变量 ADC_ConvertedValue 中,所以在 main 函数的 while 循环中使用的 ADC_ConvertedValue都是实时值。 

/*

使能 DMA 时钟、GPIO 时钟及 ADC1 时钟。然后把 ADC1 的通道 11 使用的 GPIO 引脚 PC1 配置成模拟输入模式,在作为 ADC 的

输入时,必须使用模拟输入。每个 ADC 通道都对应一个 GPIO 引脚端口,GPIO 的引脚在设置为模拟输入模式后可用于模拟电压的输入。

*/

static void ADC1_GPIO_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* 使能DMA时钟 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE); /* 使能ADC和GPIOC时钟 */

 

  /* 配置PC1位模拟输入,输入模式不用设置速率 */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

}



2、配置DMA和ADC模式

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;

 

typedef struct

{

  uint32_t ADC_Mode;

  FunctionalState ADC_ScanConvMode;

  FunctionalState ADC_ContinuousConvMode;

  uint32_t ADC_ExternalTrigConv;

  uint32_t ADC_DataAlign;

  uint8_t ADC_NbrOfChannel;

} ADC_InitTypeDef;

(1)ADC_Mode:用于测量电阻分压后的电压值,要求不高,只使用一个 ADC 就可以满足要求了,所以本成员被赋值为 ADC_Mode_Independent (独立模式)。


(2)ADC_ScanConvMode:当有多个通道需要采集信号时,可以把 ADC 配置为按一定的顺序来对各个通道进行扫描转换,即轮流采集各通道的值。


(3)ADC_ContinuousConvMode:连续转换模式,此模式与单次转换模式相反,单次转换模式 ADC 只采集一次数据就停止转换。而连续转换模式则在上一次 ADC 转换完成后,立即开启下一次转换。


(4)ADC_ExternalTrigConv:ADC 需要在接收到触发信号后才开始进行模数转换,如外部中断触发(EXTI 线)、定时器触发,这两个为外部触发信号,如果不使用外部触发信号可以使用软件控制触发 。


(5)ADC_DataAlign:数据对齐方式。


(6)ADC_NbrOfChannel:这个成员保存了要进行 ADC 数据转换的通道数,可以为1 ~ 16 个。


        填充完结构体,就可以调用外设初始化函数进行初始化了,ADC 的初始化使用ADC_Init() 函数,初始化完成后别忘记调用 ADC_Cmd() 函数来使能 ADC 外设,用ADC_DMACmd() 函数来使能 ADC 的 DMA 接口。


/*

ADC 的 DMA 配 置 部 分 与 串 口 DMA 配 置 部 分 类 似, 它 的 DMA 整 体 上 被 配置 为 : 使 用 DMA1 的 通 道 1 , 数 据 从 ADC 外 设 的 数 据 寄 存 器

(ADC1_DR_Address) 转 移 到 内 存(ADC_ConvertedValue 变量),内存、外设地址都固定,每次传输的数据大小为半字(16 位),使用 DMA 循环传输模式。

*/

static void ADC1_Mode_Config(void)

{

  DMA_InitTypeDef DMA_InitStructure;

  ADC_InitTypeDef ADC_InitStructure;

 

  DMA_DeInit(DMA1_Channel1); /* DMA通道1 */

 

  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC 地址

  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //内存地址

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 1;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //内存地址固定

 

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环传输

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

 

  DMA_Cmd(DMA1_Channel1, ENABLE); /* 使能DMA通道1 */

 

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立 ADC 模式

  ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止扫描模式,扫描模式用于多通道采集

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行 ADC 转换

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐

  ADC_InitStructure.ADC_NbrOfChannel = 1; //要转换的通道数目 1

  ADC_Init(ADC1, &ADC_InitStructure);

 

  RCC_ADCCLKConfig(RCC_PCLK2_Div8);  /*配置 ADC 时钟,为 PCLK2 的 8 分频,即 9MHz*/

  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1,  ADC_SampleTime_55Cycles5);  /*配置 ADC1 的通道 11 为 55. 5 个采样周期,序列为 1 */

 

  ADC_DMACmd(ADC1, ENABLE); /* 使能ADC1 */

  ADC_Cmd(ADC1, ENABLE);

 

  ADC_ResetCalibration(ADC1);  /*复位校准寄存器 */

  while(ADC_GetResetCalibrationStatus(ADC1));  /*等待校准寄存器复位完成 */

 

  ADC_StartCalibration(ADC1);  /* ADC 校准 */

  while(ADC_GetCalibrationStatus(ADC1));  /* 等待校准完成*/

 

  ADC_SoftwareStartConvCmd(ADC1, ENABLE);  /*  由于没有采用外部触发,所以使用软件触发 ADC 转换  */

}


3、ADC转换时间


       PCLK2 的常用时钟频率为 72 MHz,而 ADCCLK 必须低于 14 MHz,所以在这个情况下,ADCCLK 最 高 频 率 为 PCLK2 的 8 分 频, 即 ADCCLK=9 MHz。 若 希 望 使 ADC以 最 高 频 率 14 MHz 运行,可以把 PCLK2配置为 56 MHz,然后再 4 分频得到ADCCLK。

       ADC 的转换时间不仅与 ADC 的时钟有关,还与采样周期相关。每个不同的 ADC 通道都可以设置为不同的采样周期。

4、ADC自校准

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

5、计算电压值

实际电压值 = ADC转换值 ×LSB;STM32 的 ADC 的精度为 12 位,而中 V REF+ 接的参考电压值为 3.3V ,所以 LSB =3.3/212 。


上一篇:STM32——DMA

下一篇:STM32——I2C

推荐阅读

史海拾趣

Alpha-Micro Electronics公司的发展小趣事

Alpha-Micro Electronics是一家提供嵌入式系统解决方案的公司,专注于设计和制造微控制器、传感器和其他嵌入式设备。以下是关于Alpha-Micro Electronics公司发展的五个相关故事:

  1. 公司成立:Alpha-Micro Electronics公司成立于1982年,总部位于德国斯图加特。公司的创始人是一群电子工程师,他们致力于为各种应用领域提供高性能的嵌入式系统解决方案。

  2. 技术创新:在公司创立之初,Alpha-Micro Electronics就开始致力于技术创新。他们不断投资于研发,推出了一系列先进的微控制器和传感器产品,以满足客户对功能强大和性能稳定的需求。

  3. 解决方案定制:Alpha-Micro Electronics公司注重与客户的紧密合作,提供定制化的解决方案。他们的工程团队具有丰富的经验和专业知识,能够根据客户的具体要求设计和制造符合其需求的嵌入式系统。

  4. 国际扩展:随着业务的不断发展,Alpha-Micro Electronics逐渐拓展了国际市场。除了在德国的总部和研发中心外,公司还在全球范围内建立了销售和服务网络,包括在美国、亚洲和欧洲的分支机构和合作伙伴。

  5. 行业合作与创新:Alpha-Micro Electronics公司积极参与行业合作和创新项目,与其他企业、研究机构和学术界合作,共同推动嵌入式技术的发展。通过与行业领先者合作,公司不断探索新的技术和应用领域,为客户提供更具竞争力的解决方案。

这些故事展示了Alpha-Micro Electronics公司在技术创新、解决方案定制、国际扩展和行业合作方面的发展历程,以及其在电子行业中的重要地位和影响力。

GSME Electronics公司的发展小趣事

随着公司业务的不断拓展和市场竞争的日益激烈,GSME Electronics开始实施国际化战略。公司积极参与国际市场竞争,加强与国外客户的合作与交流,不断提升产品的国际竞争力。同时,公司还注重品牌建设,通过提升产品质量和服务水平,树立了良好的品牌形象。如今,“桂微牌”产品已经在国内外市场上赢得了广泛的认可度和美誉度,为公司未来的发展奠定了坚实的基础。

Andon Electronics公司的发展小趣事

随着公司业务的不断拓展和市场竞争的日益激烈,GSME Electronics开始实施国际化战略。公司积极参与国际市场竞争,加强与国外客户的合作与交流,不断提升产品的国际竞争力。同时,公司还注重品牌建设,通过提升产品质量和服务水平,树立了良好的品牌形象。如今,“桂微牌”产品已经在国内外市场上赢得了广泛的认可度和美誉度,为公司未来的发展奠定了坚实的基础。

Digi International公司的发展小趣事

Digi International与UR集团达成了战略协议,共同关注铁路、公共汽车和智慧城市等领域的发展。这一合作不仅为公司带来了新的市场机会,也促进了其在智能交通系统领域的业务拓展。通过与UR集团的紧密合作,Digi International的智能铁路解决方案在英国市场上得到了广泛应用,提高了铁路运输的效率和安全性。

Ho Chien Electronics Group Inc公司的发展小趣事

Digi International与UR集团达成了战略协议,共同关注铁路、公共汽车和智慧城市等领域的发展。这一合作不仅为公司带来了新的市场机会,也促进了其在智能交通系统领域的业务拓展。通过与UR集团的紧密合作,Digi International的智能铁路解决方案在英国市场上得到了广泛应用,提高了铁路运输的效率和安全性。

GuangDong Province MengCo Semiconductor Co., Ltd公司的发展小趣事
长时间或大电流制动可能导致制动电阻过热,影响使用寿命。

问答坊 | AI 解惑

推荐学习模电的一个好网站

对射频技术感兴趣的同学,不妨到矿石收音机论坛去看看,特别是里面的矿石机专栏。在那里有许多退休或即将退休的老人,其中有的人的本职工作是微波电路设计,但是在矿坛里确实玩性正浓。他们对矿石收音机的研究,恐怕我们是想像不到的。 一个线圈, ...…

查看全部问答>

【藏书阁】被导电磁波原理

目录: 第一章 波导理论的数学 第二章 基本电磁理论 第三章 传输线 第四章 波导的基础理论 第五章 空腔谐振器 第六章 摄动论及其应用 第七章 不均匀和各向异性的波导 第八章 变分理论及其应用 第九章 不均一的波导 详细信息: 书籍作 ...…

查看全部问答>

有谁做过WinCE+ep93xx的GPIO中断没有?急呀!!!!!!!

现在在做一个GPIO的中断,使用流驱动 平台:WinCE5.0 + ep93xx芯片 通过超级终端输出串口调试信息发现,现在出现了这样一个现象: 系统启动的时候,系统多次进入IST线程,并通过了WaitingForSingleObject()函数, 但是当拨动GPIO口处的开关时, ...…

查看全部问答>

关于程序的编写

上面是软件仿真的结构图。实现目标是按键1按下显示1,按两下显示21,按三下显示321,一直下去直到八下显示87654321; 每按一下K2键则少以为 ,如果显示为54321,按下K2后则显示4321;按下K3键则清零。 我的程序如下不知道行不行,请高手们帮忙 ...…

查看全部问答>

招聘多名运动控制卡开发工程师

招聘多名运动控制卡开发工程师,有专长者请回复…

查看全部问答>

太阳能给单片机供电选用什么电源芯片

请教用太阳能给单片机供电,对于单片机的电源电路应选用什么芯片哦?…

查看全部问答>

最新整理红外遥控资料

专门针对SMK1838遥控接收头的红外遥控装置…

查看全部问答>

介绍LED路灯电源设计的4种方案

        LED路灯是LED照明中一个很重要应用。在节能省电的前提下,LED路灯取代传统路灯的趋势越来越明显。市面上,LED路灯电源的设计有很多种。早期的设计比较重视低成本的追求;到近期,共识渐渐形成,高效率及高可 ...…

查看全部问答>

(转)德州仪器专家谈使用跨导放大器开发振荡器

作者:Xavier Ramus  德州仪器 由于寄生或环路增益问题,在处理高速放大器时,经常会出现烦人的振荡。我们可以预测振荡的频率范围,但无法锁定特定频率。那么,如何创建具有特定频率的振荡器呢?创建方法多种多样。很多振荡器电路都基于 ...…

查看全部问答>

头文件是不是应该都放在工程目录下?

头文件是不是应该都放在工程目录下?就是整个工程是有一个文件夹,然后头文件都在这个文件夹下。或者说可不可以在工程文件夹下新建一个文件夹,把所有头文件放在这个新建文件夹里? …

查看全部问答>