【stm32f4】ADC实验(stm32hal库)

一、ADC简介

1、概念

ADC(Analog-to-Digital Converter,模数转换器)是一种将模拟信号转换为数字信号的电子设备或电路。模拟信号是连续变化的信号,而数字信号是离散的、由一系列二进制数表示的信号。ADC在电子系统中起着至关重要的作用,因为它允许模拟信号(如声音、温度、压力等)被数字系统(如计算机、微控制器等)处理和分析。

2、ADC分类

并联比较型,逐次逼近型

3、ADC的主要参数

  1. 分辨率:表示ADC能够分辨的最小模拟信号变化,通常以位数表示(如8位、10位、12位等)。分辨率越高,转换精度越高。
  2. 采样率:表示ADC每秒钟能够进行多少次采样,单位为Hz。采样率越高,能够处理的信号频率越高。
  3. 转换时间:表示ADC完成一次转换所需的时间。
  4. 信噪比(SNR):表示ADC输出信号的质量,信噪比越高,信号质量越好。
  5. 输入范围:表示ADC能够处理的模拟信号的最大和最小值。

二、stm32中的ADC

1、简介

12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 V BAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。ADC 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。

2、ADC****主要特性

● 可配置 12 位、 10 位、 8 位或 6 位分辨率
● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
● 单次和连续转换模式
● 用于自动将通道 0 转换为通道" n "的扫描模式
● 数据对齐以保持内置数据一致性
● 可独立设置各通道采样时间
● 外部触发器选项,可为规则转换和注入转换配置极性
● 不连续采样模式
● 双重/ 三重模式(具有 2 个或更多 ADC 的器件提供)
● 双重/ 三重 ADC 模式下可配置的 DMA 数据存储
● 双重/ 三重交替模式下可配置的转换间延迟
● ADC 转换类型
● ADC 电源要求:全速运行时为 2.4 V 到 3.6 V ,慢速运行时为 1.8 V
● 规则通道转换期间可产生 DMA 请求

3、结构图

4、转换序列

stm32中ADC分为 规则组(16)注入组(4)

5、触发源

外部事件触发

6、转换时间

ADC最大时钟频率为36MHz

ADC转换时间:T = 采样时间+n个周期

n与分辨率有关,可取6,8,10,12

三、寄存器

1、状态寄存器**(ADC_SR)**

偏移地址: 0x00
复位值: 0x0000 0000

2、控制寄存器****1 (ADC_CR1)

偏移地址: 0x04
复位值: 0x0000 0000

3、控制寄存器****2 (ADC_CR2)

偏移地址: 0x08
复位值: 0x0000 0000

4、ADC采样时间寄存器1 (ADC_SMPR1)

偏移地址: 0x0C
复位值: 0x0000 0000

5、采样时间寄存器****2 (ADC_SMPR2)

偏移地址: 0x10
复位值: 0x0000 0000

6、注入通道数据偏移寄存器****X (ADC_JOFRx)(x=1..4)

偏移地址: 0x14-0x20
复位值: 0x0000 0000

7、看门狗高阈值寄存器**(ADC_HTR)**

偏移地址: 0x24
复位值: 0x0000 0FFF

8、看门狗低阈值寄存器**(ADC_LTR)**

偏移地址: 0x28
复位值: 0x0000 0000

9、规则序列寄存器****1 (ADC_SQR1)

偏移地址: 0x2C
复位值: 0x0000 0000

10、规则序列寄存器****2 (ADC_SQR2)

偏移地址: 0x30
复位值: 0x0000 0000

11、规则序列寄存器****3 (ADC_SQR3)

偏移地址: 0x34
复位值: 0x0000 0000

12、注入序列寄存器**(ADC_JSQR)**

偏移地址: 0x38
复位值: 0x0000 0000

13、注入数据寄存器****x (ADC_JDRx) (x= 1..4)

偏移地址: 0x3C - 0x48
复位值: 0x0000 0000

14、规则数据寄存器**(ADC_DR)**

偏移地址: 0x4C
复位值: 0x0000 0000

15、通用状态寄存器**(ADC_CSR)**

偏移地址: 0x00 (该偏移地址与 ADC1 基地址 + 0x300 相关)
复位值: 0x0000 0000

16、通用控制寄存器**(ADC_CCR)**

偏移地址: 0x04 (该偏移地址与 ADC1 基地址 + 0x300 相关)
复位值: 0x0000 0000

17、**适用于双重和三重模式的ADC通用规则数据寄存器(**ADC_CDR)

偏移地址: 0x08 (该偏移地址与 ADC1 基地址 + 0x300 相关)
复位值: 0x0000 0000

四、stm32中ADC配置流程

1、配置ADC的工作参数

2、MSP初始化

3、配置ADC相应通道相关参数

4、启动A/D转换

5、等待规则通道转换完成

6、获取规则通道转换结果

五、实验代码

复制代码
ADC_HandleTypeDef ADC_InitStructure;
ADC_ChannelConfTypeDef ADC_CHANNEL_CONFIG;

void ADC_Init()
{
	ADC_InitStructure.Instance = ADC1;// 选择 ADC 实例为 ADC1
	ADC_InitStructure.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;//时钟分频因子 设置 ADC 时钟分频因子为 PCLK 的 4 分频
	ADC_InitStructure.Init.DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐->右对齐
	ADC_InitStructure.Init.ContinuousConvMode = DISABLE;//连续转换 禁用连续转换模式(单次转换模式)
	ADC_InitStructure.Init.DiscontinuousConvMode = DISABLE;// 禁用间断转换模式
	ADC_InitStructure.Init.DMAContinuousRequests = DISABLE;// 禁用 DMA 连续请求模式
	ADC_InitStructure.Init.EOCSelection = DISABLE;// 禁用 EOC(转换结束)选择模式
	ADC_InitStructure.Init.ExternalTrigConv = ADC_SOFTWARE_START;//触发源 设置外部触发源为软件触发
	ADC_InitStructure.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;// 设置外部触发边沿为无触发边沿
	ADC_InitStructure.Init.NbrOfConversion = 1;//规则组个数
	ADC_InitStructure.Init.NbrOfDiscConversion=0;// 设置间断模式下的转换通道数量为 0
	ADC_InitStructure.Init.Resolution = ADC_RESOLUTION_12B;//分辨率 12位
	ADC_InitStructure.Init.ScanConvMode = DISABLE;// 禁用扫描模式(单通道模式)
	
	HAL_ADC_Init(&ADC_InitStructure);
	
	HAL_ADC_Start(&ADC_InitStructure);
}

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
	__HAL_RCC_ADC1_CLK_ENABLE();
	__HAL_RCC_GPIOA_CLK_ENABLE();
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
	GPIO_InitStructure.Pin = GPIO_PIN_5;
	GPIO_InitStructure.Pull = GPIO_NOPULL;
	
	HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}

uint16_t GET_ADCx(uint32_t channel)
{
	uint16_t Val;
	ADC_CHANNEL_CONFIG.Channel = channel;
	ADC_CHANNEL_CONFIG.Offset = 0;
	ADC_CHANNEL_CONFIG.Rank = 1;
	ADC_CHANNEL_CONFIG.SamplingTime = ADC_SAMPLETIME_480CYCLES;
	HAL_ADC_ConfigChannel(&ADC_InitStructure,&ADC_CHANNEL_CONFIG);
	HAL_ADC_Start(&ADC_InitStructure);
	
	Val = HAL_ADC_GetValue(&ADC_InitStructure);
	
	return Val;
}
相关推荐
几道之旅6 小时前
零基础RT-thread第二节:按键控制
c语言·stm32
阿让啊7 小时前
Notepad++如何列选
c语言·嵌入式硬件·notepad++
Archer-8 小时前
解决STM32H7系列串口DMA发送一次卡死
stm32·单片机·嵌入式硬件
Mr-Apple9 小时前
使用STM32设置GPIO中断
stm32·单片机·嵌入式硬件
jasonslaex11 小时前
stm32传感器通用驱动代码
驱动开发·stm32·嵌入式硬件
嵌入式仿真实验教学平台16 小时前
深入探索IIC-OLED显示技术:嵌入式仿真平台如何重塑高校教学范式——深圳航天科技创新研究院技术赋能新一代工程教育
科技·单片机·gd32·嵌入式仿真·iic-oled显示技术
十碗阳春面17 小时前
TI 毫米波雷达走读系列—— 3DFFT及测角
单片机·嵌入式硬件·毫米波雷达·mmwave radar·awr/iwr系列
CPETW18 小时前
同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——C
c语言·开发语言·科技·stm32·单片机·嵌入式硬件·电子
keke1018 小时前
PLC入门【6】计时器、计数器、存储器
嵌入式硬件