所有的STM32芯片中都带有逐次逼近型ADC模块,关于它的应用非常广泛和频繁。不过,应用过程中时常也会遇到些问题,这尽力小结下,与大家分享出来算作一些提醒。
1、Vdda没有供电或没有正常供电;STM32系列众多,该参数不可一概而论,细节请参考各个芯片数据手册。
2、采样电阻取值不合适,跟采样时间不匹配,经常表现为输入电阻过大、配置的采样时间偏短。实际设计时可以参考下STM32官方各系列评估板的相关电路。另外可以参考ST官方的应用笔记AN2834。关于ADC 应用其它的应用笔记,可以去WWW.STMCU.COM.CN搜索ADC即可。
3、ADC上电开启到稳定需要一段时间,即Tstab,该参数在数据手册里有介绍。在使用寄存器操作时要特别注意这个时间。另外要注意给ADC外设上电、使能ADC功能、启动ADC转换、实质AD转换是不一样的动作和不同的时间点。
4、输入信号幅度超过ADC参考电压范围导致转换结果的数据错误。
5、芯片供电的波动尤其VREF的波动和外来干扰都会导致ADC转换值的异常。
6、在使用注入触发转换时,触发事件的时间间隔必须大于注入转换序列所需的转换时间。比方有两个注入通道所需转换时间为28 ADCLK,那触发事件的间隔必须大于28个ADCLK,比方29,30 个ADCLK等都可以。
7、大多数STM32的ADC模块在使用前需要校准。校准须在启动AD转换之前完成。原则上给ADC外设上电后校准一次就够,但当参考电压波动较大、温度变化较剧烈时需再次校准。
8、开启ADC的DMA功能,建议在ADC校准之后进行。换句话说校准ADC前不要使能其ADC的DMA功能。尤其涉及到多通道ADC DMA传输时要注意这个次序。
9、如果使用ADC的DMA传输,在启动AD转换时,DMA需配置好且被使能待命。
10、当使用内部SENSOR ADC通道时,注意这些通道从开启到稳定跟开启ADC模块一样都是需要时间的;针对这些特定传感器通道的AD采样时间,手册里往往有相关参数明确告知,请参照使用。比方内部温度传感器通道的采样时间推荐为17us.
11、ADC通道序列的修改应该保证在ADC的停止状态下进行。
12、在多通道ADC DMA传输时,经常出现因为缓冲区数据类型、源数据类型不一致导致的异常状况。这里主要是因为数据宽度不一致所导致的问题。
13、当外部信号被选择为注入转换的触发信号时,只有其上升沿才有效。
上面提到的都只是抛砖引玉的提醒, 设计应用时多留意下,特别是第7、8、9、12四点提醒。STM32的ADC外设在不同系列间也不完全相同,尤其涉及多个ADC模块配合采样转换的时候还是挺复杂的。任何时候都不忘多查看STM32英文参考手册和数据手册。
关键字:STM32 ADC
引用地址:
STM32 ADC应用要注意的几点问题
推荐阅读最新更新时间:2024-03-16 15:07
MSP430 ADC12采样分析
AD部分主要配置ADC12模块的时钟、参考源、采样通道、采样模式、存储和采样保持。 我就一个部分一个部分来 第一个是ADC12模块的时钟,这个是模块运行时的时钟,跟采样定时器是两个概念,曾经我有一段时间被迷惑住了。这个由ADC12CTL1里面的ADC12SSEL和ADC12DIV配置,可以选择ADC12OSC/ACLK/SMCLK/MCLK,TI例程里面好像都是选择的ADC12OSC,这个是5MHZ,不过频率容易受外界影响而改变。这个部分配置好了就得到了ADC12CLK。 第二个参考源,这个部分可以用单片机的参考模块控制,也可以用ADC12模块控制,REFCTL0 &= ~REFMSTR;这句就是设置ADC模块直
[单片机]
STM32入门系列-使用C语言封装寄存器
前面介绍了存储器映射、寄存器和寄存器映射,这些都是为了介绍使用 C语言封装寄存器做铺垫。这里我们通过一个实例来对 C 语言封装寄存器进行介绍。 具体实例:控制 GPIOC 端口的第 0 管脚输出一个低电平。首先我们需要知道GPIOC 端口外设是挂接在哪个总线上的,然后根据总线基地址和本身的偏移地址得到 GPIOC 外设基地址,最后通过这个外设基地址得到里面各种寄存器基地址。 总线和外设基地址封装 根据寄存器的概念,我们可以使用 C 语言中的宏定义对寄存器进行定义。具体代码如下: //定义外设基地址 #define PERIPH_BASE ((unsigned int)0x40000000) 1) //定义 APB2 总线基地址
[单片机]
STM32开发笔记23: 使用__weak修饰符
单片机型号:STM32L053R8T6 在 HAL 库中,很多回调函数前面使用__weak 修饰符。 weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。 加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数, 那么编译器就会执行__weak 声明的函数,并且编译器不会报错。 举个例子: 我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下: __weak void HAL_MspInit(v
[单片机]
移植STM32固件库用于HID双向通信
USB的应用中HID类是比较常见的方式。通过修改STM32 USB固件库V4.0的JOYSTICK应用,我们实现一个双向USB通信。 一、移植 使用STM32源程序为点亮LED灯程序。 首先将USB固件库中有用的函数复制到源函数中,建立LIB文件夹其中放入USB2.0协议函数 建立CFG文件夹放入USB应用函数 将两个文件夹都放到源工程目录下将文件添加进来,设置好,配置好KEIL软件设置。 二、修改文件 1、首先修改platform_config.h函数。 该文件是对于多种芯片对于USB库的支持。我们使用STM32F103ZET6芯片,所以只保留与之相关的ID项,与USB_DISCONNECT线(PG11)的配
[单片机]
【STM32】串口通信基本原理(超基础、详细版)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是: 并、串行通信的区别 并行通信 串行通信 传输原理 数据各个位同时传输 数据按位顺序传输 优点 速度快 占用引脚资源少 缺点 占用引脚资源多 速度相对较慢 串行通信的分类 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两
[单片机]
串行输出的12位模数转换器MAX1286–MAX1289
MAX1286–MAX1289是串行输出的12位模拟-数字转换器(ADC),具有成本低、功耗小的特点,采用小型8引脚SOT23封装和8引脚TDFN封装。MAX1286/MAX1288采用+5V单电源供电,MAX1287/MAX1289采用+3V单电源供电。这些器件具备逐次逼近ADC,自动关断,快速唤醒(1.4µs)的功能和一个高速3线接口。在150ksps最大采样速率下功耗仅为0.5mW (VDD = +2.7V)。在较低的采样速率下,转换间隙的AutoShutdown™ (0.2µA)特性能够减小功率消耗。MAX1286/MAX1287提供双通道单端工作模式,接受输入信号范围为0到基准VREF。MAX1288/MAX1289接受
[模拟电子]
Proteus仿真STM32实现--DS18B20和LCD1602显示
proteus仿真stm32103r6,实现18B20温度值在1602上显示,可测量正负温度。程序及仿真工程已上传附件,利用proteus仿真18b20温度为0和-0.1时返回值均为零,新手上路,请多指教。使用proteus8.8版本进行仿真。 原理图 时序 原理图 单片机部分程序如下: #include stm32f10x.h #include bsp-lcd1602.h #include delay.h #include sys.h #include ds18b20.h #include stdio.h #include math.h short tem,tem1; u8 a,b,c,t
[单片机]
stm32单片机待机模式的设计
一 待机模式简介 在stm32的低功耗模式中,待机模式可以实现系统的最低功耗,在这种模式下,只需要2uA左右的电流。 三 待机唤醒程序分析 实验现象: 将程序下载到开发板上后,LED灯会不断地亮灭,当按下KEY2键超过3s时,LED灯灭,标志着单片机进入待机模式,再按下KEY1键,这时唤醒单片机,LED又开始不断地亮灭亮灭。 程序中用到的一些宏定义 #definemacEXTI_GPIO_CLK(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO) #definemacEXTI_GPIO_PORTGPIOC #definemacEXTI_GPIO_PINGPIO_Pin_13 #definem
[单片机]