当前位置: 首页 > news >正文

STM32中ADC + DMA自动采集系统

一、系统原理概述

ADC + DMA 自动采集系统”是一种高效的数据采集架构,适用于需要高频率采样且要求CPU占用率低的应用场景(如传感器采集、音频处理、电压监控等)。

系统由以下三个核心模块组成:

  • ADC(模数转换器):将连续变化的模拟电压信号转换为数字信号;
  • DMA(直接存储器访问):将ADC转换的结果自动传输到内存中;
  • CPU(中央处理单元):仅负责初始化配置和处理数据,不参与中间搬运过程。

类比理解:

  • ADC 相当于“扫描仪”,负责采集外部信号;
  • DMA 相当于“传送带”,负责将采样结果送达内存;
  • CPU 相当于“指挥者”,只在需要时查看结果并进行处理,不负责搬运数据。

二、工作流程

数据采集的完整工作流程如下:

  1. CPU初始化配置ADC与DMA
  2. 启动ADC采样
  3. ADC完成一次采样后,自动触发DMA传输
  4. DMA将数据搬运至预设内存数组中
  5. 当采样达到设定数量后,DMA触发中断通知CPU
  6. CPU响应中断,处理采集到的数据

这种机制实现了**“采集-传输-存储-处理”**的全自动化流程,使得CPU资源得到极大释放。


三、关键技术点

技术点说明
ADC触发模式可使用软件触发定时器触发;建议使用定时器触发以实现等间隔采样
DMA传输模式采用循环模式(Circular),实现持续采样与回写
数据缓冲区使用数组(如 uint16_t ADC_ConvertedValue[])存储采样结果
通道映射以 STM32F1 为例,DMA1_Channel1 与 ADC1 配合使用
数据对齐与大小ADC输出为 12-bit,建议使用 uint16_t 类型接收
中断处理可选用 DMA 传输完成中断,实现数据处理触发机制

四、系统初始化步骤

Step 1:GPIO 配置为模拟输入

void ADC_GPIO_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  // ADC通道0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);
}

Step 2:ADC 配置

void ADC_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);ADC_Cmd(ADC1, ENABLE);// 校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));
}

Step 3:DMA 配置

#define ADC_BUFFER_SIZE 1000
uint16_t ADC_ConvertedValue[ADC_BUFFER_SIZE];void DMA_Config(void)
{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;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_InitStructure.DMA_Priority = DMA_Priority_High;DMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1, ENABLE);ADC_DMACmd(ADC1, ENABLE);
}

Step 4:启动ADC

void Start_ADC(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

五、主函数示例

int main(void)
{ADC_GPIO_Config();  // 配置GPIO为模拟输入DMA_Config();       // 配置DMAADC_Config();       // 配置ADCStart_ADC();        // 启动ADC采样while (1){// 在此处理 ADC_ConvertedValue[] 中的数据// 可加入滤波算法、数据上传、显示等功能}
}

六、运行效果

  • 系统可以持续、自动地采集模拟电压信号;
  • 采样数据实时存入内存数组,无需CPU干预;
  • CPU可以用于其他任务(如串口通信、数据显示、控制逻辑等);
  • 在 STM32F103 平台上,可实现 1Msps(百万次每秒)采样率,性能强大。

七、常见问题与调试技巧

问题可能原因解决方法
数据全为0DMA未启用,ADC未启动检查 DMA 与 ADC 启动顺序
数据偏移、错位缓冲区大小或数据对齐错误确保 uint16_t 类型匹配 ADC 输出
数据不连续DMA未设置为 Circular 模式DMA_Mode 设置为 DMA_Mode_Circular
中断不触发未配置DMA中断或未清中断标志配置中断并在中断服务函数内清除标志
数据过快丢失缓冲区太小,处理不及时增大数组或提高处理速度

八、知识总结

模块功能说明
ADC模拟信号采样将电压模拟信号转换为数字值
DMA自动数据传输自动将ADC转换结果搬运到内存
CPU控制与数据处理初始化配置,处理最终结果

九、扩展建议

  • 使用定时器触发ADC采样,实现精确周期采样;
  • 添加DMA中断处理函数,在采样完成时自动处理数据;
  • 多通道采样支持:开启 ScanConvMode 配合 DMA 多通道缓冲;
  • 滤波与均值算法:对采样值进行软件滤波,提升稳定性;
  • 结合RTOS或定时任务:实现更复杂的多任务处理结构。
http://www.dtcms.com/a/589183.html

相关文章:

  • 读书之《架构师的自我修炼》_个人笔记
  • 什么网站可以快速做3d效果图php网站维护
  • 迅速提高网站排名帮别人做网站收多少钱合适
  • 怎么做网站上的模拟动画做网站四百全包
  • 利用短整数类型和部分字符串优化DuckDB利用数组求解数独SQL
  • 营销型网站四大功能模版网站有源代码吗
  • 力扣81. 搜索旋转排序数组 II
  • WampServer安装教程(图文步骤)+ 下载+配置+解决图标红橙绿问题【附安装包】
  • 使用 dash 构建 mvvm 整洁架构应用
  • 跨时钟域处理
  • 2025制品管理工具选型,jfrog vs nexus vs hadess哪一款更好用?
  • 北京校园网站建设wordpress新建页面是
  • 【1.7】基于FPGA的costas环开发1——发射端信号产生模块
  • Postman 工具实现签名校验:完整操作指南与代码解析
  • AQS介绍
  • reshape的共享内存
  • 数据结构之,栈与队列
  • 【数据结构】基于哈夫曼树的数据压缩算法
  • SQLAlchemy2.0使用
  • 利用binlog2sql数据闪回实战
  • 东莞网站建设曼哈顿信科网站建设的总体设计概图
  • 算法:矩形区域不超过k的数值和
  • 算法30.0
  • 算法基础篇:(四)基础算法之前缀和
  • Nginx优化与防盗链
  • Vue-vuex 核心概念和 API
  • 分治归并算法第一弹
  • 【数据结构】哈夫曼树技术详解:原理、算法与应用
  • 贵阳网站备案在哪里网站红色
  • 个人网站公司网站区别经营区别数字货币怎么推广赚钱