目录

一:STM32F4的ADC简介

1.1 ADC简介(不看也行)

1.2 ADC的供电及采样电压

二:实验步骤及代码

2.1实验步骤

2.2实验代码

2.2.1 ADC初始化代码

2.2.2 DMA初始化代码

2.2.3 main函数代码

2.2.4 验证步骤

三:一些注意事项(程序运行不成功可以往这找)

ADC设置方面:

DMA设置方面

数据处理方面


一:STM32F4的ADC简介

1.1 ADC简介(不看也行)

简单来说ADC就是将模拟量电压转换为数字量的工具,F4的12 位 ADC 是逐次趋近型模数转换器。有19 个复用通道,可测量来自16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC采样的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。ADC 具有模拟看门狗特性——允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。

1.2 ADC的供电及采样电压

ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V。

ADC 输入范围:VREF-     VIN    VREF+ , 并且VREF- 如果可用(取决于封装),则必须将其连接到 VSSA。而通常我们将VREF+与VDDA连接,同时博主还注意到,F407的芯片引脚当中VSS、VDD引脚并不容忍5V供电,而ADC的采集引脚很多可以容忍5V,所以通常情况下,ADC采集的范围在0-3.3V。

二:实验步骤及代码

2.1实验步骤

通过设置ADC1的三个通道采样顺序并且开启DMA相对应的通道,对数据寄存器当中每一次的采样值(对应每个通道的外部电压转换值)进行收集,并传递到CPU的内部寄存器当中,再对电压值进行串口输出。

2.2实验代码

2.2.1 ADC初始化代码

完成ADC相关的初始化配置,将三个通道的采样顺序进行排序。

void  Adc_Init(void)
{    GPIO_InitTypeDef       GPIO_InitStructure;ADC_CommonInitTypeDef  ADC_CommonInitStructure;ADC_InitTypeDef        ADC_InitStructure;/*时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /*先初始化ADC1通道3、4、5 IO口*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;lADC_CommonInit(&ADC_CommonInitStructure);ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐   ADC_InitStructure.ADC_NbrOfConversion = 3;//3个转换在规则序列中 ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化/*ADC采样顺序*/ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_3Cycles );            ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_3Cycles );ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_3Cycles );ADC_Cmd(ADC1, ENABLE);//开启AD转换器     ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);ADC_DMACmd(ADC1, ENABLE);ADC_SoftwareStartConv(ADC1);      //使能指定的ADC1的软件转换启动功能    }

2.2.2 DMA初始化代码

完成DMA的初始化配置

u16 ADC_ConvertedValue[3]={0};
void Dma_Init(void)
{DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // 外设基址为:ADC 数据寄存器地址DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)ADC1+0x4c);   // 存储器地址,实际上就是一个内部SRAM的变量    DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC_ConvertedValue;  // 数据传输方向为外设到存储器 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;    // 缓冲区大小为,指一次传输的数据量DMA_InitStructure.DMA_BufferSize = 3;    // 外设寄存器只有一个,地址不用递增DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 存储器地址递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 外设数据大小为半字,即两个字节 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 存储器数据大小也为半字,跟外设数据大小相同DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;    // 循环传输模式DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响DMA_InitStructure.DMA_Priority = DMA_Priority_High;// 禁止DMA FIFO   ,使用直连模式DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;  // FIFO 大小,FIFO模式禁止时,这个不用配置    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  // 选择 DMA 通道,通道存在于流中DMA_InitStructure.DMA_Channel = DMA_Channel_0; //初始化DMA流,流相当于一个大的管道,管道里面有很多通道DMA_Init(DMA2_Stream0, &DMA_InitStructure);// 使能DMA流DMA_Cmd(DMA2_Stream0, ENABLE);}

2.2.3 main函数代码

完成数组当中数据的赋值并且打印输出

int main(void)
{ extern u16 ADC_ConvertedValue[3];NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);    //初始化延时函数uart_init(115200); //初始化串口波特率为115200Adc_Init();         //初始化ADCDma_Init();while(1){ printf ("V3:%d\r\n",ADC_ConvertedValue[0]);printf ("V4:%d\r\n",ADC_ConvertedValue[1]);printf ("V5:%d\r\n",ADC_ConvertedValue[2]);delay_ms(500); }
}

2.2.4 验证步骤

将代码烧录至芯片,将PA3、4、5三个引脚分别连接0-3.3V之间不同的电压,打开串口接收,可以看见有不同的数值产生。

三:一些注意事项(程序运行不成功可以往这找)

ADC设置方面:

1.首先是ADC初始化当中,在这里设置为模拟输入,在STM32芯片设置当中,对于ADC、DAC的引脚设置都为模拟输入。

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

2.ADC的工作模式我们选择独立模式,在结构体当中,模式设置有很多,在设置的时候需要设置相应的模式。

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式

3.开启扫描模式并且开启连续转换

  ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//开启连续转换

4.确定通道采集顺序(很重要,跟数据提取顺序相关)

 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_3Cycles );          ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_3Cycles );ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_3Cycles );

DMA设置方面

1.外设地址,这里设置为基地址+偏移地址(规则数据寄存器)

 DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)ADC1+0x4c);

2.内部寄存器地址——一个数组地址,同时我们需要注意,这个数组是16位的数组,如果设置为32位,会导致在数据读取的时候出现问题。

 DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC_ConvertedValue;  

3.外设地址不递增,寄存器地址递增

    // 外设寄存器只有一个,地址不用递增DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 存储器地址递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 

数据处理方面

在主函数里对数组当中的数据进行处理,数组当中存储的数据顺序与在ADC初始化代码当中的采样顺序相同。

基于STM32F407的ADC解析-ADC1多通道扫描模式电压采集实验(启用DMA传输数据)相关推荐

  1. 基于STM32F407使用ADC采集电压实验

    核心板:STM32F407 实验目的:使用ADC采集电压值将其打印在串口助手上 目录 ADC简介 STM32F407 ADC通道对应的引脚 STM32F407中的数据寄存器 ADC 规则数据寄存器 ( ...

  2. 基于STM32F407 ADC双通道 PS2游戏机摇杆ADC采集

    基于STM32F407 ADC双通道 PS2游戏机摇杆ADC采集 一.PS2游戏机摇杆概述 1.1PS2游戏机摇杆概述 1.2PS2游戏机摇杆图解 二.硬件连接分析 三.代码实现 3.1 ADC代码 ...

  3. ADC模数转换器(基于STM32F407)

    简介 Analog-to-digital converters(模拟数字转换器),我的STM32F407中内置3个ADC,每个 ADC 有 12 位.10 位.8 位和 6 位可选,ADC 具有独立模 ...

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

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

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

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

  6. STM32f4系列ADC解析

    12位ADC简介 12位ADC是一种逐次逼近型模拟数字转换器.它有多达19个通道,可测量16个外部和2个内部信号源和Vbat通道.各通道的A/D转换可以单次.连续.扫描或间断模式执行.ADC的结果可以 ...

  7. 基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)

    目录 概述 1.原理图 2.在这先普及一下概念 3.通过查看STM32L0中文数据手册中301页,第14.10 小节 ,DataSheet 4.ADC通道转换模式的理解 5.STM32CubeMx工具 ...

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

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

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

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

最新文章

  1. JSP第二次作业_5小题
  2. 网上的假货太多,你把握不住的,让AI来
  3. 两只塔姆沃斯牛 The Tamworth Two
  4. day34 并行并发、进程开启、僵尸及孤儿进程
  5. 在python中操作excel
  6. esxi管理端口_网工知识角|一分钟轻松了解华为端口安全机制
  7. mysql链路跟踪工具_EasySwoole利用链路追踪组件制作甩锅工具
  8. mysql limit原理_Mysql面试题锦集
  9. android 活动之间传递参数,Android:使用适配器在活动之间传递参数
  10. mysql writing to net_mysql 提示 Writing to net_MySQL
  11. 思科CCNA认证视频 CCNA视频 ccna最新题库 专题 复习资料
  12. 能测试经纬度的软件,经纬度转换工具(适用多种测试软件)
  13. 开源代码和框架专栏汇总
  14. 矩阵标准型的系数是特征值吗_矩阵分解术,不得不从高斯说起
  15. P1067 多项式输出 【模拟】
  16. 美团店铺评价语言处理以及文本分类(logistic regression)
  17. bilibili_api,仅用 3 行代码获取B站(弹幕、评论、用户)数据
  18. 怎样成为优秀的前端_如何成为优秀的在线社区会员
  19. 地理信息系统(GIS)的前沿技术综述
  20. 用计算机怎么计算r角度,R语言中的数学计算

热门文章

  1. s2系列——s2-012,s2-013,s2-015,s2-016
  2. NOI 2021 游记题解总结
  3. BrightlyPro - 照片视屏后期自动调色增亮工具
  4. VisIonPro学习笔记
  5. VisionPro相机操作类
  6. 大哥要我实现天干地支的组合
  7. Firefox/Chrome渗透测试插件推荐
  8. JAVA毕设项目林家餐厅自助点餐管理系统(java+VUE+Mybatis+Maven+Mysql)
  9. 高考十年后,我成为一名高级研发工程师
  10. 2021年中国家具行业现状及未来趋势分析:线上渠道将成为新增长点[图]