STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

这篇具有很好参考价值的文章主要介绍了STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

准备

配置

步骤

 总结


 文章来源地址https://www.toymoban.com/news/detail-441963.html

准备

正点原子的STM32F103ZET6开发板(精英版)

CUBEMX配置软件

KEIL5

配置

STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

 右对齐就是正常的数据格式。左对齐除以16后得正常数据。(当输出非常大时考虑是否改了对齐方式,默认都是右对齐)

 扫描模式,连续转换模式使能。(多通道下扫描模式自动使能)

采样周期 SamplingTime 越大越精确,越小则则会频繁触发DMA中断(在开启dma中断时,我试了在14M的adc时钟程序进不来while(因为频繁触发DMA中断)

看数据手册,知道三个adc中(adc1,adc2,adc3只有adc1和adc3能用DMA通道。

STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

 ADC的时钟不能超过14Mhz,

配置外设到内存(cubeMX自动配置好了),外设adc地址是不变的,而DMA把数据存到存储器的地址是增长的。

Circular循环模式连续搬运adc数据。

在配置DMA时,因为ad的精度是12位,最大也就是4096,而DMA转储adc是一个通道接着一个通道去存储的,所以转储的时候dma搬运半字(stm32 32位为一个字,半字16位 最大位4096*16)就可以了,节省dma资源提升速度。然后在程序里用一个缓存为uint16_t去接受就不会有问题。

 __IO uint16_t adcbuf[100]={0};

 开启DMA

HAL_ADC_Start_DMA(&hadc1,  (uint32_t*)&adcbuf,100);//

不推荐的的一种配置,也不是不可以,接受数据缓存定义位32位

STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

 

正常情况下我们还是配置成半字长的

 

STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

 

 而我走的一个坑点就adcbuf这个DMA转移数据的缓存数组定义成立uint32_t,(在dma半字转移下)结果就翻船。。。

想着不应该啊,大类型接受小类型数据C是不会出问题的。

  int temp=0;
    for (int i=0 ;i < 100; ){
		temp=i;
		//adcreal[0]+=  adcbuf[i++]*3.3/4096;
		//adcreal[1]+= adcbuf[i++]*3.3/4096;
 		 printf(" %d-Channel1:%d\r\n", temp,adcbuf[i++]);
 		 printf(" %d-Channel2:%d\r\n",temp ,adcbuf[i++]);
  
	   }

依次取两个通道的数据(i为偶数是通道1,i为奇数则是通道二),看串口打印结果(两个通道,一个接3.3v一个接5v电压)

STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

 

 前50是3.3v电压采集,后50是接地采集结果,完全乱了。这种情况下把接受类型改成uint16_t就解决了。

步骤

定义接受缓存(定义成单字转移)

 __IO uint16_t adcbuf[100]={0};
float adcreal[2]={0};

开启接受 

   HAL_ADC_Start_DMA(&hadc1,  (uint32_t*)&adcbuf,100);//

打印数据 (平均滤波)

HAL_Delay(1000);
	 adcreal[0]=0.0;
	 adcreal[1]=0.0;
	 
    for (int i=0 ;i < 100; ){
	 
		 adcreal[0]+=  adcbuf[i++]*3.3/4096;
		 adcreal[1]+= adcbuf[i++]*3.3/4096;
 		 
  
	   }
	 
		 printf(" -Channel1:%1.3f\r\n",adcreal[0]/50);
		 printf(" -Channel5:%1.3f\r\n",adcreal[1]/50);
		 printf("\r\n");

 结果

STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

 

 总结

配置时单字dma转移,uint32_t类型定义缓存。

配置时半字dma转移,uint16_t类型定义接受缓存。

 

到了这里,关于STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    目录 一、实验结果  二、STM32CubeMx配置 三、main.c测试代码 1、RCC配置 (外部晶振选择8MHz。设置相应的分频器M=8,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:168MHz)  2、SYS配置  3、ADC(规则)通道配置(独立模式,预分频4分频,1

    2024年02月15日
    浏览(44)
  • STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

    12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定

    2024年02月06日
    浏览(70)
  • STM32CubeMx配置ADC(多通道采集+DMA读取数据)(HAL库开发)

    目录 1、函数配置过程(这是标准库配置过程): 2、STM32CubeMx配置过程  3、main函数源文件 采集5路ADC数据,并用串口printf()函数打印出来。 实验现象:  ADC转换的初始条件: 1、使能 2、触发源条件完成(这个需要自己配置)利用:HAL_ADC_Start_DMA()函数; ADC中HAL开发优势就是,

    2023年04月08日
    浏览(61)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

     时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  添加DMA  DMA模式选择循环模式  使能DMA连续请求 采样时间配置160.5 转换次数为8  配置好8次转换的顺序  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向

    2024年02月08日
    浏览(47)
  • STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

    按下 STM32F4 的 KEY0 按键,通过外部中断的方式对按键进行检测,然后进行一次固定点数的 DMA ADC 采集,采集完成后在 DMA 的中断发送采集到的数据,然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单处理和傅里叶变化,然后实时显示在电脑上。 开

    2024年02月14日
    浏览(36)
  • 基于stm32+HAL库的ADC电压采集实验

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 只会用if的大神提醒您,敌军还有30秒到达战场,碾碎他们!白银局不要怕! 软件:keil5、stm32cubemx、串口调试助手 硬件:stm32f103系列的开发板、杜邦线*1、串口工具 仅此而已!!!正好6神 1、打开cube

    2023年04月15日
    浏览(31)
  • STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

    本文主要讲解定时器触发ADC去采集交流信号,DMA把数据搬移到内存。 所需工具: 开发板:STM32F103C8T6 STM32CubeMX IDE: Keil-MDK 相关文章: STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx(二) STM32cubemx ADC+TIM+DMA超频采样 ADC+TIM+DMA采集交流信号是电赛中使用范围最为广泛的一个技术。这个模

    2024年02月03日
    浏览(42)
  • 基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

            前言: 本文为手把手教学 ADC采样 及 各式滤波算法 的教程,本教程的 MCU 采用 STM32F103ZET6 。以 HAL库 的 ADC采样 函数为基础进行教学,通过各式 常见滤波 的实验结果进行分析对比,搭配 VOFA+工具 直观的展示滤波效果。 ADC 与 滤波算法 都是嵌入式较为常见的,希望这

    2024年02月03日
    浏览(29)
  • 基于STM32F103C8T6的高速DMA传输多通道ADC数据

    ADC在STM32系列单片机的使用中占用着很大的比例,常见的案例是通过ADC单次转换电压值,这种方式的缺陷在于转换效率不高。一般的单片机带有ADC1和ADC2两个ADC转换,单次转换需要执行一定的程序,想得到结果需要耗费一些时间在赋值,调用中断上面。在此基础上,为了提高转

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

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

    2024年04月14日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包