当前位置:首页 > 单片机 > 单片机
[导读]本文使用ADC转换电位器输出的电压值,并用DMA模式传输转换的结果,每8次采样转换取平均值,做一个简单的数字滤波。ADC的详细配置与使用见之前的日记STM32中ADC的使用,只是最后增加一步配置DMA:DMA for ADC channel

本文使用ADC转换电位器输出的电压值,并用DMA模式传输转换的结果,每8次采样转换取平均值,做一个简单的数字滤波。

ADC的详细配置与使用

见之前的日记STM32中ADC的使用,只是最后增加一步配置DMA:

DMA for ADC channels features configuration
? To enable the DMA mode for ADC channels group, use the ADC_DMACmd()function.
? To configure the DMA transfer request, use ADC_DMAConfig() function.

DMA的配置

(摘自STM32F3官方用户手册UM1581User manual)
1. Enable The DMA controller clock using
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE) function for DMA1 orusing RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE) function forDMA2.
2. Enable and configure the peripheral to be connected to the DMA channel (except forinternal SRAM / FLASH memories: no initialization is necessary).
3. For a given Channel, program the Source and Destination addresses, the transferDirection, the Buffer Size, the Peripheral and Memory Incrementation mode and Data
Size, the Circular or Normal mode, the channel transfer Priority and the Memory-to-Memory transfer mode (if needed) using the DMA_Init() function.
4. Enable the NVIC and the corresponding interrupt(s) using the function
DMA_ITConfig() if you need to use DMA interrupts.
5. Enable the DMA channel using the DMA_Cmd() function.
6. Activate the needed channel Request using PPP_DMACmd() function for any PPPperipheral except internal SRAM and FLASH (ie. SPI, USART ...) The functionallowing this operation is provided in each PPP peripheral driver (ie. SPI_DMACmd forSPI peripheral).
7. Optionally, you can configure the number of data to be transferred when the channel
is disabled (ie. after each Transfer Complete event or when a Transfer Error occurs)using the function DMA_SetCurrDataCounter(). And you can get the number ofremaining data to be transferred using the function DMA_GetCurrDataCounter() at runtime (when the DMA channel is enabled and running).
8. To control DMA events you can use one of the following two methods:
a. Check on DMA channel flags using the function DMA_GetFlagStatus().
b. Use DMA interrupts through the function DMA_ITConfig() at initialization phaseand DMA_GetITStatus() function into interrupt routines in communication phase.After checking on a flag you should clear it using DMA_ClearFlag() function. Andafter checking on an interrupt event you should clear it usingDMA_ClearITPendingBit()function.

重要代码:


#include"ADC_DMA.h"

#defineDATANUM8

uint8_tFLAG=0;//转换次数标志位

uint16_tCONV_RESULTS[DATANUM];

voidADC_Config(void)

{

ADC_InitTypeDefADC_InitStructure;

ADC_CommonInitTypeDefADC_CommonInitStructure;

RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12,ENABLE);

//GPIO_Config();//实现采样输入引脚的配置,配置为模拟输入模式

//......其他

ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_2;

ADC_CommonInitStructure.ADC_DMAMode=ADC_DMAMode_Circular;

//.......其他

ADC_CommonInit(USING_ADC,&ADC_CommonInitStructure);

//ADCInit,ADC_Init(USING_ADC,&ADC_InitStructure);

ADC_ITConfig(USING_ADC,ADC_IT_EOC,ENABLE);//开中断

ADC_DMAConfig(USING_ADC,ADC_DMAMode_Circular);//配置ADC_DMA,非常重要

ADC_DMACmd(USING_ADC,ENABLE);//打开ADC_DMA

DMA_Config();

ADC_Cmd(USING_ADC,ENABLE);

while(!ADC_GetFlagStatus(USING_ADC,ADC_FLAG_RDY));

ADC_StartConversion(USING_ADC);

}

voidGPIO_Config(void)

{

//.......

//......

}

voidDMA_Config(void)

{

DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr=ADC_DATA_ADDR;//ADC数据寄存器DR的地址

DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&CONV_RESULTS;//存放转换结果的地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;

DMA_InitStructure.DMA_BufferSize=DATANUM;

//.....

DMA_Init(DMA1_Channel1,&DMA_InitStructure);

DMA_Cmd(DMA1_Channel1,ENABLE);

}

voidADC1_2_IRQHandler(void)

{

FLAG++;//在主函数中检查FLAG并惊醒处理

//计算转换数据的个数

if(FLAG>DATANUM-1)

{

FLAG=0;

}

ADC_ClearITPendingBit(USING_ADC,ADC_IT_EOC);

}

//获取转换结果的平均值,做滤波处理

uint16_tGetAverage(void)

{

u8i=0;

u16average=0;

u32sum=0,voltage=0;

for(i=0;i

{

sum+=CONV_RESULTS[i];

}

average=sum/DATANUM;

voltage=average*3300/0xFFF;

returnvoltage;

}

//配置中断

voidNVIC_Config(void)

{

NVIC_InitTypeDefNVIC_InitStruct;

NVIC_InitStruct.NVIC_IRQChannel=ADC1_IRQn;

//........

NVIC_Init(&NVIC_InitStruct);

}


源码下载:

http://download.csdn.net/detail/wind4study/8674381


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

系统设计师通常侧重于为应用选择最合适的数据转换器,在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而,如果不慎重考虑时钟发生器、相位噪声和抖动性能,数据转换器、动态范围和线性度性能可能受到严重的影响。

关键字: 时钟发生器 adc

专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起开始备货TI TLV915x运算放大器和ADS7128 12位模数转换器 (ADC)。

关键字: 贸泽 adc 模数转换器

自然界产生的信号,都是模拟信号,比如我们说话的声音,看到的景色,感受到的温度、湿度、压力、流速、光、电、风及个人的呼吸、血压、体温、心跳、体重、血糖,体脂等等。这些模拟信号都得最终放在电脑,手机等数字领域进行处理,存储或...

关键字: adc 模拟信号

为增进大家对ADC的认识和了解,本文将基于两方面对ADC予以介绍:1.什么是并行ADC,并行ADC的基本原理是什么?2.流水线ADC与其它ADC有何区别。

关键字: adc 指数 流水线adc

ADC是电子电路中常用器件,大家对于ADC也较为熟悉。为增进大家对ADC的了解,本文将对高速ADC以及流水线ADC结构予以介绍。

关键字: adc 指数 流水线adc

ADC也即数模转换器,在现实中,ADC具备重要作用。对于ADC,电子相关专业的朋友想必相当熟悉。为增进大家对ADC的认识,本文将对管道ADC以及其原理予以介绍。

关键字: adc 指数 管道adc

设计人员有各种模数转换器(ADC)可以选择,数字数据输出类型是选择过程中需要考虑的一项重要参数。

关键字: 高速转换器 数字数据 adc

ADC包括三个基本功能:抽样、量化和编码。如何实现这三个功能,就决定了ADC的形式和性能。

关键字: 模数转换 adc

自然界产生的信号,都是模拟信号,比如我们说话的声音,看到的景色,感受到的温度、湿度、压力、流速、光、电、风及个人的呼吸、血压、体温、心跳、体重、血糖,体脂等。这些模拟信号都得最终放在电脑,手机等数字领域进行处理,存储或者...

关键字: adc 电源设计

在设计ADC电路时,一个常见的问题是“如何在过压条件下保护ADC输入”。那么,在过压情形中,可能出现哪些问题?发生的频率又是怎样的?有木有潜在的补救措施?

关键字: adc 电源设计
关闭
关闭