STM32 ADC采样调试笔记

最近在搞STM32L051系列一个小MCU,要用这个去采集两路ADC作为输入。期间也碰到过一些问题,顺便记录下。

ADC采集原理不说了,主要采集电压,用数字进行细分,这样就可以知道输入电压多少了,网上也有很多相关文章。

我这边主要以下几个问题或知识点

1. 老工程里添加ADC模块

       工程是原先的工程,虽然还是保留着ioc文件,理论可以通过STM32CubeMX进行配置。但这样比较麻烦要核对原先的其他有没有改动,前期工程包括功能又不想再调一遍。因此我这边的思路:先用STM32CubeMX进行配置,然后再把ADC相关一些代码移植过来。

      配置前预习知识:

      ADC采集总体来说,目标还是要读取到最终的值,对于MCU而言,读取ADC值有如下几种常见操作:

       >> 需要的时候,开启采集,并读取采集到的值。很显然这种按需分配比较“省事”,对于实时性要求不高的可参考。但带来问题,明显采集会占时间周期,会打破原先逻辑。

       >> 开启采集之后,一直轮询采集,并放到一个指定的缓存里(一般需要DMA技术),然后业务上需要的时候去读取DMA的值。相对于上面读取DMA的值要比采集一次快很多很多。

      >> 开启采集之后,一直轮询采集,并放到一个指定的缓存里(需要DMA技术),然后DMA产生中断,在中断函数里将DMA数据转走。这样采集的数据更新更快,但也会带来更多的中断,如果对采集实时要求没那么高地方,可能不需要那么多的中断,此处需要权衡。当然DMA可以搞大一点,比如采集16次 再产生中断,然后计算16次的平均值,这样即可以满足采集数据可靠性,也可以减少中断次数,是一种比较不错的方式。

     还有其他方式吧,没有细细去想。

很显然,第二,第三方式比较合适,因此,STM32CubeMX需要配置ADC、以及DMA

ADC配置,其实就是属性的设置(不同芯片略有不同):

这里配置关键点:

      分频值(切记要好好理解下)、采集周期

需要理解下其含义,根据实际情况去调整。

DMA要配置:

生成代码,

然后进入main.c 把  void MX_ADC_Init(void)  这个函数拷贝自己工程里面

编译:直接出现

.....   Error: L6218E: Undefined symbol LL_ADC_Init (referred from .....

类似这样的错误。说明LL_ADC_Init 没有被工程包含进来,可以按以下几个方面进行问题确认:

1. 调用地方是否include 对应的h文件。#include "stm32l0xx_ll_adc.h"

2. 对应原文件 "stm32l0xx_ll_adc.c" 是否在工程里面

3. 如果是用HAL方式的话,要在stm32l0xx_hal_conf.h   

 #define HAL_ADC_MODULE_ENABLED 这个是否生效

理论上编译会通过。

2. 添加必要的代码

显然如果仅仅拷贝CubeMX生成的代码,还不够ADC采集功能,也不能使用DMA来采集,需要添加自己的代码。共两处代码:

  • 需要开启自动采集,建立DMA映射
  • DMA处理(应用)
以下代码调用顺序不要改变
void AdcDmaInit(uint32_t adcDmaBuf)
{/* ADC DMA buf Init */	LL_ADC_StartCalibration(ADC1);   //校准while (LL_ADC_IsCalibrationOnGoing(ADC1)) ;LL_ADC_Enable(ADC1);   ///使能while (LL_ADC_IsActiveFlag_ADRDY(ADC1) == 0){};/ 开始ADC1采集LL_ADC_REG_StartConversion(ADC1);/ 开启DMA方式(注意,在多通道采集的时候,如果不这样做会有个坑!!!后面会描述)LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);//DMA使能 这个是关键。注意最后的16这个数字,还要考虑adcDmaBuf的长度。我这边是两个通道,所以DMA采集完成的时候,实际已经采集了8次。类似:IN1 IN2 IN1 IN2 IN1 IN2 IN1 IN2 ... IN1 IN2 LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_2, 16);LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_2,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
//映射好LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_2,(uint32_t)adcDmaBuf);LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_2);
}
/Channel2 定期采集
if (LL_DMA_IsActiveFlag_TC2(DMA1)){		debugCount++;if(debugCount > 10000){			printf(">>> ADC = %04X %04X, %04X %04X, %04X %04X, %04X %04X \r\n %04X %04X, %04X %04X, %04X %04X, %04X %04X \r\n",			s_ptAdcValue[0],s_ptAdcValue[1],s_ptAdcValue[2],s_ptAdcValue[3],s_ptAdcValue[4],s_ptAdcValue[5],s_ptAdcValue[6],s_ptAdcValue[7],				s_ptAdcValue[8],s_ptAdcValue[9],s_ptAdcValue[10],s_ptAdcValue[11],s_ptAdcValue[12],s_ptAdcValue[13],s_ptAdcValue[14],s_ptAdcValue[15]);debugCount = 0;}}

3. 采集通道顺序问题

在MX_ADC_Init地方很明显采集的数据

/**ADC GPIO Configuration
  PB0   ------> ADC_IN1
  PB1   ------> ADC_IN2
  */

但实际从测试的时候,经常顺序颠倒来颠倒去

问题解决办法:

1. 在Init函数里,将  改成NONE

ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;

2. 然后在校准完毕,开启采集之后,再开启DMA(切记顺序)

LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);

以上就是本人本阶段处理AD采样的一些记录。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/325899.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32G030C8T6:USART串口通信(中断)

本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过芯片PB6,PB7 的USART1 口,实现串口通信。 原理…

VMware17 下载安装教程

VMware17 下载安装ubuntu22.04虚拟机安装 一、VM安装 1.打开官方下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 跳转页面后,点击左边的Download oad now,下载的就是最新版的 Workstation 17 …

GUI三维绘图

绘制三维图plot3 t0:pi/50:10*pi; xsin(t); ycos(t); zt; plot3(x,y,z); 产生栅格数据点meshgrid 这个接口在绘制三维图像里面相当重要,很多时候要将向量变成矩阵才能绘制三维图。 x0:0.5:5; y0:1:10; [X,Y]meshgrid(x,y); plot(X,Y,o); x和y是向量,…

EG网关网口连接触控一体机操作说明V1.0 20210809

前言:工业现场中,很多情况下都会使用触摸屏连接PLC这一套设备,此一体机是将触摸屏和PLC两款设备集成到一起,可以简化现场设备结构,方便维护。同时,使用蓝蜂 EG系列网关,可以实现远程在线监控数据…

Wnmp本地部署结合内网穿透实现任意浏览器远程访问本地服务

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1…

【AI视野·今日NLP 自然语言处理论文速览 第六十八期】Tue, 2 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 2 Jan 2024 Totally 48 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers A Computational Framework for Behavioral Assessment of LLM Therapists Authors Yu Ying Chiu, Ashish Shar…

三叠云流程制造ERP:构建智慧工厂,实现高效生产管理

在数字化经济的浪潮下,新一代信息技术快速发展,深度整合,引领了工业的创新和变革,推动了企业向智能化发展。解决生产管理、销售管理和技术管理等难题的关键,在于管理者能否及时准确地掌握企业运营信息。三叠云流程制造…

vue3+Ts+Hook的方式实现商城核心功能sku选择器

Hooks是React等函数式编程框架中非常受欢迎的工具,随着VUE3 Composition API 函数式编程风格的推出,现在也受到越来越多VUE3开发者的青睐,它让开发者的代码具有更高的复用度且更加清晰、易于维护。 本文将通过CRMEB商城商品详情sku选择功能了…

【IPC通信--信号】

信号处理函数 • 信号发送函数 – kill(), sigqueue(), raise(), alarm(), setitimer(), pause() , abort() • 信号安装函数 – signal(), sigaction() • 信号集操作函数 – sigemptyset(), sigfillset(), sigaddset(), sigdelset(), sigismember() 信号发送函数—…

由浅入深理解C#中的事件

目录 本文较长,给大家提供了目录,可以直接看自己感兴趣的部分。 前言有关事件的概念示例​ 简单示例​ 标准 .NET 事件模式​ 使用泛型版本的标准 .NET 事件模式​ 补充总结 参考前言 前面介绍了C#中的委托,事件的很多部分都与委托…

问题 E: 便利店

题目描述 天宝来到便利店想买些饮料。便利店有各种型号的瓶装饮料售卖,不同型号的饮料卖不同的价格。1瓶0.25升的卖A元,1瓶0.5升的饮料卖B元,1瓶1升的卖C元,1瓶2升的卖D元。便利店里每种饮料都是无限供应。 天宝要买N升的饮料&a…

Beauty algorithm(一) 关键点检测

在实现美妆算法过程中,需要定位到目标区域,常规的图像处理技术很难准确定位。随着AI技术快速发展,人脸关键点成为面部特征提取技术之一。 常见开源的关键点有dlib、mtcnn等。 由于本人对dlib有所了解,且支持C、python等。故本人选…