fanhoufa 发表于 2014-10-23 16:31:41

STM32F051 ADC1采样时间和采样值稳定性设计

本帖最后由 fanhoufa 于 2014-10-23 16:37 编辑

STM32F0 如果用ADC1做AD采样8路模拟值 ,跟据资料如果设定12B的精度,时间最快是2US,如果用连续模式采样8路.16US,这样的采样值稳定吗? /* ADC1 registers reset ----------------------------------------------------*/
ADC_DeInit(ADC1);
/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADRDY falg */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
{
}

   /* ADC1 configuration ------------------------------------------------------*/
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// ½ûÓÃÁ¬ÐøÄ£Ê½
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left; // Êý¾Ý×ó¶ÔÆë
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO; // T1 ´¥·¨×ª»»
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//
          ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; // 12λ¾«¶È

ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;// 옃샬̏ 0-18
ADC_Init(ADC1, &ADC_InitStructure);
ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_2| ADC_Channel_3
                        | ADC_Channel_4 | ADC_Channel_5 | ADC_Channel_6| ADC_Channel_7| ADC_Channel_8,
                        ADC_SampleTime_13_5Cycles);   
      
         ADC_GetCalibrationFactor(ADC1);                                 // ʹÄÜǰУ׼
    ADC_Cmd(ADC1, ENABLE);                                          // ʹÄÜADC1
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET);         // µÈ ADC1ʹÄÜÍê³É


ADC_OverrunModeCmd(ADC1,ENABLE); // ʹÄÜÊý¾Ý ģʽ

      ADC_DMACmd(ADC1, ENABLE);                                       // ʹÄÜADC_DMA
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);         // ÅäÖÃDMAģʽΪѭ»·Ä£Ê½
ADC_StartOfConversion(ADC1);                                    // Æô¶¯Ò»´Îת»»

fanhoufa 发表于 2014-10-23 16:32:37


/* ADC1 registers reset ----------------------------------------------------*/
ADC_DeInit(ADC1);
/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADRDY falg */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
{
}

   /* ADC1 configuration ------------------------------------------------------*/
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// ½ûÓÃÁ¬ÐøÄ£Ê½
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left; // Êý¾Ý×ó¶ÔÆë
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO; // T1 ´¥·¨×ª»»
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//
          ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; // 12λ¾«¶È

ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;// 옃샬̏ 0-18
ADC_Init(ADC1, &ADC_InitStructure);
ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_2| ADC_Channel_3
                        | ADC_Channel_4 | ADC_Channel_5 | ADC_Channel_6| ADC_Channel_7| ADC_Channel_8,
                        ADC_SampleTime_13_5Cycles);   
       
           ADC_GetCalibrationFactor(ADC1);                                 // ʹÄÜǰУ׼
    ADC_Cmd(ADC1, ENABLE);                                          // ʹÄÜADC1
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET);         // µÈ ADC1ʹÄÜÍê³É


ADC_OverrunModeCmd(ADC1,ENABLE); // ʹÄÜÊý¾Ý ģʽ

        ADC_DMACmd(ADC1, ENABLE);                                       // ʹÄÜADC_DMA
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);         // ÅäÖÃDMAģʽΪѭ»·Ä£Ê½
ADC_StartOfConversion(ADC1);                                    // Æô¶¯Ò»´Îת»»
               

奔跑小蜗牛 发表于 2014-10-31 09:32:07

stm32内部AD是逐次逼近型的,这种AD特点就是速度快,稳定一般,你单次测量AD值是不稳的,要想稳定就要添加滤波算法。要想提高分辨率,可以以过采样方式牺牲速度换取高分辨率。

 相对于逐次逼近型AD,ΔΣ型AD是转换速度慢,分辨率高,单次采样值比较稳定。
页: [1]
查看完整版本: STM32F051 ADC1采样时间和采样值稳定性设计