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
1楼-- · 2019-08-22 18:26
论坛搜索,参考下别人代码
正点原子
2楼-- · 2019-08-22 21:58
 精彩回答 2  元偷偷看……
南有乔木
3楼-- · 2019-08-23 03:45
charlefu 发表于 2017-3-23 11:31
悬空的引脚是会收到旁边脚的干扰的。

干扰很大啊,好像没什么好办法去除
charlefu
4楼-- · 2019-08-23 06:48
charlefu 发表于 2017-3-22 15:06
你理解错了,多通道DMA的数据是按 通道1 通道2 通道3 通道1 通道2 通道3 通道1 通道2 通道3这样的方式排列 ...

我有个疑问 为什么接收ADC数据的数组要定义为2维数组啊。直接定义为u16 的一维数组可以吗
南有乔木
5楼-- · 2019-08-23 08:51
charlefu 发表于 2017-3-22 15:06
你理解错了,多通道DMA的数据是按 通道1 通道2 通道3 通道1 通道2 通道3 通道1 通道2 通道3这样的方式排列 ...

我还有各疑问 就是我用ADC1检测两路电压,用DMA的方式传输到一个数组当中,感觉测试出来的结果很不准。 不知道这是为啥 大兄弟能给我解释解释一下嘛
坏坏62
6楼-- · 2019-08-23 09:21
charlefu 发表于 2017-3-24 11:35
ADC不准还是不稳?这是两个概念。你的情况需要描述具体点。

即不稳也不准 ,同样的电压 我用万用表测出来的话就2.几V 但是用ADC1测试出来的数据居然有10几V  而且还不稳 我用串口把数据打印出来 低的有0.几V

一周热门 更多>