STM32F103RCT6_ADC_校准与内部温度传感器注意事项

		                            **内部温度传感器**
	错误地认为STM32F429IGT6 的内部温度传感器与STM32F103RCT6的内部温度传感器是一样的了,然而事实上他们差的很远。
	STM32F429IGT6 的内部温度传感器计算公式如下:
				T(℃)={(Vsense - V25)/Avg_Slope}+25
	上式中:
				V25=Vsense 在 25 度时的数值(典型值为:0.76)。
				Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为2.5mV/℃)。
	显然这是正温度系数传感器。
	而STM32F103RCT6的内部温度传感器计算公式如下:
				T(℃)={(V25-Vsense)/Avg_Slope}+25
	上式中:
				V25=Vsense 在 25 度时的数值(典型值为:1.43)。
				Avg_Slope=温度与Vsense曲线的平均斜率(单位:mv/℃或uv/℃)(典型值:4.3mv/℃)。
	显然这是逆温度系数传感器。
                                        **校准**
    STM32中文参考手册_V10:
	ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。建议在上电时执行一次ADC校准。校准阶段结束后,校准码储存在ADC_DR中。
	注意: 1 建议在每次上电后执行一次校准。
				2 启动校准前,ADC必须处于关电状态(ADON=’0’)超过至少两个ADC时钟周期。
	注意的第二条翻译者在翻译时翻译错误或者是ST的参考手册错误
    STM32英文参考手册_V15
	Note:  1 It is recommended to perform a calibration after each power-up. 
			    2 Before starting a calibration, the ADC must have been in power-on state (ADON bit = ‘1’) for at least two ADC clock cycles.
			    2 启动校准前,ADC必须处于上电状态(ADON=’1’)超过至少两个ADC时钟周期。
     但是 HAL库的校准函数 HAL_ADCEx_Calibration_Start(&hadc1)有校准先决条件,而先决条件是在HAL_ADC_Start()之前或HAL_ADC_Stop()之后,看似这与 STM32英文参考手册_V15中关于adc校准的注意实现事项有冲突,其实在HAL库的校准函数HAL_ADCEx_Calibration_Start(&hadc1)里面会开启adc,重置ADC校准寄存器和开始ADC校准。
     
     HAL库中HAL_ADCEx_Calibration_Start(&hadc1)函数定义如下:

/**

  • @brief Perform an ADC automatic self-calibration
  •     Calibration prerequisite: ADC must be disabled (execute this
    
  •     function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
    
  •     During calibration process, ADC is enabled. ADC is let enabled at
    
  •     the completion of this function.
    
  • @param hadc: ADC handle
  • @retval HAL status
    @简要 执行ADC自动自校准
  •     校准先决条件:必须禁用ADC(执行此
    
  •     函数在HAL_ADC_Start()之前或HAL_ADC_Stop()之后)。
    
  •     在校准过程中,ADC被启用。允许在启用ADC
    
  •     完成此功能。
    

/
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef
hadc)
{
HAL_StatusTypeDef tmp_hal_status = HAL_OK;
uint32_t tickstart;
__IO uint32_t wait_loop_index = 0U;

/* Check the parameters */
/检查参数/
assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));

/* Process locked */
/进程已锁定/
__HAL_LOCK(hadc);

/* 1. Calibration prerequisite: /
/
- ADC must be disabled for at least two ADC clock cycles in disable /
/
mode before ADC enable /
/
Stop potential conversion on going, on regular and injected groups /
/
Disable ADC peripheral
一。校准先决条件:*/

/*-ADC必须禁用至少两个处于禁用状态的ADC时钟周期*/

/*ADC启用前的模式*/

/*停止正在进行的、常规组和注射组的电位转换*/

/*禁用ADC外围设备*/

tmp_hal_status = ADC_ConversionStop_Disable(hadc);

/* Check if ADC is effectively disabled /
/检查ADC是否有效禁用/
if (tmp_hal_status == HAL_OK)
{
/
Set ADC state */
/设置ADC状态/
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
HAL_ADC_STATE_BUSY_INTERNAL);

/* Hardware prerequisite: delay before starting the calibration.          */
/*  - Computation of CPU clock cycles corresponding to ADC clock cycles.  */
/*  - Wait for the expected ADC clock cycles delay */
	/*硬件先决条件:开始校准前延迟。*/

	/*-计算对应于ADC时钟周期的CPU时钟周期。*/

	/*-等待预期的ADC时钟周期延迟*/

wait_loop_index = ((SystemCoreClock
                    / HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_ADC))
                   * ADC_PRECALIBRATION_DELAY_ADCCLOCKCYCLES        );

while(wait_loop_index != 0U)
{
  wait_loop_index--;
}

/* 2. Enable the ADC peripheral */
	/*2。启用ADC外围设备*/
ADC_Enable(hadc);

/* 3. Resets ADC calibration registers */  
	/*三。重置ADC校准寄存器*/
SET_BIT(hadc->Instance->CR2, ADC_CR2_RSTCAL);

tickstart = HAL_GetTick();  

/* Wait for calibration reset completion */
	/*等待校准重置完成*/
while(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_RSTCAL))
{
  if((HAL_GetTick() - tickstart) > ADC_CALIBRATION_TIMEOUT)
  {
    /* Update ADC state machine to error */
			/*将ADC状态机更新为错误*/
    ADC_STATE_CLR_SET(hadc->State,
                      HAL_ADC_STATE_BUSY_INTERNAL,
                      HAL_ADC_STATE_ERROR_INTERNAL);
    
    /* Process unlocked */
			/*进程已解锁*/
    __HAL_UNLOCK(hadc);
    
    return HAL_ERROR;
  }
}

/* 4. Start ADC calibration */

	/*四。开始ADC校准*/

SET_BIT(hadc->Instance->CR2, ADC_CR2_CAL);

tickstart = HAL_GetTick();  

/* Wait for calibration completion */
	/*等待校准完成*/
while(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_CAL))
{
  if((HAL_GetTick() - tickstart) > ADC_CALIBRATION_TIMEOUT)
  {
    /* Update ADC state machine to error */
			/*将ADC状态机更新为错误*/
    ADC_STATE_CLR_SET(hadc->State,
                      HAL_ADC_STATE_BUSY_INTERNAL,
                      HAL_ADC_STATE_ERROR_INTERNAL);
    
    /* Process unlocked */
			 /*进程已解锁*/
    __HAL_UNLOCK(hadc);
    
    return HAL_ERROR;
  }
}

/* Set ADC state */
	/*设置ADC状态*/
ADC_STATE_CLR_SET(hadc->State,
                  HAL_ADC_STATE_BUSY_INTERNAL,
                  HAL_ADC_STATE_READY);

}

/* Process unlocked */
/进程已解锁/
__HAL_UNLOCK(hadc);

/* Return function status */
/返回功能状态/
return tmp_hal_status;
}

你可能感兴趣的:(STM32F103RCT6_ADC_校准与内部温度传感器注意事项)