STM32 ADC采样调试笔记

news2025/1/13 13:28:33

最近在搞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.coloradmin.cn/o/1374484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【附源码】基于SSM+Java的题库管理系统的设计与实现

基于SSMJava的题库管理系统的设计与实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(We…

一小时掌握:使用ScrapySharp和C#打造新闻下载器

引言 爬虫技术是指通过编程的方式,自动从互联网上获取和处理数据的技术。爬虫技术有很多应用场景,比如搜索引擎、数据分析、舆情监测、电商比价等。爬虫技术也是一门有趣的技术,可以让你发现网络上的各种有价值的信息。 本文将介绍如何使用…

Linux -- Nginx服务基础

4.1Nginx服务基础 Nginx(发音为[engine x])专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消 耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求),正因 为如此,…

ffmpeg 视频分辨率修改 质量压缩

随着手机像素的提高,拍摄视频也越来越大,10秒的视频动辄 二三十兆,这给视频传输和播放都带来了 诸多不变。一般都需要 前端或或者后端 对视频进行压缩。由于我这边前端是 H5,所以只能后端进行压缩, 采用主流压缩库采用…

bmp图像文件格式超详解

0 BMP简介 BMP(Bitmap-File)图形文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。一个BMP文件由四部分组成: B…

手轮脉冲平滑处理笔记

这是一个求手脉倍率((Hw_Control.mult_ratio)与手脉脉冲计数延迟次数即累计过去n次的平均值(Hw_Control.lag_num)之间关系算法的计算过程笔记文档 1、已知 mult_ratio=1时 lag_num=10; mult_ratio=10时 lag_num=20; .mult_ratio==100时 lag_num=30; 以此类推 2、设lag_num…

【目标跟踪】多相机多目标跟踪

文章目录 前言一、计算思路二、代码三、结果 前言 单相机目标跟踪之前博客已经有过基本介绍,本篇博客主要介绍一种多相机目标跟踪的计算方法已知各相机内外参,如何计算共视区域像素投影?废话不多说,见下图。 同一时刻相机A与相机…

创建ROS模型与小机器人地图规划

1、打开自己的VM系统 2、安装小机器人的安装包,输入如下命令,回车输入密码(自己设的): sudo apt install ros-noetic-turtlebot3-simulations ros-noetic-turtlebot3-slam ros-noetic-turtlebot3-navigation 提示我之前安装过了 3、用rosla…

ansible:如何在centos 7上重新启动auditd服务得到关于依赖的错误

在我的剧本中,我有一个更新 audit.rules 的任务,然后通知应该重新启动 auditd 服务的处理程序。 task:- name: 6.6.7 - audit rules configurationtemplate: srcX/ansible/templates/auditd_rules.j2dest/etc/audit/rules.d/audit.rulesbackupyesownerr…

在线图表编辑工具Draw.io本地部署并结合内网穿透实现远程协作办公

前言 提到流程图,大家第一时间可能会想到Visio,不可否认,VIsio确实是功能强大,但是软件为收费,并且因为其功能强大,导致安装需要很多的系统内存,并且是不可跨平台使用。所以,今天给…

ChatGPT | Team套餐来了,每人 25美元,你怎么看?

最近,ChatGPT 在原有的plus会员的基础上 加了一个Team套餐 价格要更贵一些 收费 每人每月 25 美元 套餐包含 Plus 中的所有内容,以及: GPT-4 和 DALLE、浏览、高级数据分析等 创建 GPT 并将其与工作区共享 用于工作区管理的管理控制台 保证不…

shrio漏洞

sudo apt install tomcat9//安装tomcat9sudo systemctl status tomcat9//查看安装状态 编辑配置文件 sudo nano /etc/tomcat9/tomcat-users.xml 编辑配置文件,设置密码 sudo systemctl restart tomcat9 重启生效 访问 Tomcat 管理页面:在浏览器中输入…

网络安全B模块(笔记详解)- 网络爬虫渗透测试

ARP协议渗透测试 1.进入渗透机场景BT5中的/root目录,完善该目录下的arp_spoof.py文件,填写该文件当中空缺的Flag1字符串,将该字符串作为Flag值(形式:Flag1字符串)提交;(arp_spoof.py脚本功能见该任务第6题) 根据缺少的发现是要time模块 Flag:time 2.进入渗透机场景B…

独享静态代理IP在海外市场调研中的独特优势

独享静态代理IP在海外市场调研中扮演着至关重要的角色,提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要,它保证了连接的持续性和数据的准确性。通过这些方面的综合优势,独享静态代理IP成为海外市场调…

生成学习全景:从基础理论到GANs技术实战

本文全面探讨了生成学习的理论与实践,包括对生成学习与判别学习的比较、详细解析GANs、VAEs及自回归模型的工作原理与结构,并通过实战案例展示了GAN模型在PyTorch中的实现。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产…

Visual Studio Code 连接远程服务器方法

1、输入用户名和服务器ip连接远程服务器 2、选择配置文件 配置文件路径:C:\Users\Administrator\.ssh\config config的内容大致如下: Host 192.168.134.3HostName 192.168.134.3User zhangshanHost 192.168.134.3HostName 192.168.134.3User lisiHost…

Open CASCADE学习|一种快速定位缺失的链接库的方法

OCCT代码中,缺少链接库一般报错LNK2019、LNK1120等,如下表所示。该错误说明中提供了类名及成员函数,这是找到缺少的链接库的线索。 严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 LNK2019 无法解析的外部符号 "p…

C/C++动态内存管理

文章目录 前言1.C/C内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数 5. new和delete的实现原…

Python实用小工具(4)——邮件轰炸机,给朋友搞点乐子(附源码+exe文件)

欢迎来到MatpyMaster!今天我们将使用Python来批量发送邮件,让你的邮件推送变得更加高效。废话不多说,直接开搞!使用声明: 请确保你的邮箱开启了SMTP服务,并获取了授权码。 选择合适的发送间隔,…

创建mysql普通用户

一、创建mysql普通用户的原因: 权限控制:MySQL的权限系统允许您为每个用户分配特定的权限。通过创建普通用户,您可以根据需要为每个用户分配特定的数据库和表权限,而不是将所有权限授予一个全局管理员用户。这有助于提高数据库的…