STM32F407和STM32F103在HAL库使用的时候有较大的差别,同时407取消掉了ADC校准,在使用DMA进行多通道采集时需要打开DMA连续请求:hadc1.Init.DMAContinuousRequests = ENABLE;否则DMA传输的数组里面就只会有第一次传输的数据,再也不会增加了。
同时在实验过程中发现407的ADC精度貌似不是很准确,采样率越高,偏差越大。受到(http://www.openedv.com/forum.php?mod=viewthread&tid=51312)的启发,自己也进行了一点小小的实验。
ADC1的通道3在 ADCCLK=10.8MHz(8分频)的情况下,对通道3进行接地处理,数字稳定在0-1之间;对通道3接入高电平3.3v,数字稳定在4092;在2分频的情况下,ADCCLK=42MHz(2分频),对通道3进行接地处理,数字稳定在2-3之间;对通道3接入高电平3.3v,数字稳定在4092;

自己分析出现以上情况,可能是参考电压有问题或者本身板子的设计有问题,干扰太大。但是也没深究,希望对精度有更高要求的同志能进行较为深入的研究,给大家指条明路。

并且,在引脚悬空的情况下会出现数值在1040-1060之间的数值跳动,因此输入管脚请不要悬空处理!!!!!!!!!

下面贴一下ADC.C的信息 双通道进行DMA处理,第一通道接PA3,接受光敏电阻的信息,第二通道是单片机内部的温度通道。

#include "adc.h"#include "gpio.h"
#include "dma.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;/* ADC1 init function */
void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig;/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */hadc1.Instance = ADC1;hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;hadc1.Init.Resolution = ADC_RESOLUTION_12B;hadc1.Init.ScanConvMode = ENABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 2;hadc1.Init.DMAContinuousRequests = ENABLE;hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;if (HAL_ADC_Init(&hadc1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */sConfig.Channel = ADC_CHANNEL_3;sConfig.Rank = 1;sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;sConfig.Rank = 2;sConfig.SamplingTime = ADC_SAMPLETIME_112CYCLES;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}}void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{GPIO_InitTypeDef GPIO_InitStruct;if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspInit 0 *//* USER CODE END ADC1_MspInit 0 *//* ADC1 clock enable */__HAL_RCC_ADC1_CLK_ENABLE();/**ADC1 GPIO Configuration    PA3     ------> ADC1_IN3 */GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* ADC1 DMA Init *//* ADC1 Init */hdma_adc1.Instance = DMA2_Stream0;hdma_adc1.Init.Channel = DMA_CHANNEL_0;hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;hdma_adc1.Init.Mode = DMA_CIRCULAR;hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;if (HAL_DMA_Init(&hdma_adc1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);/* USER CODE BEGIN ADC1_MspInit 1 *//* USER CODE END ADC1_MspInit 1 */}
}void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspDeInit 0 *//* USER CODE END ADC1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_ADC1_CLK_DISABLE();/**ADC1 GPIO Configuration    PA3     ------> ADC1_IN3 */HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3);/* ADC1 DMA DeInit */HAL_DMA_DeInit(adcHandle->DMA_Handle);/* USER CODE BEGIN ADC1_MspDeInit 1 *//* USER CODE END ADC1_MspDeInit 1 */}
} 

最后奉上源代码。 点击打开链接

STM32F407 DMA采集多通道ADC相关推荐

  1. 使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据

    我的使用环境: 硬件:STM32F767ZGT6.串口1.ADC1.16MHz晶振.216MHz主频 软件:STM32 CUBE IDE 优点:不用定时触发采样,ADC数据是不停的实时更新,ADC数据 ...

  2. STM32F4基于DMA的多通道ADC采集——遇到的问题解决

    这几天在尝试用DMA实现规则通道多通道的ADC采集,遇到了不少问题,在这记录一下我遇到的问题,一方面理顺一下思路,也希望后人少走弯路. 一开始按照开发板资料中的程序源码编写,但无论如何配置,也无法实现 ...

  3. 立创梁山派GD32F450ZGT6--使用DMA实现多通道ADC采集

    这次调试有些久,缺乏的知识很多,最重要的是ADC的引脚配置为浮空之后,如果没有接入东西,其读取的ADC值是不确定的,所以在测试的时候,一定要把对应的电压接入ADC引脚,测量的值才是准确的. 上代码. ...

  4. 基于STM32F103C8T6的高速DMA传输多通道ADC数据

    文章目录 前言 一.软件设计思路 二.代码 总结 前言 ADC在STM32系列单片机的使用中占用着很大的比例,常见的案例是通过ADC单次转换电压值,这种方式的缺陷在于转换效率不高.一般的单片机带有AD ...

  5. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效

    基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...

  6. STM32F767多通道ADC采集+DMA传输

    文章目录 一.ADC简介 1.ADC采样频率 2.ADC转换时间 3.ADC寄存器 4.ADC引脚与外部通道对应关系 二.DMA简介 三.代码配置 1.ADC.DMA初始化配置 2.adc.h文件的配 ...

  7. STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及傻瓜式解析)

    STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及通俗解析) ​ 利用STM32的片上外设可采集多个模拟量(如传感器数值),并在嵌入式程序中使用.如果只使用了一个通道,用时令ADC转换而后读取 ...

  8. STM32——多通道ADC的DMA方式采集方法

    前言: 最近在调试STM32F205芯片ADC多通道DMA方式采集数据,总结下STM32多通道ADC的DMA方式采集的使用方法. 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 ...

  9. STM32/APM32 用DMA采集ADC1多通道--标准库

    本文使用的是APM32E103作为示例的, STM32F/E以及APM32F等系列同样适用. 一.ADC及其通道 ADC1:最多16个外部通道,2个内部通道.内部通道分别是温度传感器和参考电压 ①:温 ...

最新文章

  1. git 命令使用技巧
  2. [CODEVS 1087] 麦森数
  3. Spring3 RESTful Web服务
  4. mysql 和区块链的差别_论区块链是什么数据库——正名篇
  5. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
  6. IOS的 testflight测试设置
  7. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
  8. 55 SD配置-定价配置-定义定价过程的条件排斥
  9. 李开复谈创业失败十原因:经不住诱惑 直接山寨
  10. php全表搜索,搜索整个表? PHP MySQL
  11. 欢迎进入测试day01作业
  12. Oracle 同音字查询,对外汉语汉字教学
  13. 访问html报401,设置自定义401错误页面方法详解
  14. java 计算父亲节_写了一个简单的计算父亲节母亲节等日期的方法
  15. VMware下安装虚拟机windows server 2016
  16. 体验论文新神器!AMiner人工智能工具,自动溯源论文来龙去脉
  17. jetbrains(IDEA/PyCharm)官网地址打不开
  18. [转载][转]无线衰落信道、多径与OFDM、均衡技术
  19. FZU - 2301 H - Chosen by god (组合数学)
  20. 稀土行业有机废水处理除TOC(P507\萃余液)

热门文章

  1. 派网AX50C设备上线做VPN服务器
  2. 使用matlab中PIV算法
  3. CT医学影像的窗高窗位、CT值(Hu值)
  4. gitlab fatal: could not read Username for : Device not configured
  5. 母亲节到了,用Python给老妈写个祝福小程序~
  6. 14行列式03---克拉默法则、非齐次与齐交线性方程组
  7. Java新AIO/NIO2:AsynchronousFileChannel以Future方式读
  8. 电影文件名缩写说明——DVDSCR,TS/TC,REMUX
  9. Apache Kafka 入门 - Kafka命令详细介绍
  10. Java 读取EXCEL表格中的数据,将数据转为SQL语句