STM32——ADC

发布者:雅致小筑最新更新时间:2020-12-08 来源: elecfans关键字:STM32  ADC  信号源 手机看文章 扫描二维码
随时随地手机看文章

一、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  ADC  信号源 引用地址:STM32——ADC

上一篇:STM32——DMA
下一篇:STM32——I2C

推荐阅读最新更新时间:2024-11-13 12:49

STM32入门开发--按键模块实现按键点灯
1、实现效果 通过I/O口,操作按键,使得按键与LED一一对应,实现按键按下灯亮,再按下灯灭。支持连续按键。 2、实现思路 a. 要实现灯亮,首先应该初始化LED模块的时钟,使得该端口的时钟使能。 b. 初始化按键,按键对应的端口PORTA,PORTE使能,其次设置为输入模式, KEY0,KEY1为低电平有效,KEY_UP高电平有效 硬件图可知,在设计中,应该在内部设置为上拉下拉输入,即KEY0,KEY1为上拉(输入高电平,本身为低电平有效),KEY_UP为下拉(输入低电平,本身为高电平有效)。 根据模式配置图,即要设置GOIPx—ODR寄存器的3/4位为1,才能保证为上拉输入。 c. 实现相应的初始化
[单片机]
<font color='red'>STM32</font>入门开发--按键模块实现按键点灯
STM32操作访问flash,包括写入数据到flash和从flash读取数据
序言:flash相关知识背景 STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。 其中: RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。 ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。 ROM又包含:EEPROM和flash。 画个嵌入式产品存储器件的思维导图如下(如有什么地方不对,恳请大神们进行指正): 作为ROM的一份子,flash的特点自然是掉电数据不丢失。但是,flash在STM32中比较重要,程序也是保存在这个地方,所以轻易不让用户进行随意的读写,以
[单片机]
<font color='red'>STM32</font>操作访问flash,包括写入数据到flash和从flash读取数据
关于STM32串口调试RS485时自动进入接收中断
先说一下软硬件: 硬件:主控stm32c8t6、485芯片为隔离型芯片ADM2483,调试工具是usb转485接到PC端。 软件:采用库函数开发,开发工具为IAR 7.10,485接的是stm32的串口1(收发都是用中断方式),半双工模式, 协议是MODBUS RTU。 先说明本人是菜鸟,在不断得学习中,欢迎指出错误。 最近在调试RS485时发现一个问题,如果在串口初始化时就使能了发送中断和接收的话,那么在发送一个字节后就会自动进入接收中断。可能是收发的机制没有定好,所以后面采用的方式是在初始化时使能了接收中断,关闭发送中断,在需要发送数据的时候再开启发送中断,发送的时候关闭接收中断,发送完一帧再使能接收中断。这样就可以完整地发送
[单片机]
ST最新STM32 ARM Cortex-M0微控制器提升集成度和用户体验
中国,2014年12月3日 —— 意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)最新的STM32F091 ARM® Cortex®-M0微控制器,克服了目前定位在经济型应用的同类产品的限制,可提供大容量片上存储器和多达8通用同步/异步串行接收/发送器 (USART, Universal Synchronous/Asynchronous Receiver/Transmitter),为车载音响或三相电表等应用节省多路复用通信端口。 STM32F091微控制器单片集成最高256KB的闪存和32KB的 SRAM存储器,足以实现Java堆栈,能够运行通常只有大存储容量或昂贵产品才能运
[嵌入式]
stm32单片机用什么软件编程
  今天要和大家分享的是stm32单片机用什么软件编程相关信息。   想学单片机开发,最主要是熟悉stm32的软件开发环境,目前stm32的开发环境,主流是KEIL和IAR,当然主要是windows版本运行。   两个开发环境都是目前的主流,都用的很多,而且这两种开发环境实际上差异不大,学好一个即可。我个人常用keil,虽然keil的版本很多,因为我常用的是STM32F1,所以KEIL4,就能满足需求。想完整完成一个Stm32的工程开发过程,需要学会新建工程,这个是单片机开发工具基础操作。   除此之外。还需要学会使用Keil进行仿真,写代码肯定会遇到各种问题。怎么找到问题造成的原因。就需要仿真查看了代码执行情况,当然也有其他
[单片机]
stm32 PUSH 按键控制LED闪烁
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configu
[单片机]
STM32篇:74HC595的使用和注意
74595的数据端: QA--QH: 八位并行输出端,可以直接控制数码管的8个段。 QH': 级联输出端。将它接下一个595的SI端。 SI: 串行数据输入端。 74595的控制端说明: /SCLR(10脚): 低点平时将移位寄存器的数据清零。通常我将它接Vcc。 SCK(11脚):上升沿时数据寄存器的数据移位。QA-- QB-- QC-- ...-- QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级) RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了
[单片机]
<font color='red'>STM32</font>篇:74HC595的使用和注意
精密SAR模数转换器的前端放大器和RC滤波器设计
逐次逼近型(SAR)ADC提供高分辨率、出色的精度和低功耗特性。一旦选定一款精密SARADC,系统设计师就必须确定获得最佳结果所需的支持电路。需要考虑的三个主要方面是:模拟输入信号与ADC接口的前端、基准电压源和数字接口。本文将重点介绍前端设计的电路要求和权衡因素。关于其它方面的有用信息,包括具体器件和系统信息,请参阅数据手册和本文的参考文献。 前端包括两个部分:驱动放大器和RC滤波器。放大器调节输入信号,同时充当信号源与ADC输入端之间的低阻抗缓冲器。RC滤波器限制到达ADC输入端的带外噪声,帮助衰减ADC输入端中开关电容的反冲影响。 为SARADC选择合适的放大器和RC滤波器可能很困难,特别是当应用不同于ADC数据手册的常规用
[电源管理]
精密SAR<font color='red'>模数转换器</font>的前端放大器和RC滤波器设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved