1、ADC采集两路模拟电压,通过DMA传送,但是当DMA_InitStructure.DMA_BufferSize=2*TIMES中的TIMES大于19后得到的数值就不准确了。请高手帮忙分析。
2、程序代码:
#include "dma.h"
#include "adc.h"
#include "delay.h"
#define TIMES 30
u16 PA_DATE[TIMES][2]={0};
u16 PA_DATE_AVE[2]={0};
u16 PA_DATE_AVE1[2]={0};
float PA_DATE_AVE_VOL1[2]={0};
void Dma_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
/*******************使能DMA1时钟*******************/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA1_Channel1);//复位DMA1通道1
DMA_InitStructure.DMA_BufferSize=2*TIMES; //缓存数据个数
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //以外设为数据源
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; //不使用内存到内存
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)PA_DATE; //内存中存储DMA传过来的数据基地址
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; //内存数据为半字(ADC精度为12)
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //内存地址要增加
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //DMA模式为循环模式
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR; //数据源地址,ADC数据寄存器地址
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //外设数据宽度
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设地址不增加
DMA_InitStructure.DMA_Priority=DMA_Priority_High; //DMA优先级高
DMA_Init(DMA1_Channel1,&DMA_InitStructure); //初始化DMA1通道1
DMA_Cmd(DMA1_Channel1,ENABLE); //使能DMA1通道1
}
void Average(void)
{
u8 i,j;
for(i=0;i<2;i++)
{
for(j=0;j<TIMES;j++)
PA_DATE_AVE[i]+=PA_DATE[j][i];
PA_DATE_AVE[i]/=TIMES;
PA_DATE_AVE1[i]=PA_DATE_AVE[i];
PA_DATE_AVE[i]=0;
}
for(i=0;i<2;i++)
PA_DATE_AVE_VOL1[i]=PA_DATE_AVE1[i]*3.28/4096;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>