1、初始化GPIO

使能GPIO时钟,把ADC对应的GPIO配置为模拟输入
下面展示一些 内联代码片

void ADC_GPIO_Initial(void)
{GPIO_InitTypeDef       GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);}

2、配置ADC

/*adc.c*/
void ADC_Initial(void)
{ADC_InitTypeDef        ADC_InitStructure;ADC_CommonInitTypeDef  ADC_CommonInitStructure;DMA_InitTypeDef        DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA_x, ENABLE);ADC_GPIO_Initial();DMA_InitStructure.DMA_Mode    = DMA_Mode_Circular;           //循环采集DMA_InitStructure.DMA_Channel = DMA_Channel_x;               //通道  三重模式只需使能 ADC1 的 DMA 通道。DMA_InitStructure.DMA_DIR     = DMA_DIR_PeripheralToMemory;  //外设到内存DMA_InitStructure.DMA_Priority   = DMA_Priority_High;        //数据流优先级DMA_InitStructure.DMA_BufferSize = 8;                        //设定待传输数据通道DMA_InitStructure.DMA_FIFOMode      = DMA_FIFOMode_Disable;  //失能FIFO模式DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//FIFO阈值,全部使用,由于上面失能该模式,故该设置无效DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_MultiModeConveredValue;DMA_InitStructure.DMA_MemoryBurst     = DMA_MemoryBurst_Single;      //ADC是直接传输,要选单次模式DMA_InitStructure.DMA_MemoryDataSize  = DMA_MemoryDataSize_HalfWord; //储存器数据宽度DMA_InitStructure.DMA_MemoryInc       = DMA_MemoryInc_Enable;        //地址自增 与 DMA_BufferSize 联系,1 --> 不自增DMA_InitStructure.DMA_PeripheralBaseAddr = MultiMode_ADC_ADDR;             //ADC1地址基地址 + ADC1数据寄存器偏移地址DMA_InitStructure.DMA_PeripheralBurst    = DMA_PeripheralBurst_Single;     //ADC是直接传输,要选单次模式DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;      //无需设置为储存地址自增模式DMA_Init(DMAx_Stream_x, &DMA_InitStructure);DMA_Cmd(DMAx_Stream_x, ENABLE);RCC_APB2PeriphClockCmd(MultiMode_ADCx_CLK, ENABLE);ADC_StructInit(&ADC_InitStructure);ADC_CommonInitStructure.ADC_Mode      = ADC_Mode_Independent;      //独立模式ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;        //4分频ADC_CommonInitStructure.ADC_DMAAccessMode    = ADC_DMAAccessMode_Disabled;//ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;ADC_CommonInit(&ADC_CommonInitStructure);ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;             //使能连续转换ADC_InitStructure.ADC_DataAlign          = ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_NbrOfConversion    = 8;                  //转换通道ADC_InitStructure.ADC_Resolution   = ADC_Resolution_12b;       //分辨率: 12位ADC_InitStructure.ADC_ScanConvMode = ENABLE;  //使能扫描模式,多通道采集才会用得到ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_Init(MultiMode_ADCx, &ADC_InitStructure);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_1, 2, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_2, 3, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_3, 4, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_4, 5, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_5, 6, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_6, 7, ADC_SampleTime_3Cycles);ADC_RegularChannelConfig(MultiMode_ADCx, ADC_Channel_7, 8, ADC_SampleTime_3Cycles);ADC_DMARequestAfterLastTransferCmd(MultiMode_ADCx, ENABLE);// 使能 DMA 请求ADC_DMACmd(MultiMode_ADCx, ENABLE);ADC_Cmd(MultiMode_ADCx, ENABLE);ADC_SoftwareStartConv(MultiMode_ADCx);
}/*adc.h*/
#ifndef __ADC_H
#define __ADC_H#include "stm32f4xx.h"#define MultiMode_ADCx               ADC1
#define MultiMode_ADC_ADDR           ((u32)MultiMode_ADCx+0x4c)
#define MultiMode_ADCx_CLK           RCC_APB2Periph_ADC1#define RCC_AHB1Periph_DMA_x         RCC_AHB1Periph_DMA2
#define DMA_Channel_x                DMA_Channel_0
#define DMAx_Stream_x                DMA2_Stream0void ADC_GPIO_Initial(void);
void ADC_Initial(void);#endif

2.1 ADC_Mode

ADC_CCR 寄存器MULTI[4:0]用于多重 ADC 模式选择

2.2、ADC_Prescaler

设置 ADC 预分频器。
STM32F4 的 ADC 最大的转换速率为 2.4Mhz,也就是转换时间为 0.41us(在 ADCCLK=36M,采样周期为 3 个 ADC 时钟下得到),不要让 ADC 的时钟超过 36M,否则将导致结果准确度下降。

2.3、ADC_ScanConvMode & ADC_ContinuousConvMode

ADC单通道:

要求进行一次ADC转换:配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换。

要求进行连续ADC转换:配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。

ADC多通道:必须是扫描模式

要求进行一次ADC转换:配置为单次模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。

要求进行连续ADC转换:配置为连续模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。

因此,得出结论:扫描模式只在多通道的条件下有效,来使得各个通道按照配置循序依次转换。而单次模式无论在单通道还是多通道下只对这些或者这个通道进行一次转换,连续模式无论是在单通道还是多通道下都对这些或者这个通道不断进行连续的转换。

扫描模式用于多通道采集时,一轮采集为根据通道设定的顺序依次采集每个开启的通道。但要注意的是每个通道采集到的值都是存放在寄存器ADCx-> DR中,而只有当一轮采集完即所有设定的通道都采集完后采集完成标志才会被置位,所以不使用DMA传输方式的时候会出现采集到的数据被覆盖的现象。

2.4、 ADC_ExternalTrigConvEdge

STM32F4 的 ADC 在单次转换模式下,只执行一次转换,该模式可以通过 ADC_CR2 寄存器的 ADON 位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道),这时 CONT 位为 0。

2.5、 ADC_NbrOfConversion

3、读取ADC的采样值


extern __IO uint16_t ADC_MultiModeConveredValue[8];
__IO float ADC_MultiModeValue[8];int main(void)
{uart_init(115200);delay_init(168);int i;ADC_Initial(); while(1){for(i=0; i<8; i++){ADC_MultiModeValue[i] = (float) ADC_MultiModeConveredValue[i]/4096*(float)3.3;if(i==8) i = 0;}}
}

3.1、ADC采样时间

对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低 ADC 的转换速率。 ADC 的转换时间可以由以下公式计算:
Tcovn=采样时间+12 个周期
其中: Tcovn 为总转换时间,采样时间是根据每个通道的 SMP 位的设置来决定的。例如,当 ADCCLK=21Mhz 的时候,并设置 3 个周期的采样时间,则得到: Tcovn=3+12=15 个周期=0.71us。

代码参考文章
https://blog.csdn.net/fang_dz999/article/details/104969872

STM32F4_ADC多通道采样相关推荐

  1. STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置

    本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作. #include    "adc.h" [cpp] view plaincopy #defi ...

  2. STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程

    STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程 -

  3. STM8学习笔记---ADC多通道采样

    STM8S003单片机ADC采样通道总共有5个,从AIN2---AIN6,多通道采样时需要将ADC转换设置为单次转换模式,每次切换采样通道后,需要重新初始化 ADC,采样结果在中断中读取. IO口初始 ...

  4. EFM32片内外设--ADC之多通道采样+Timer+PRS触发+DMA

    在Application note中,ADC已经有了很多的例子,唯独缺少一个多通道定时触发进行扫描的例程.从理论上讲,将ADC配置为多通道ADC转换,配合DMA进行数据传输,而且使用Timer+PRS ...

  5. 多通道采样常用模拟开关简介

    在设计测试设备时,通常会遇到一套测试设备需测试多个不同点的同类物理量.通常的做法是信号调理及ADC部分共用,采样则是多通道分时采样,这就涉及到采样切换开关,最常用与最方便的就是模拟开关,模拟开关的英文 ...

  6. 多通道采样键精确电力线监测

    精确的电力线监测已成为一个重要的要求,不仅集中在电网本身,而且在其边缘.对于电网连接的能量收集发电系统,甚至是终端设备,正在进行的电能质量特性分析有助于确保电网和附属系统的健康.在电力监控系统的心脏, ...

  7. GD32F4xx MCU ADC+DMA 多通道采样

    1.GD32F4xx ADC GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器. 1.1 主要特征 可配置12位.10位.8位.6位分辨率: ADC采样率:12位分辨率为2.6M ...

  8. STM32的ADC采样与多通道ADC采样

    一 单通道采样  参考资料: <STM32库开发实战指南> 刘火良,杨森著 原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图 这里使用的是3362电位器(10K ...

  9. cubemx 配置多通道ADC进行ADC采样

    cubemx 配置多通道ADC进行ADC采样 AD的基础知识 AD很复杂,其实也不复杂,因为我们用的不多. AD:模拟量转换数字量(模拟信号转换数字信号). ADC:模拟量转数字量的转换器. 为什么需 ...

最新文章

  1. 洛谷2766:[网络流24题]最长不下降子序列问题——题解
  2. 我的程序员之路:上帝的苹果
  3. C# 正则表达式验证
  4. JMeter的PUT请求,响应结果中文出现乱码的解决方法
  5. python适合开发游戏吗_用python能制作游戏吗
  6. [react] 写出React动态改变class切换组件样式
  7. (转)使用tar和split打包分割文件
  8. 宝可梦推出「电子鸡」新游戏 训练师赶紧将可爱伊布带回家!
  9. TOB、TOC、TOVC
  10. 林语堂:读书须有胆识,有眼光,有毅力
  11. 关于嵌套类的调用更新问题
  12. LVDT位移传感器的构成原理及特点
  13. redis 使用geo来存储地理经纬度信息
  14. Python搭建QQ机器人,监控QQ发言与进群退群,自动@新成员并屏蔽脏话踢人
  15. 英文大写字母A~Z,小写字母a~z对应的ASCII码快速查询
  16. 大一上:英语复习:汉译英(新视野大学英语读写教程1:第一、三、四、六单元分句+注释)
  17. 计算机如何重新连接打印机,电脑重装系统后怎么连接打印机
  18. 参加ACM比赛所需的基础知识
  19. ios 视频选择封面功能
  20. 三星智能手表取得快速增长,华为和小米则以低价穿戴设备取胜

热门文章

  1. 男程序员用双手虐了多少女明星?
  2. 学习日记(1.12)
  3. jmeter安装成功后打不开,提示:Cause: CannotResolveClassException: com.blazemeter.jmeter.threads.concurrency.Conc
  4. 北京科技大学计算机专业毕设,北京科技大学毕业生近五年就业情况分析(2017)
  5. 计算机电脑显示器都有多大的,电脑显示器买多大的合适
  6. GOOGLE搜索秘籍
  7. 计算机应用基础第七章自测题,计算机应用基础习题第七章.doc
  8. [rosrun] Couldn‘t find executable named.....
  9. 微软学生中心开始对学生免费赠送Windows Server 2008 R2标准版
  10. 推荐一个单干网赚好站!BUXJOB - 健康程序员,至尚生活!