关闭

STM32通过DMA采集多通道AD

标签: floatcmd工作xpio
19496人阅读 评论(2) 收藏 举报
分类:

STM32通过DMA采集多通道AD


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

 

环境:

主机: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;
}





3
0
查看评论

关于Stm32定时器+ADC+DMA进行AD采样的实现

原文出处:http://m.blog.csdn.net/article/details?id=46993553 注:此STM32单片机为STM32F103系列的 Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时...
  • u011732210
  • u011732210
  • 2016-11-20 10:22
  • 5155

STM32 使用DMA处理ADC 学习笔记!!

ADC: 1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以可以进行同步采样。 2ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,要在RCC_CFGR配置,再ADC自己的寄存器中在没有时钟分频的配置位。 3.ADC转换时间:  STM...
  • wangsenmm
  • wangsenmm
  • 2013-08-20 22:06
  • 11947

stm32 内部AD和DMA使用

stm32内部ADC1,3和DMA1,2的使用
  • badagougou
  • badagougou
  • 2016-09-01 12:50
  • 212

STM32 ADC结合DMA数据采样与软件滤波处理

本文原创于观海听涛,原作者版权所有,转载请注明出处。 作为一个偏向工控的芯片,ADC采样是一个十分重要的外设。STM32集成三个12位精度18通道的内部ADC,最高速度1微秒,结合DMA可以解放CPU进行更好的处理。 ADC接口上的其它逻辑功能包括: ●同步的采样和保持 ●交叉的采样和保持 ...
  • i792439187
  • i792439187
  • 2013-04-19 17:44
  • 15273

STM32学习笔记之ADC--DMA方式

程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据:STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC转换值,调高了读取速度。串口部分用是上一篇串口调试笔记里的代码。/***********************...
  • zyboy2000
  • zyboy2000
  • 2009-08-24 21:38
  • 26298

STM32的AD用DMA方式时的请注意初始化顺序(转)

今天无意之间看到了这篇帖子,是斑竹好久前发的~~~ 我突然意识到我的数据好像一直没有错位,看到这个我又试验了一下,发现把DMA_Cmd(DMA1_Channel1, ENABLE);放置到哪儿都是一样的啊~~~ 这个是原帖部分: STM32的AD用DMA方式时的请注意初始化顺序 珍情岁月(8...
  • wjs1033
  • wjs1033
  • 2016-06-25 15:13
  • 842

stm32 多通道AD和单通道AD的差别

今天萧条了一下 stm32的AD 感觉用起来还是比较顺手的~下面我就总结一下 多通道AD和单通道的一些差别 (1)首先 我们要改的就是vu16 ADC1ConvertedValue[2]; 这个volidate 变量 要设置成数组 因为你要通过AD读取多个值 。 (2)然后是DMA的配置 既然...
  • rangefor
  • rangefor
  • 2012-10-02 17:45
  • 7127

STM32通过DMA方式采集多路AD

一个项目需求:使用STM32采集多路AD信号。 一般采集多路信号需要使用DMA方式,步骤如下: 1.使能相应ADC通道,这里使用ADC1的4个通道,分别是ADC123_IN0 ~ ADC123_IN3, 注:ADC123_IN0 表示ADC1, 2, 3 都可以使用该通道。 2.配置ADC,...
  • c12345423
  • c12345423
  • 2016-10-25 10:46
  • 1927

STM32f103的数电采集电路的ADC多通道采集程序

STM32拥有1~3个ADC(STM32F101/102 系列只有1个ADC),这些ADC可以独立使用,也可以使用双重模式(提高采样率)。STM32 的ADC是12位逐次逼近型的模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的 A/D ...
  • DevinTT
  • DevinTT
  • 2015-07-22 09:16
  • 11334

stm32的多通道ADC和DMA的设置问题

最近在倒腾LD驱动的时候遇到不少问题,下面就一一的记录一下啦,不然五百年以后谁还记得谁是吧。 一、多通道ADC和DMA的配置问题:         刚开始不知道怎么去配置,到处找资料发现很多不是很适用。很盲目的找了很久的资料,后来发现官方的固件库里面有很详...
  • znmdwahaha
  • znmdwahaha
  • 2014-03-13 22:07
  • 3852
    个人资料
    • 访问:1354239次
    • 积分:14846
    • 等级:
    • 排名:第944名
    • 原创:182篇
    • 转载:19篇
    • 译文:0篇
    • 评论:597条
    博客专栏
    文章分类
    最新评论
    友情链接