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
1楼-- · 2019-08-23 13:02
 精彩回答 2  元偷偷看……
charlefu
2楼-- · 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得到的数据
charlefu
3楼-- · 2019-08-23 21:30
本帖最后由 坏坏62 于 2017-3-24 15:45 编辑
charlefu 发表于 2017-3-24 15:26
看上去是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);
}
这是初始化函数
坏坏62
4楼-- · 2019-08-24 02:21
charlefu 发表于 2017-3-24 15:26
看上去是DMA使用有错误。

但是使用有错误的话  ADC中的数据应该传不过来才对啊 那数组当中存放的值为0才对的吧 可是现在是数据不正确 我这点不太明白  能否给我解释一下啊
坏坏62
5楼-- · 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;

就两个通道
坏坏62
6楼-- · 2019-08-24 10:44
 精彩回答 2  元偷偷看……

一周热门 更多>