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条回答
坏坏62
2019-08-24 06:37
本帖最后由 坏坏62 于 2017-3-24 19:05 编辑
charlefu 发表于 2017-3-24 18:32
你adc的代码呢?是多通道吗?

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;

就两个通道

一周热门 更多>