STM32通过DMA采集多通道AD

发布者:心若澄明最新更新时间:2020-10-09 来源: eefocus关键字:STM32  DMA采集  多通道AD 手机看文章 扫描二维码
随时随地手机看文章

环境:


主机:XP


开发环境:MDK4.23


MCU:STM32F103CBT6


说明:


通过脚PA1,PA2采集AD。每路AD采集10次。


参考链接:http://hi.baidu.com/kangxuebin/item/f4f4370f9d7f3c123a53ee30


源代码:


#include "ad_driver.h"

 

//全局变量

//AD采样存放空间

__IO uint16_t ADCConvertedValue[20];

 

//函数

//初始化AD

void init_ad(void)

{

ADC_InitTypeDef ADC_InitStructure;

DMA_InitTypeDef DMA_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

 

//---------------------充电AD初始化--------------------

//启动DMA时钟

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 

//启动ADC1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

 

//采样脚设置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

//DMA1通道1配置

DMA_DeInit(DMA1_Channel1);

//外设地址

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;

//内存地址

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;

//dma传输方向单向

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

//设置DMA在传输时缓冲区的长度

DMA_InitStructure.DMA_BufferSize = 20;

//设置DMA的外设递增模式,一个外设

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

//设置DMA的内存递增模式

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

//外设数据字长

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

//内存数据字长

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

//设置DMA的传输模式:连续不断的循环模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

//设置DMA的优先级别

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

//设置DMA的2个memory中的变量互相访问

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel1, &DMA_InitStructure);

//使能通道1

DMA_Cmd(DMA1_Channel1, ENABLE);

 

//ADC1配置

//独立工作模式

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 = 2;

ADC_Init(ADC1, &ADC_InitStructure);

//规则模式通道配置

ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);

//使能ADC1的DMA

ADC_DMACmd(ADC1, ENABLE);

//使能ADC1

ADC_Cmd(ADC1, ENABLE);

//使能ADC1复位校准寄存器  

ADC_ResetCalibration(ADC1);

//检查校准寄存器是否复位完毕

while(ADC_GetResetCalibrationStatus(ADC1));

//开始校准

ADC_StartCalibration(ADC1);

//检测是否校准完毕

while(ADC_GetCalibrationStatus(ADC1));

 

//开启ADC1的软件转换

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

 

//获得充电电压

float voltage_charge(void)

{

  uint8_t i = 0;

uint16_t sum = 0;

float v = 0;

 

//取得10次充电电压平均值

for (i = 0;i < 10;i++)

{

sum += ADCConvertedValue[i * 2]; 

}

sum /= 10;

//变换成电压值

v = 0.002991 * sum;

 

return v;

}

 

//获得放电电压

float voltage_discharge(void)

{

  uint8_t i = 0;

uint16_t sum = 0;

float v = 0;

 

//取得10次充电电压平均值

for (i = 0;i < 10;i++)

{

sum += ADCConvertedValue[i * 2 + 1]; 

}

sum /= 10;

//变换成电压值

v = 0.002991 * sum;

 

return v;

}

关键字:STM32  DMA采集  多通道AD 引用地址:STM32通过DMA采集多通道AD

上一篇:STM32的串口采用DMA方式发送数据测试
下一篇:STM32外部中断测试

推荐阅读最新更新时间:2024-10-28 10:28

stm32:中断配置的步骤
使用外部中断的一般步骤 1、初始化I/O 口, 2、开启AFIO时钟 3、建立I/O口与中断线的映射关系,使用库函数 void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource), 参数GPIO_PortSource表示I/O口,取值:GPIO_PortSourceGPIOx (A..G).。 参数GPIO_PinSource表示中断线,取值:GPIO_PinSourcex(0..15).。 4、初始化中断线,即配置结构EXTI_InitStructure,其成员 EXTI_Line:中断线,取值EXTI_Line0x(0~15)
[单片机]
基于DAS AD7606的可扩展多通道同步采样数据采集系统(DAS)的布局
  在电力线路测量和保护系统中,需要对多相输配电网络的大量电流和电压通道进行同步采样。这些应用中,通道数量从6个到64个以上不等。AD76068通道数据采集系统(DAS)集成16位双极性同步采样SAR ADC和片内过压保护功能,可大大简化信号调理电路,并减少器件数量、电路板面积和测量保护板的成本。高集成度使得每个AD7606只需9个低值陶瓷去耦电容就能工作。   在测量和保护系统中,为了保持多相电力线网络的电流和电压通道之间的相位信息,必须具备同步采样能力。AD7606具有宽动态范围,是捕获欠压/欠流和过压/过流状况的理想器件。输入电压范围可以通过引脚编程设置为±5 V或±10 V。   此电路笔记详细介绍针对采用多个AD76
[嵌入式]
基于DAS <font color='red'>AD</font>7606的可扩展<font color='red'>多通道</font>同步采样数据<font color='red'>采集</font>系统(DAS)的布局
STM32建c++与c混合工程遇到的问题及解决
1. 以前的库函数怎么使用? 在函数声明前加上 extern C 就可以了,因为C++支持函数重载之类的东东,所以生成的目标代码的名字和C会有些不同,用extern C 强制成C语言的名字规则。现在新版本的库好像已经加上了,这里顺便问一下,新版本的库在官网的哪里下载?我不要一点就直接弹出下载的链接 新版的库的头文件前面是 #ifdef __cplusplus extern C { #endif 后面 #ifdef __cplusplus } #endif 2. 中断函数进不去呀? 中断函数定义前也要加上 extern C 3. 对库里面定义的结构体有警告: warning: #368-D: class unnamed def
[单片机]
STM32读写内部Flash
工作中使用STM32F407ZGT6这块芯片开发项目,内部Flash有1M之多,出于数据存储需要,而外部没有拓展EEPROM,就想着将数据存入Flash中。因此研究了一下STM32F4读写内部Flash的一些操作。 以下是关于Flash介绍,部分来自互联网: 【STM32F4 内部Flash的一些信息】 STM32F407ZGTx的内部Flash的地址是:0x08000000,大小是0x00100000。 写Flash的时候,如果发现写入地址的Flash没有被擦出,数据将不会写入。Flash的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。
[单片机]
<font color='red'>STM32</font>读写内部Flash
STM32中的一些小坑-ADC通道设置-写FLASH
最近做项目用到STM32F051的片子,遇到了两个小坑。 我的一个项目,需要ADC采集。两路ADC输入通道。PA0-ADCIn0; PA1-ADCIn1. 一开始想使用最简单的方式,单次转换。第一次采In0, 第2次采集In1. STM32F0 的ADC库里面提供了ADC转换的函数:如下: ADC_StartOfConversion(ADC1); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); AdcProValRig =ADC_GetConversionValue(ADC1); ADC_StopOfConversion(ADC1);
[单片机]
STM32的GPIO—快速IO的使用与讲解
STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'。 GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置'1'则端口x的对应位被清'0';寄存器中的位置'0',则对它对应的位不起作用。 GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置'1'则它对应的端口位被置'1';寄存器中的位置'0',则对它对应的端口不起作用。 简单地说
[单片机]
STM32 外部中断/事件控制器EXTI
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都有一个边缘检测器,可以实现对输入信号的上升沿或下降沿检测。EXTI可以实现对每个中断/事件线进行单独的配置,可以单独配置为中断或者事件,以及触发事件的属性。 如下图所示,为EXTI的功能框图。EXTI有两个功能,一个是产生中断,一个是产生事件,下面我们将对这两个功能进行讲解。 1.中断产生 如上图所示,红色虚线指示的是一个产生中断的线路,最终流入到NVIC中断控制器内。 编号1是输入线,可以指定到任意的GPIO,也可以是一些外设事件,输入线一般是存在电平变化的信号
[单片机]
<font color='red'>STM32</font> 外部中断/事件控制器EXTI
基于STM32设计的智能灌溉控制系统
一、项目介绍 随着现代农业的发展,人们对于水资源的合理利用越来越重视。而传统的灌溉方式往往存在着浪费水资源、劳动力投入大、效率低等问题。因此,设计一款智能灌溉控制系统,可以实现对灌溉水量的精准控制,增加水资源利用率,提高农业生产效率,具有广泛的应用前景。 当前文章介绍一款高性能的智能灌溉控制系统的开发过程,可自动采集电压、电流、累计用水量,并根据用户需要实现自动灌溉、定时灌溉、周期灌溉和手动灌溉等多种模式,同时具备中控室控制、手机短信、现场遥控及现场手动等多种方式控制功能。该系统可以对现场温湿度限值进行设置和修改,并通过控制器或后台监控系统完成灌溉起始时间、停止时间、喷灌时间等参数设置。系统显示功能包括液晶屏以中文菜单方式显示现场
[单片机]
基于<font color='red'>STM32</font>设计的智能灌溉控制系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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