STM32 F1 用ADC1 ,3通道采样,采样的12位数值是FFF

2019-08-22 16:34发布

一个通道采样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ʱÖÓ
                //ÉèÖ&#195A1ΪģÄâÊäÈë
//                RCC_ADCCLKConfig(RCC_PCLK2_Div6);
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;   //ÅäÖ&#195A0 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++)  //&#199;ó&#184;&#246;&#205;¨&#181;&#192;10&#180;&#206;&#181;&#196;&#198;&#189;&#190;ù&#214;&#181;
                                {
                                        AD_Vaule_Average[t]+=AD_Vaule[t];       
                                }
                                AD_Vaule_Average[t]/=10;
                 }                       
                        for(t=0;t<3;t++)  //&#210;&#192;&#180;&#206;&#207;&#212;&#202;&#190;
                        {                               
//                           printf("&#205;¨&#181;&#192;%d&#181;&#196;&#178;&#201;&#209;ù&#214;&#181;&#163;&#186;%d ",t+1,AD_Vaule_Average[t]);
                                 adc[t]= AD_Vaule_Average[t];
         temp[t]=(float)adc[t]*(3.3/4096); //&#181;&#195;&#181;&#189;&#202;&#181;&#202;&#253;&#192;à&#208;&#205;&#178;&#201;&#209;ù&#214;&#181;
                                 adc2[t] =temp[t];               //&#181;&#195;&#181;&#189;&#213;&#251;&#202;&#253;&#178;&#191;·&#214;
                                 LCD_ShowxNum(130,80+t*20,adc2[t],1,RED,0);
                                 temp[t]-=adc2[t];  //&#208;&#161;&#202;&#253;&#178;&#191;·&#214;
         temp[t]*=1000;
         LCD_ShowxNum(149,80+t*20,temp[t],3,RED,0);                                
                        }
                        printf(" ");
                        delay_ms(200);[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
charlefu
2019-08-23 16:29
charlefu 发表于 2017-3-24 11:40
当然可以定义成1维的,定义成2维的话访问某一路的数据就可以直接用数组的第一维进行访问。各人有各人的习 ...

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得到的数据

一周热门 更多>