STM32ADC同步采样

这篇具有很好参考价值的文章主要介绍了STM32ADC同步采样。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32ADC同步采样

本文主要讲解如何实现STM32ADC同步采样。

所需工具:

  • 开发板:STM32F103RCT6
  • STM32CubeMX
  • IDE: Keil-MDK

模式简介

同步采样可以让多个ADC同时采集它们各自的输入信号,并且保留它们之间的相位关系,这有助于更有效地捕捉信号的动态变化,特别是对于相位频率分析来说,它具有重要的应用价值。

实现方式1

STM32 的 ADC 有一种同步模式,但配置较复杂,信号处理也不直接。已经有可用的教程,写得不错,所以我就不重复造轮子了。

  • 两个的ADC同步:STM32 进阶教程 16 - ADC1与ADC2同步采样张十三的博客的博客-CSDN博客adc同步采样
  • 三个的ADC同步:STM32三个ADC同步规则采样天外飞仙CUG的博客-CSDN博客同步采样

实现方式2

有一个非常简单的思想,可以用来实现两个ADC的同步采样,即ADC1和ADC3分别进行交流采样,并且使用同一个定时器作为触发源。

编程起来非常简单,只需要先开启两个ADC采样,然后开启定时器触发,这样定时器产生的触发信号同时到达两个ADC,两个ADC在接收到触发信号后,随即同一时刻进行采样,就可以实现同步采样啦!

是否很简单?如果有思路了,就不用再看下面的内容了。下面是具体实现步骤,因为同步采样是提高的功能,一些ADC采样基础的配置,比如:基础的ADC采集交流、建立工程等操作,我就不再赘述了。(不会的话可以参考我的相关博客,写了我好久,非常非常详细)

STM32F103RCT6 的 ADC2 不支持 DMA,因此我只能演示 ADC1 和 ADC3 的同步。对于其他型号,例如 F4 和 H7,可以实现三个 ADC 的同步。

原理讲解

两个ADC可以选择同一个触发源,这样当触发源发出触发信号时,两个ADC同时接收触发,并且同时开始采样。

STM32ADC同步采样

工程建立

ADC1的配置

STM32ADC同步采样

STM32ADC同步采样

ADC2的配置

STM32ADC同步采样

STM32ADC同步采样

定时器配置

STM32ADC同步采样

代码编写

STM32ADC同步采样

#define SAMP_NUM 1024 //采样点数

uint16_t ADC1_BUFF_16[SAMP_NUM]; // ADC1的数据缓冲区
uint16_t ADC3_BUFF_16[SAMP_NUM]; // ADC1的数据缓冲区

__IO uint8_t ADC_con_flag = 0;//ADC采集完成标志

和单个ADC采集交流一样。


STM32ADC同步采样

HAL_ADCEx_Calibration_Start(&hadc1); // AD校准,f4不支持
HAL_ADCEx_Calibration_Start(&hadc3); // AD校准,f4不支持

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_BUFF_16, SAMP_NUM);
HAL_ADC_Start_DMA(&hadc3, (uint32_t *)ADC3_BUFF_16, SAMP_NUM);

HAL_TIM_Base_Start(&htim8);//一定要在ADC开启后在开启触发

可以分为下面两步走,顺序不能乱

  1. ADC开启采样
  2. 开启定时器

注意,这里的顺序非常重要:先开启ADC采样,然后再开启定时器。如果定时器没有开启,则没有触发信号来触发ADC采样,因此两个ADC都必须等待定时器开启后才开始采样。

如果先开启定时器,即这样编写代码。

STM32ADC同步采样

由于ADC启动顺序不同,当ADC1启动后,立即开始采样,而ADC3仍在启动过程中,导致ADC3开始采样时,ADC1已经采集了一部分点,这也就导致采集到的数据不同步,或者说没对齐。

这就好比同时开两盏灯,拉上电闸后,无论我们手速多快,分别去按两个灯的开关总归会有先后,无法做到同步;但是我们可以不拉电闸,而是先把两盏灯的开关打开,因为电闸没拉没有通电,灯泡不亮,电闸一拉下来,通电了,两盏灯便会同时亮起。此处两个ADC好比两盏灯,定时器的开启,则是电闸。

下面我们举例来理解下:

STM32ADC同步采样

ADC1和ADC3都捕获同一个正弦信号的5个点,分别存储在数组A和B中。首先,启动定时器,然后先后启动ADC1和ADC3。

当启动ADC1时,它会收到定时器传来的采样触发信号,并开始采样。但是,ADC3尚未启动,因此当它被启动时,ADC1已经捕获了一个数据点,并将其存储在A[0]中。

当ADC3启动时,两个ADC开始同步采样。考虑到ADC1已经捕获了一个信号,因此会产生一个偏移。A[1]和B[0]是同步的,A[2]和B[1]也是同步的。

在这种情况下,由于已知存在一个数据点的偏差,可以忽略首位,把A[1]-A[4]和B[0]-B[3]视为有效的同步信号。实际使用中,可以测量出数据点的偏差数,再进行去头去尾的操作实现“同步”。


STM32ADC同步采样

STM32ADC同步采样

extern uint8_t ADC_con_flag;

ADC_con_flag = 1;

因为ADC1和ADC3是同时采集完成的。所以只需要在其中任意一个ADC的DMA的采集完成中断位置把标志位置一表示采集完成即可。我这里选择的是ADC1的DMA中断。

同步采样的作用

萌新宝宝第一次听到同步采样可能会有些困惑。下面我来介绍下这个模式有什么作用。

很多电路系统都有一套属于自己的幅频和相频曲线,这点在电分、模电等课本中都有提到,已经是常客了。

我们测量幅频的时候比较简单,测量不同频率下输入信号的幅度,再测量输出信号的幅度,两个幅度的比值就是幅频曲线。

而相位则是比较输入和输出信号的相位差来计算。输入信号的相位每一个时刻去测量都是不一样的。例如,前1ms是0°,而后1ms就是45°。但是输入和输出信号的相位差是固定的。

STM32ADC同步采样

我如果先去测量输入信号,测完后,再去测量输出信号,或者先后顺序反过来便不能得到输入输出信号的相位差。只有同时对信号进行测量才能“锁存”住两个信号的相位差。

STM32ADC同步采样

如下图所示,无论是在T1时间段还是T2时间段同步采集,两个信号的相位差是固定的,均是45°。试想如果不同步采样会是如何呢?显然T1时间段的输入信号和T2时间段的输出信号信号相位差就是不“稳定”的,取决于两个时间段之间的时间间隔,不是输入输出本身的45°相位差。

STM32ADC同步采样

同步采样把相位信息“锁存”到了单片机里面。下面就可以采用各种方式,比如FFT变换等分析信号之间的相位相位差了。如果没有同步,相位信息就“丢失”了,无论使用什么方法,都无法计算信号的相位差。

如果理解不了,好好做下练习1,实践感受一下,我相信你可以懂的。

练习

  1. 用信号发生器产生两个相差30°、45°、90°的信号,让单片机分别去采集,打印导VOFA上,观察波形的相位差。每一个信号都多测几次,好好体会下博客中讲解的同步采样的作用。
  2. 有F4、H7的可以尝试开启三个ADC的同步采样。

后记

配套工程:

电赛培训资料: 整理了电赛培训过程中的例程代码 - Gitee.com

更新日志:

2023-2-18:修改了文中的错别字和语句不通顺的地方,增加了例子来说明不按照顺序开启定时器,产生的数据偏移。对“同步采样的作用”进行了更加详尽的描述。
2023-4-19:增加了电闸同时开灯的类比。文章来源地址https://www.toymoban.com/news/detail-412802.html

到了这里,关于STM32ADC同步采样的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32教程之三重ADC交错采样

    ps:本文基于stm32F407ZGT6单片机         stm32F4单片机单通道采集的最大采样率为2.4M,所以有时会难以满足较高频率的采样,于是查阅芯片手册,发现stm32F4支持多重ADC采集,利用每个通道的转换时间,错位采样,从而提高采样率,最大把采样率开到2.4*3=7.2M.  (去年初学AD

    2024年02月12日
    浏览(45)
  • 基于STM32的ADC采样序列频谱分析

      本文主要介绍对ADC采集得到的数字序列进行FFT频谱分析。   确定采样率除了要遵守奈奎斯特采样定律意外还需要考虑一些问题。在数字系统中,我们只能进行一些有限的离散的运算,对于有限长的序列,我们不可能拿它去做DTFT,只能做DFT。这就需要 把有限长序列也当

    2024年02月13日
    浏览(44)
  • STM32--ADC数值采样/附ADC采集热敏传感器使用

    目录 一丶ADC介绍 二丶ADC工作原理及管脚分布 三丶代码部分详解 (一)库函数介绍 (二)代码部分整合         ADC模块中文名为模拟/数字转换器,是12位逐次逼近型的模拟数字转换器,一般用于数值的采样   可以将引脚上连续变化的模拟电压转换为内存中存储的数字变

    2024年02月03日
    浏览(50)
  • 搭建stm32电机控制代码框架(三)——Stm32CubeMx配置ADC采样

    电机控制另一个关键的模块就是ADC采样,这个模块配置的好坏决定了采样电流和电压的精准度,因此有必要对其进行深入学习。 简介: STM32 在片上集成的ADC 外设非常强大。STM32F103xC、STM32F103xD 和STM32F103xE增强型产品内嵌3个12位的ADC,每个ADC 共用多达 21 个外部通道,可以实现

    2024年02月13日
    浏览(45)
  • STM32 ADC单/多通道采样+DMA搬运

    通过介绍我们可以了解到,ADC是12位的转换器,所以采样值范围是0~4095。18个通道可同时进行转换,也可以单独转换某个通道。 使用ADC的流程应为: 初始化IO口。 我这里使用的是PA1进行采样,也就是ADC1的通道1 初始化ADC。 转换、获取采样值。 多通道的时候我们一般用DMA来搬

    2024年02月14日
    浏览(51)
  • STM32双路ADC注入通道和规则通道采样

    电机控制使用四路注入通道采集,参考ST官方库,使用定时器10us触发一次,使用ADC1和ADC2各2路注入通道。 需要一路ADC进行规则采样油门信号,使用中断的话会和注入通道中断放在同一个函数里面 ,我不喜欢,所以使用了DMA中断。 PreKnowledge: 规则通道:最多16个规则通道,采样

    2024年04月14日
    浏览(48)
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示: 其能接受的电压输入范围一般为0-3.3V(V REF- ≤ V IN ≤ V REF+ ),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。 这里用于做ADC采集的引脚使

    2024年02月15日
    浏览(55)
  • STM32CubeMX配置ADC采样(轮询、中断、DMA)

    STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习 先选择所使用的MCU,这里我使用的是STM32F407ZGT系

    2024年02月03日
    浏览(58)
  • STM32F3系列 ADC采样单端采样模式(基于LL库)

    芯片型号:STM32f303RBT6 开发软件:MDK5 CubeMX VS Code 目录 STM32F3系列 ADC 单端采样(基于LL库) 目录 引言 1 基础知识 1.1ADC转换基本流程 1.2 时钟树 1.3 关键参数 1.3.1 位数 1.3.2 触发信号 1.3.3 采样时间 1.3.4 转换时间 2 CubeMx 配置步骤 2.1 确定输入通道 2.2 配置ADC 2.3 输出设置 2.4 MD5 设置

    2024年02月08日
    浏览(40)
  • STM32F407 ADC多通道采样+DMA

    我加入工作室参加的第一个比赛是第五届中国高校智能机器人创意大赛,我参加的赛项是开放部件组轮式自主格斗机器人。经历了没日没夜的调试,无数次欣赏凌晨四点半的夜晚,感受着每天就睡两三个小时伴随着疲惫的开心。在我和队友的共同努力之下,我们的成绩也很优

    2024年02月02日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包