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

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

1万+

被折叠的 条评论
为什么被折叠?



