一种基于stm32的多通道ADC和DMA的设置问题详解

发布者:SereneSerenity最新更新时间:2024-03-28 来源: elecfans关键字:stm32  多通道ADC  DMA  设置问题 手机看文章 扫描二维码
随时随地手机看文章

一、多通道ADC和DMA的配置问题:

刚开始不知道怎么去配置,到处找资料发现很多不是很适用。很盲目的找了很久的资料,后来发现官方的固件库里面有很详细的资料。稍微改了一下官方的demo一下就编译成功了。这个例子的启示是:别忙着去网上找现成的例子,启示固件库里面的例程很给力了。

一种基于stm32的多通道ADC和DMA的设置问题详解

程序需求是开通三个ADC通道分别采集3V 的基准电压、控制反馈温度和环境温度。

因为用示波器测试时发现TED控制PWM的开关的高频噪声耦合到控制地中来了,所以会有一些高频尖刺。我的解决办法是每组数据通过DMA采集100个点,除去最大的10个数和最小的10数然后取平均值。

配置代码如下:

uint16_t Rec_buff[100][3];

void DMA_Configuration(void)

{

DMA_InitTypeDef DMA_InitStructure;

/* DMA1 channel1 configuration ----------------------------------------------*/

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

DMA_DeInit(DMA1_Channel1); //DMA重新设置为缺省值

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//DMA??ADC???

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Rec_buff; //DMA数据填充的地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//SRC模式,外设向内存中搬运

DMA_InitStructure.DMA_BufferSize = 300; //接收容量

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址是否增长,这里没有开启

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//接收地址储存地址是否自增长

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //搬运尺寸是16位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA搬运数字的大小

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式

DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //M2M禁止

DMA_Init(DMA1_Channel1, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel1, DMA_IT_TC , ENABLE);

/* Enable DMA1 channel1 */

DMA_Cmd(DMA1_Channel1, ENABLE);

}

void ADC_Configuration(void)

{

ADC_InitTypeDef ADC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO, ENABLE);

/* ADC1 configuration ------------------------------------------------------*/

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = ENABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 3;

ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_55Cycles5);

/* Enable ADC1 DMA */

ADC_DMACmd(ADC1, ENABLE); //打开ADC和DMA的关联

/* Enable ADC1 */

ADC_Cmd(ADC1, ENABLE); //打开ADC,可以通过“ADC_Cmd(ADC1, DISABLE); ”语句来关闭

/* Enable ADC1 reset calibration register */

ADC_ResetCalibration(ADC1);

/* Check the end of ADC1 reset calibration register */

while(ADC_GetResetCalibrationStatus(ADC1));

/* Start ADC1 calibration */

ADC_StartCalibration(ADC1);

/* Check the end of ADC1 calibration */

while(ADC_GetCalibrationStatus(ADC1));

/* Start ADC1 Software Conversion */

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

在调试的时候发现每个通道的数据经常会出现乱的现象:本来是通道一的数据出现到通道二之类的。后来一想可能是DMA接收数据完后需要清零,所以在每次数据接收完毕后都会重新配置一下DMA。


关键字:stm32  多通道ADC  DMA  设置问题 引用地址:一种基于stm32的多通道ADC和DMA的设置问题详解

上一篇:深度解析STM32外设配置冲突问题
下一篇:STM32之软件CRC和硬件CRC速度测试

推荐阅读最新更新时间:2026-03-19 11:20

stm32多通道ADCDMA设置问题
最近在倒腾LD驱动的时候遇到不少问题,下面就一一的记录一下啦,不然五百年以后谁还记得谁是吧。 一、多通道ADC和DMA的配置问题: 刚开始不知道怎么去配置,到处找资料发现很多不是很适用。很盲目的找了很久的资料,后来发现官方的固件库里面有很详细的资料。稍微改了一下官方的demo一下就编译成功了。这个例子的启示是:别忙着去网上找现成的例子,启示固件库里面的例程很给力了。 程序需求是开通三个ADC通道分别采集3V 的基准电压、控制反馈温度和环境温度。 因为用示波器测试时发现TED控制PWM的开关的高频噪声耦合到控制地中来了,所以会有一些高频尖刺。我的解决办法是每组数据通过DMA采集100个点,除去最大的10个数和最小的10数然后
[单片机]
STM32 ADCDMA多通道处理
#define ADC1_DR_Address ((uint32_t)0x4001244C)//ADC1 DR寄存器基地址 DMA_InitTypeDef DMA_InitStructure; //DMA ADC_InitTypeDef ADC_InitStructure; //ADC #define ADC_CH 2 //通道数 #define ADC_num 10 //采集点数 vu16 After_filter ; //用来存放求平均值之后的结果 vu16 ADCConvertedValue ;//AD数据缓存 /*****************************************************
[单片机]
STM32CubeMX 多通道 ADC DMA 配置 测试小程序
要点: 1、STM32F103C8T6单片机 2、ADC+DMA 多通道 重点是ADC+DMA配置,ADC+DMA配置如下 其他配置略略略略。 然后各位自行直看.ioc文件,生成代码后在while之前加入启动ADC DMA代码: HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 100); 如下图
[单片机]
STM32CubeMX <font color='red'>多通道</font> <font color='red'>ADC</font> <font color='red'>DMA</font> 配置 测试小程序
STM32CubeMX-多通道ADC-DMA-circular 传输
一,CubeMX生成工程 1,配置ADC引脚 2,时钟配置 3,ADC配置 4,打开 中断 5, DMA 配置 (这里选择 halfword 应该也可以,程序里面对应存储adc数据的变量也为halfword u16即可) 6,中断配置 红色标注为注意点,不清楚原理,ADC中断和DMZ的关系有待探明。 7,生成代码二,添加代码 数字标注处为添加部分 /** ****************************************************************************** * File Name : main.c * Date
[单片机]
STM32CubeMX-<font color='red'>多通道</font><font color='red'>ADC</font>-<font color='red'>DMA</font>-circular 传输
STM32F103和STM32F401的ADC多通道采集DMA输出
使用STM32F103和STM32F401CCU6对双轴摇杆(两个电压通道)进行ADC采样并通过DMA读取数值 STM32 ADC(模数转换)工作模式 单次转换模式 In Single Conversion mode, the ADC does one conversion. This mode is started either by setting the ADON bit in the ADC_CR2 register (for a regular channel only) or by an external trigger (for a regular or injected channel), while the
[单片机]
STM32F的利用HAL库ADC转换DMA方式多通道采样调试总结
1,规则模式下,用户内存缓冲区的数据宽度需要和DMA设置的数据宽度一致,如下: typedef struct rt_device_hwadc { struct rt_device parent; const struct rt_hwadc_ops *ops; uint8_t flag_adc_convert_complete; __IO uint16_t adc_converted_value ; }rt_device_hwadc_t; hdma_adcx.Instance = ADC_DMAx_CHANNELn; hdma_adcx.Init.Direction = DMA_PERIPH_TO_MEMORY; h
[单片机]
STM32单片机的ADC多通道采样
一 单通道采样 参考资料: 《STM32库开发实战指南》 原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图 这里使用的是3362电位器(10K),即用STM32来测量PB0和GND两端的电压,这样的电路设计比较简单也容易理解,但是存在一定的弊端,下面给出《STM32库开发实战指南》上面配套的硬件电路图 如果设计电路图的话,可以参考这种思路。 我的收获 1 引脚初始化的时候需要注意 每一个ADC通道都对应一个GPIO引脚,看图中的ADC123_IN10,表示这个引脚(PC0)可以配置为ADC1的通道10,或者是ADC2的通道10,或者是ADC3的通道10,这个地方非常重要,涉及到后面ADC初
[单片机]
<font color='red'>STM32</font>单片机的<font color='red'>ADC</font><font color='red'>多通道</font>采样
STM32 ADC多通道 关键代码
做了个上位机 #========================================================== define ADC1_DR_Address ((u32)0x4001244C) vu16 AD_Value ; ============================================================== 关键代码 void ADC1_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Indepe
[单片机]
<font color='red'>STM32</font> <font color='red'>ADC</font><font color='red'>多通道</font> 关键代码
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved