ADC模数转换器(STM32系列)

Cortex-M4-模数转换器

模数转换器概述

模数转换器用途

MCU(单片机)种只能处理数字量,但当外界输入模拟量信号时,单片机会通过模数转换器将模拟量信号转化成数字量信号供MCU处理,并且当MCU需要区分多种输入信号时,需要模数转换转换器多通道采集信号,转换成数字量给MCU。

模数转换器原理

模数转换器分为两个步骤: 采样+转换。
ADC:模数转换
ADC:将连续的模拟量转换成离散的数字量
DAC:数模转换
DAC:将离散的数字量转换成连续的模拟量

需要考虑的参数:价格 量程 精度 灵敏度 误差 分辨率………
分辨率:最小单元
在这里插入图片描述
示例:传感器测量电压(0~3.3v) 12位的 测量值=1000 电压值=??
(1/2^12) x 3.3 x 1000= 0.8056640625v

例如:转换时间=20us 频率:15MHz 采样周期=?
一个周期:1/15 us
总时间:20us
采样周期:20/(1/15)=300周期

分两种模式: 并联比较型+逐次逼近型

并联比较型:
  该种类型会将参考电压进行分压,并与模拟电压进行比较,输出比较相近的分压值的有效信号,其优缺点是转换比较快 ,数据不准确 ,数据较多较快时容易出问题
在这里插入图片描述
由三个部分组成,分压电路+比较器+编码器
E:参考电压
Ux:模拟电压
举例:E=8V,Ux=3V, C比较器就会发现参考电压和模拟电压值相等,C有机会输出有效信号,最终编码器输出数字量3.

逐次逼近型:
  转换开始前先将所有寄存器清零。开始转换以后,时钟脉冲首先将寄存器最高位置成1,使输出数字为100…0。这个数码被D/A转换器转换成相应的模拟电压uo,送到比较器中与ui进行比较。若ui<uo,说明数字过大了,故将最高位的1清除;若ui>uo,说明数字还不够大,应将这一位保留。然后,再按同样的方式将次高位置成1,并且经过比较以后确定这个1是否应该保留。这样逐位比较下去,一直到最低位为止。比较完毕后,寄存器中的状态就是所要求的数字量输出。其优缺点是转换速度较慢,数据准确

STM32的模数转换器

STM32的模数转换器简介

在这里插入图片描述
在我所学的401xE系列种只有一个ADC(ADC1) 挂靠在APB2(84MHz).
   12 位 ADC 是 逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。 ADC 的结果存储在一个左对齐或右对齐16 位数据寄存器中。
19 个复用通道=16个外部(IO)+2个内部+1个Vbat
2个内部:
IN16—>温度检测
IN17—>参考电压检测(VREF)

ADC电源部分(独立电源):

器件的工作电压在1.8v~3.6v之间
在这里插入图片描述
为了提高转换精度, ADC 配有独立电源,可以单独滤波并屏蔽 PCB 上的噪声。
● ADC 电源电压从单独的 VDDA 引脚输入。
● VSSA 引脚提供了独立的电源接地连接。

模数转换器主要特性

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

模数转换器的框架

在这里插入图片描述
  16个外部通道可由GPIO口来采集模拟信号,也可通过定时器外部通道或外部中断线采集信号。

模数转换器功能说明

时钟:
ADC的电源要求:1.8~2.4v慢速运行 2.4~3.6v全速运行
ADC具有两个时钟方案:
1)数字接口时钟
APB2,使能/禁止使能ADC的时钟
2)模拟电路时钟(ADCCLK)
框图内描述的时钟、来自于APB2(84MHz)时钟,预分频器允许 ADC 在 fPCLK2/2、/4、 /6 或 /8 下工作。
在这里插入图片描述
选用慢速运行:最大允许时钟频率18MHz,ADCCLK最少进行6分频
选用快速运行:最大允许时钟频率36MHz,ADCCLK最少进行4分频

通道选择

规则转换: 如果有多个通道待转换、按照原设置的顺序(规则通道序列)进行一一转换
注入转换: 类似中断事件、有注入触发需要立马进行转换(优先转换),类似于中断
注入转换有多个时也是需要一一排队按照顺序转换
注:

  • 一个规则转换组最多由 16 个转换构成。必须在 ADC_SQRx 寄存器中选择转换序列的规则通道及其顺序。规则转换组中的 转换总数必须写入ADC_SQR1 寄存器中的L[3:0] 位。
  • 一个注入转换组最多由 4 个转换构成。必须在 ADC_JSQR 寄存器中选择转换序列的注入通道及其顺序。注入转换组中的转换总数必须写ADC_JSQR 寄存器中的L[1:0] 位。
单次转换模式

CONT=0可进入单次模式、ADC执行一次转换、以下方式可触发转换
1)将 ADC_CR2 寄存器中的 SWSTART 位置 1(仅适用于规则通道)
2)将 JSWSTART 位置 1(适用于注入通道)
3)外部触发(适用于规则通道或注入通道)
完成转换所选通道后
规则通道
1) 数据放到ADC_DR寄存器中
2) EOC转换标志置1
3) EOCIE位置1可产生中断
注入通道
1) 数据放到ADC_JDR寄存器中
2)JEOC转换标志置1
3)JEOCIE位置1可产生中断
完成上述操作ADC停止

连续转换模式

  在连续转换模式下,ADC 结束一个转换后立即启动一个新的转换。CONT 位为 1 时,可通过
外部触发或将 ADC_CR2 寄存器中的 SWSTRT 位置 1 来启动此模式(仅适用于规则通道)。
每次转换之后:
● 如果转换了规则通道组:
— 上次转换的数据存储在 16 位 ADC_DR 寄存器中
— EOC(转换结束)标志置 1
— EOCIE 位置 1 时将产生中
注: 无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自
动转换(使用 JAUTO 位)

扫描模式

  通过将 ADC_CR1 寄存器中的 SCAN 位置 1 来选择扫描模式。将此位置 1 后, ADC 会扫描
在 ADC_SQRx 寄存器(对于规则通道)或 ADC_JSQR 寄存器(对于注入通道)中选择的所有通道。为组中的每个通道都执行一次转换。每次转换结束后,会自动转换该组中的下一个通道。如果将CONT 位置 1,规则通道转换不会在组中最后一个所选通道处停止,而是再次从第一个所选通道继续转换

不连续采样模式

  可将 ADC_CR1 寄存器中的 DISCEN 位置 1 来使能此模式。该模式可用于转换含有 n (n ≤8)个转换的短序列,该短序列是在 ADC_SQRx 寄存器中选择的转换序列的一部分。可通过写
入 ADC_CR1 寄存器中的 DISCNUM[2:0] 位来指定 n 的值
例:
IN1 IN3 IN4 IN6 IN8
不连续采样:把长序列分为多个短序列
n—>一个短序列中的通道数
例如:n=3
第一次转换:IN1 IN3 IN4
第二次转换:IN6 IN8 EOCS

采样时间

  ADC 会在数个 ADCCLK 周期内对输入电压进行采样,可使用 ADC_SMPR1和ADC_SMPR2寄存器中的 SMP[2:0] 位修改周期数。每个通道均可以使用不同的采样时间进行采样
例: 计算温度传感器的采样周期
在这里插入图片描述
采样时间(Ts_temp) = 10us,时钟频率 = 21MHZ
则采样周期 = 10us/(1/21) = 210
在ADC_SMPR1的18~20位写入一个大于210周期的值
读取温度
温度(单位为 °C)= {(VSENSE — V25) / Avg_Slope} + 25
其中:
V25 = 25 °C 时的 VSENSE 值(VSENSE 为获得相应传感器的电压值)
VSENSE = (3.3xADC获取的值)/4096
Avg_Slope = 温度与 VSENSE 曲线的平均斜率(以 mV/°C 或 μV/°C 表示)

模数转换相关寄存器

在这里插入图片描述
配置流程:

  1. 打开时钟(ADC1)
  2. 打开温度传感器
  3. 扫描模式
  4. 不连续采样模式&n值
  5. 分辨率
  6. 转换模式(单次 连续)
  7. 转换结束标志(EOCS)
  8. 数据对齐
  9. 采样周期
  10. 转换顺序
  11. 转换总数
  12. 分频
  13. 使能ADC
  14. 读数据函数
    1)开启转换通道
    2)读取转换完成标志位
    3)读取数据寄存器
void ADC_Config(void)
{
/**************************寄存器法***************************************************************/
//	RCC->APB2ENR |= (1<<8);		//打开ADC1时钟
//	ADC->CCR |= (1<<23);			//打开温度传感器
//	ADC1->CR1 &= ~(1<<8);			//扫描模式
//	ADC1->CR1 &= ~(3<<24);		//12位分辨率
//	ADC1->CR2 &= ~(1<<1);			//单次转换模式
//	ADC1->CR2 |= (1<<10);			//结束转换选择
//	ADC1->CR2 &= ~(1<<11);		//右对齐
//	ADC1->SMPR1 |= (7<<18);		//采样时间 480周期
//	ADC1->SQR1 &= ~(0xf<<20);	//转换总数 1
//	ADC1->SQR3 |= (0x10<<0);	//转换序列第一次转换
//	ADC->CCR |= (1<<16);			//4分频
//	
//	ADC1->CR2 |= (1<<0);			//使能ADC
	
/**************************库函数法***************************************************************/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);	//打开ADC1时钟
	
	ADC_InitTypeDef ADC1_InitTypeDef;
	ADC1_InitTypeDef.ADC_ContinuousConvMode = DISABLE;				//单次转换模式
	ADC1_InitTypeDef.ADC_NbrOfConversion = 1;									//转换总数 1
	ADC1_InitTypeDef.ADC_Resolution = ADC_Resolution_12b;			//12位分辨率
	ADC1_InitTypeDef.ADC_DataAlign =  ADC_DataAlign_Right;		//右对齐
	ADC1_InitTypeDef.ADC_ScanConvMode = DISABLE;							//结束转换选择
	ADC_Init(ADC1,&ADC1_InitTypeDef);
	
	ADC_CommonInitTypeDef ADC1_CommonInitTypeDef;
	ADC1_CommonInitTypeDef.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;		//禁止DMA
	ADC1_CommonInitTypeDef.ADC_Mode = ADC_Mode_Independent;										//独立模式
	ADC1_CommonInitTypeDef.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;	//两个采样之间的时间
	ADC1_CommonInitTypeDef.ADC_Prescaler = ADC_Prescaler_Div4;	//4分频
	ADC_CommonInit(&ADC1_CommonInitTypeDef);
	
	ADC_TempSensorVrefintCmd(ENABLE);														//打开温度传感器
	ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_480Cycles);//通道16 采样时间 480周期  转换序列第一次转换
	
	ADC_Cmd(ADC1,ENABLE);																				//使能ADC
}
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 ADC模数转换实验中,可能会遇到以下问题: 1. ADC采样值不正确 如果ADC采样值不正确,可能是因为ADC参数配置不正确或者采样时序不正确导致的。需要确认以下几点: - 确认ADC参数配置正确,包括采样时间、采样通道、采样分辨率等参数 - 确认ADC时钟已经使能 - 确认ADC采样时序正确,包括采样开始时间、采样保持时间和转换时间等参数 2. ADC采样速率不稳定或者出现噪声 如果ADC采样速率不稳定或者出现噪声,可能是因为ADC参考电压不稳定或者ADC输入信号不稳定导致的。需要确认以下几点: - 确认ADC参考电压稳定,可以使用稳压器等设备来提供稳定的参考电压 - 确认ADC输入信号稳定,可以使用滤波电路等方法来滤除噪声和干扰信号 解决方法: 在使用STM32 ADC模数转换时,可以采用以下步骤进行配置和编程: 1. 配置ADC参数 使用ADC_Init函数对ADC进行配置,设置相应的采样时间、采样通道、采样分辨率等参数。 2. 开启ADC采样 在程序中开启ADC采样,使得程序能够读取ADC转换结果。 3. 编写中断服务函数 根据需要编写中断服务函数,并在函数中进行相应的处理。需要注意的是,中断服务函数应该尽可能的简单,避免长时间占用CPU资源,否则可能会影响其他重要任务的执行。 4. 烧录程序 将程序烧录到STM32芯片中,通过读取ADC转换结果,观察ADC采样值的情况和中断服务函数的执行情况。 需要注意的是,在编写程序时需要遵循一些规范和最佳实践,如使用宏定义等方法来定义常量和变量,避免使用硬编码方式;使用滤波器等技术来提高ADC采样值的精度和稳定性等。同时,建议使用示波器等工具来观察ADC采样值的情况和中断服务函数的执行情况,以便进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值