一个通道采样10次,采集到数据是 FFF FFF B56 FFF FFF B53 FFF FFF B4D FFF
求帮忙看看代码
[mw_shl_code=c,true]u16 AD_Vaule[3][10]; //DMA½ÓÊÕ»º´æ 3¸öÊýÖµ
#define ADC_DR_Address 0x4001244C //ADC1 ÄÚ´æ»ùµØÖ·
#define DMA1_MEM_LEN sizeof(AD_Vaule) // »º´æÆ÷µÄ´óС
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //DMA¹ÒÔÚAHB×ÜÏßÏÂ
DMA_DeInit(DMA1_Channel1);//½«DMA1 ͨµÀ1µÄÖµÉèÖÃΪȱʡֵ
//ÐèÒªµÈ´ýDMA1ʱÖÓÎȶ¨
__nop();
__nop();
DMA_InitStructure.DMA_BufferSize=30; //DMA»º´æÆ÷´óС
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //ÍâÉè×÷Ϊ»ùµØÖ·
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr= (u32)AD_Vaule; //ÄÚ´æ»ùµØÖ·
DMA_InitStructure.DMA_MemoryDataSize= DMA_MemoryDataSize_HalfWord; // °ë×Ö 16λ
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //ÄÚ´æµØÖ·ÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //Ñ­»·Ä£Ê½
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)(&ADC1->DR); //ÍâÉè»ùµØÖ·
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord ; //°ë×Ö16λ
DMA_InitStructure.DMA_PeripheralInc= DMA_PeripheralInc_Disable ; //ÍâÉèµØÖ· ·ÇÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_Priority= DMA_Priority_High; //ÖеÈÓÅÏȼ¶Ä£Ê½
DMA_Init(DMA1_Channel1,&DMA_InitStructure); //DMAͨµÀ
DMA_Cmd(DMA1_Channel1,ENABLE); //¿ªÆôDMA1ͨµÀ
}[/mw_shl_code]
[mw_shl_code=c,true]void ADC_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//³õʼ»¯GPIOA¡¢ADC1ʱÖÓ
//ÉèÖÃ
![](data/attach/1908/0yfj82wu4pgdthz7g0gin56m2j73urs6.jpg)
A1ΪģÄâÊäÈë
// RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //ÅäÖÃ
![](data/attach/1908/n37t7grfzbsftdye5uymjk69iu31bsnx.jpg)
A0 PA1 PA2 PA3Ä£Äâ
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//ÅäÖÃADC1
//ÉèÖÃADC·ÖƵʱÖÓ£¬ADCʱÖÓ²»Äܳ¬¹ý14MHz
ADC_DeInit(ADC1);
//ÅäÖÃADC1²ÎÊý
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //ADCÁ¬Ðøģʽ¿ª
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //12λÊý¾ÝÓÒ¶ÔÆë
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //Íⲿ¿ªÆô¹Ø ÓÉÈí¼þ¿ªÆô
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //ADC¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
ADC_InitStructure.ADC_NbrOfChannel=3; //¿ªÆôͨµÀÊýΪ1
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //ɨÃèģʽ¹Ø
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5); //ÅäÖùæÔò×éͨµÀ£¬ÉèÖÃͨµÀµÄ˳Ðò£¬²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1,ENABLE);
ADC_DMACmd(ADC1,ENABLE); //ʹÄÜADC1--DMAÇëÇó
//¿ªÆôADCУ׼£¬±ØÐ뿪!
ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼
while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø
ADC_StartCalibration(ADC1); //¿ªÆôADУ׼
while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ׼½áÊø
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //Èí¼þת»»
}[/mw_shl_code][mw_shl_code=c,true] while(1)
{
u8 t,i;
for(t=0;t<3;t++)
{
AD_Vaule_Average[t]=0;
for(i=0;i<10;i++) //Çó¸öͨµÀ10´ÎµÄƽ¾ùÖµ
{
AD_Vaule_Average[t]+=AD_Vaule[t]
;
}
AD_Vaule_Average[t]/=10;
}
for(t=0;t<3;t++) //ÒÀ´ÎÏÔʾ
{
// printf("ͨµÀ%dµÄ²ÉÑùÖµ£º%d
",t+1,AD_Vaule_Average[t]);
adc[t]= AD_Vaule_Average[t];
temp[t]=(float)adc[t]*(3.3/4096); //µÃµ½ÊµÊýÀàÐͲÉÑùÖµ
adc2[t] =temp[t]; //µÃµ½ÕûÊý²¿·Ö
LCD_ShowxNum(130,80+t*20,adc2[t],1,RED,0);
temp[t]-=adc2[t]; //СÊý²¿·Ö
temp[t]*=1000;
LCD_ShowxNum(149,80+t*20,temp[t],3,RED,0);
}
printf("
");
delay_ms(200);[/mw_shl_code]
3.299V 3.299V 3.299V 3.299V 1.741V 2.049V 2.025V
2.019V 2.024V 2.071V 2.062V 2.071V 2.054V
2.012V 2.032V 2.139V 2.086V 2.089V 2.074V
2.078V 2.062V 2.065V 2.058V 2.097V 2.133V
2.085V 2.086V 2.075V 2.134V 2.065V 2.061V
2.104V 2.109V 2.059V 2.089V 2.075V 这组数据是没有使用ADC_DMA测试的道德数据 这组数据比较准确 上面哪一组很大的数据就是使用DMA得到的数据
void My_DMA1_Init(u8 channel,DMA_Channel_TypeDef*dmach,u32 cpar,u32 cmar,u16 lens) //@channel 1-7 表示初始化DMA的那个通道
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_MAX_LENS=lens;
switch(channel)
{
case 1:
{
DMA_DeInit(dmach); //复位DMA
DMA_InitStructure.DMA_BufferSize=DMA_MAX_LENS;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr=cmar;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
printf(" DMA1CH1初始化函数执行完毕");
// DMA_Cmd(DMA1_Channel1,ENABLE);
break;
}
case 2:
{
break;
}
case 4:
{
DMA_DeInit(dmach); //复位DMA
DMA_InitStructure.DMA_BufferSize=DMA_MAX_LENS;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr=cmar;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_Init(DMA1_Channel4,&DMA_InitStructure);
printf(" DMA1CH4初始化函数执行完毕");
break;
}
default:
break;
}
}
void My_DMA1_Enable(DMA_Channel_TypeDef*dmach) //这个函数的主要功能就是打开DMA的使能位
{
// printf(" 程序进入DMA使能函数 ");
DMA_Cmd(dmach,DISABLE);
DMA_SetCurrDataCounter(dmach,DMA_MAX_LENS);
DMA_Cmd(dmach,ENABLE);
delay_ms(10);
}
这是初始化函数
但是使用有错误的话 ADC中的数据应该传不过来才对啊 那数组当中存放的值为0才对的吧 可是现在是数据不正确 我这点不太明白 能否给我解释一下啊
void My_ADC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE); //使能时钟 毋容置疑的第一步
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //初始化GPIOA的工作模式 配置为模拟输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //配置ADC的时钟
ADC_DeInit(ADC1); //ADC复位
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //开启连续模式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel=2; //顺序进行转换的通道数目
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //开始扫描模式
ADC_Init(ADC1,&ADC_InitStructure); //ADC初始化
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_6,2,ADC_SampleTime_239Cycles5); //
ADC_Cmd(ADC1,ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)); //ADC的自动校准
printf(" ADC初始化完成 ");
delay_ms(5);
}
u16 My_Get_ADC_VAL(u16 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); //这句话的意思是设置采样时间和采样间隔
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
delay_ms(2);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))
{
}
return ADC_GetConversionValue(ADC1);
}
u16 My_Get_ADC_AVERAGEVAL(u16 ch,u8 times)
{
u8 count;
u16 ADCVAL=0;
for(count=0;count<times;count++)
{
ADCVAL+=My_Get_ADC_VAL(ch);
delay_ms(5);
}
ADCVAL=ADCVAL/10;
就两个通道
一周热门 更多>