stm32F4的ADC+DMA+Timer,实现2MHz连续采样。1LSB分辨率,极低噪声。

本文介绍如何利用STM32F407/405的ADC、DMA和Timer实现固定频率的ADC采样,提高CPU效率,并通过优化电源设计达到1LSB的分辨率。代码示例展示了配置过程。

1. ADC+DMA+Timer的实现原理 

        stm32F407/405的ADC为12位逐次逼近型ADC,有着高达2.4MHz的采样率,分辨率 1LSB。这样参数的ADC放在市面上单卖,也起码是¥10+起步。而 stm32F407/405不仅内置了,还内置了2/3个,会用的话血赚。

        不过平时使用ADC,都是转换,等待结束,转换...。不能按照固定的频率来进行采样,而且在转换过程中,还需要CPU去控制流程,不能处理其他事情,非常的不实用。

        stm32F4的ADC允许将转换后的值,通过DMA进行传输存储,而且可以通过Timer进行触发。这样不仅可以按照固定的频率进行ADC采样,还不占用CPU,可谓一举两得。

        分辨率 1LSB的方法见最后,电源电路设计的原因。稍加注意都是可以达到 1LSB的。不要再喷stm32的ADC不好了!!!

 

2.代码

这个代码在 stm32F407/405上通用,使用的 ADC1,DMA2-Stream0-Channel0,Timer3用来产生2MHz采样触发信号。

adc_dma_timer.c

#include "adc_dma_timer.h"


//ADC的GPIO配置:PB1 - ADC1_IN9 | PB0 - ADC1_IN8
void ADC_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE ); 
	
	//PB0 - ADC1_IN8   
	//PB1 - ADC1_IN9   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init( GPIOB , &GPIO_InitStructure );
}


//TIM3初始化,作为ADC的采样触发源
//Fre:ADC采样频率
void TIM3_Config( u32 Fre )
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	u32 MaxData;
	u16 div=1;	
	while( (SystemCoreClock/2/Fre/div)>65535 )
	{
		div++;
	}
	MaxData =  SystemCoreClock/2/Fre/div - 1;	
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 , ENABLE );			   //开启时钟
	
	//TIM3时间基准配置
	TIM_TimeBaseStructure.TIM_Period = MaxData ;
	TIM_TimeBaseStructure.TIM_Prescaler = div-1;
	TIM_TimeBaseStru
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值