STM32
直播中

贾桂林

8年用户 1607经验值
私信 关注
[问答]

STM32F303xC系列ADC校准一直不通过的原因?

本来的硬件平台是STM32F303VC,ADC校准能通过。换成STM32F303CC,校准就不行了,程序用的老的固件库。ADC的校准需要什么条件才能成功。初始化代码如下:

        ADC_InitTypeDef        ADC_InitStructure;
  ADC_CommonInitTypeDef  ADC_CommonInitStructure;

  /* Configure the ADC clock */
  RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);
//  RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ADC12,ENABLE);  
  /* Enable ADC1 clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);
  /* ADC GPIO configuration */
  ADC_GPIO_Configuration();

  /* ADC DMA Channel configuration */
  ADC_DMA_Configuration();
        
  ADC_StructInit( ADC_InitStructure);
  /* ADC Calibration procedure */
        ADC_VoltageRegulatorCmd(ADC1, ENABLE);
  ADC_VoltageRegulatorCmd(ADC2, ENABLE);

  ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
  ADC_StartCalibration(ADC1);
  ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single);
  ADC_StartCalibration(ADC2);
        while(ADC_GetCalibrationStatus(ADC1) != RESET )
        {
          calibration_value_1 = ADC_GetCalibrationValue(ADC1);
                debug_log("ADC1 Calibration Value %d",calibration_value_1);
        }
  while(ADC_GetCalibrationStatus(ADC2) != RESET )
        {
                calibration_value_2 = ADC_GetCalibrationValue(ADC2);
                debug_log("ADC2 Calibration Value %d",calibration_value_2);            
        }
//  /* ADC Dual mode configuration */     
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;                                                                    
  ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;                    
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;            
  ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;                  
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = 1;         

  ADC_CommonInit(ADC1,  ADC_CommonInitStructure);

  /* */  
  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;  
  ADC_InitStructure.ADC_NbrOfRegChannel = 16;
  ADC_Init(ADC1,  ADC_InitStructure);
  ADC_Init(ADC2,  ADC_InitStructure);
        
        
   ADC_TempSensorCmd(ADC1,ENABLE);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_61Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 2, ADC_SampleTime_61Cycles5);
         
   ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 3, ADC_SampleTime_61Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 4, ADC_SampleTime_61Cycles5);
         
   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 5, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 5, ADC_SampleTime_61Cycles5);         

   ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 6, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 6, ADC_SampleTime_61Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 7, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 7, ADC_SampleTime_61Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 8, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 8, ADC_SampleTime_61Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 9, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 9, ADC_SampleTime_61Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 10, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 10, ADC_SampleTime_61Cycles5);
         
   ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 11, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 11, ADC_SampleTime_61Cycles5);         


   ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 12, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 12, ADC_SampleTime_61Cycles5);
         
         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 13, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 13, ADC_SampleTime_61Cycles5);
         
         ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 14, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 14, ADC_SampleTime_61Cycles5);
         
         ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 15,ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 15, ADC_SampleTime_61Cycles5);
         
         ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 16, ADC_SampleTime_61Cycles5);
   ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 16, ADC_SampleTime_61Cycles5);

  /* Configures the ADC DMA */
  ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);
  /* Enable the ADC DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 and ADC2 */
  ADC_Cmd(ADC1, ENABLE);
  ADC_Cmd(ADC2, ENABLE);

  /* wait for ADC1 ADRDY */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));

  /* wait for ADC2 ADRDY */
  while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));

  /* Enable the DMA channel */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* Start ADC1 Software Conversion */
  ADC_StartConversion(ADC1);         


回帖(1)

郑成枝

2024-4-11 16:55:43
ADC校准不通过的原因可能有很多,以下是可能的原因和解决方法:

1. 引脚配置错误:确保ADC输入引脚和通道配置正确,并连接到正确的电源和地线。确保GPIO和ADC的引脚和寄存器配置正确。

2. ADC参考电压错误:确保ADC参考电压源配置正确并提供稳定的参考电压。对于内部参考电压源,确保内部参考电压源使能,并且电压值正确。

3. ADC转换时间错误:确保ADC转换时间配置正确。如果转换时间太短,可能会导致校准失败。

4. ADC时钟配置错误:确保ADC时钟源和分频配置正确。检查RCC_ADCCLKConfig函数的参数是否正确。

5. ADC校准模式错误:确保使用了正确的校准模式。在初始化ADC时,通过ADC_InitStructure.ADC_ExternalTrigConvEdge参数配置校准模式。

6. ADC倍增模式错误:确保使用了正确的倍增模式。在初始化ADC时,通过ADC_CommonInitStructure.ADC_Mode参数配置倍增模式。

7. 噪声抑制错误:确保噪声抑制器的配置正确。通过ADC_CommonInitStructure.ADC_Prescaler参数配置噪声抑制器的时钟分频。

8. ADC控制寄存器配置错误:确保ADC控制寄存器的配置正确。检查ADC_InitStructure.ADC_ContinuousConvMode、ADC_InitStructure.ADC_DataAlign和ADC_InitStructure.ADC_Resolution参数的配置。

9. 软件延迟:在ADC校准之前,需要等待一段时间来稳定ADC。确保在调用校准函数之前执行足够的延迟。

10. 调用顺序错误:确保ADC初始化和校准的调用顺序正确。首先初始化ADC,然后校准,最后启动ADC。

除了以上可能的原因,还要确保使用的固件库版本与所使用的硬件兼容。可以尝试更新固件库版本或尝试重新编译和下载固件。

同时,可以在校准失败时检查ADC的状态寄存器,并查看错误位的值,以了解校准失败的具体原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分