[STM32H7]

HAL_ADCEx_Calibration_Start()作AD校准出错

[复制链接]
1703|89
手机看帖
扫描二维码
随时随地手机跟帖
t60yz|  楼主 | 2022-4-30 21:40 | 显示全部楼层 |阅读模式
AD, IO, ST, TI, ar
1. Calibration prerequisite: ADC must be disabled (execute this function before HAL_ADC_Start() or after HAL_ADC_Stop() )

函数说明很清楚,ADC校准需在ADC开始前或结束后。

2. 官方代码
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Perform an ADC automatic self-calibration
  *         Calibration prerequisite: ADC must be disabled (execute this
  *         function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
  * @param  hadc       ADC handle
* @param  CalibrationMode       Selection of calibration offset or
  *         linear calibration offset.
  *           [url=home.php?mod=space&uid=2817080]@ARG[/url] ADC_CALIB_OFFSET       Channel in mode calibration offset
  *           @arg ADC_CALIB_OFFSET_LINEARITY Channel in mode linear calibration offset
  * @param  SingleDiff Selection of single-ended or differential input
  *         This parameter can be one of the following values:
  *           @arg [url=home.php?mod=space&uid=144993]@ref[/url] ADC_SINGLE_ENDED       Channel in mode input single ended
  *           @arg @ref ADC_DIFFERENTIAL_ENDED Channel in mode input differential ended
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef *hadc, uint32_t CalibrationMode, uint32_t SingleDiff)
{
  HAL_StatusTypeDef tmp_hal_status;
  __IO uint32_t wait_loop_index = 0UL;

  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_SINGLE_DIFFERENTIAL(SingleDiff));

  /* Process locked */
  __HAL_LOCK(hadc);

  /* Calibration prerequisite: ADC must be disabled. */

  /* Disable the ADC (if not already disabled) */
  tmp_hal_status = ADC_Disable(hadc);

  /* Check if ADC is effectively disabled */
  if (tmp_hal_status == HAL_OK)
  {
    /* Set ADC state */
    ADC_STATE_CLR_SET(hadc->State,
                      HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
                      HAL_ADC_STATE_BUSY_INTERNAL);

    /* Start ADC calibration in mode single-ended or differential */
    LL_ADC_StartCalibration(hadc->Instance, CalibrationMode, SingleDiff);

    /* Wait for calibration completion */
    while (LL_ADC_IsCalibrationOnGoing(hadc->Instance) != 0UL)
    {
      wait_loop_index++;
      if (wait_loop_index >= ADC_CALIBRATION_TIMEOUT)
      {
        /* Update ADC state machine to error */
        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_STATE_CLR_SET(hadc->State,
                      HAL_ADC_STATE_BUSY_INTERNAL,
                      HAL_ADC_STATE_READY);
  }
  else
  {
    SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);

    /* Note: No need to update variable "tmp_hal_status" here: already set    */
    /*       to state "HAL_ERROR" by function disabling the ADC.              */
  }

  /* Process unlocked */
  __HAL_UNLOCK(hadc);

  /* Return function status */
  return tmp_hal_status;
}





使用特权

评论回复
olivem55arlowe| | 2022-12-6 18:38 | 显示全部楼层
运行ADC之前就是需要校准的。              

使用特权

评论回复
ccook11| | 2022-12-6 18:47 | 显示全部楼层
AD校准有什么错误呢?              

使用特权

评论回复
Undshing| | 2022-12-6 18:58 | 显示全部楼层
校准一下试试

使用特权

评论回复
AloneKaven| | 2022-12-6 20:34 | 显示全部楼层
校准有什么错误啊?

使用特权

评论回复
jtracy3| | 2022-12-10 08:47 | 显示全部楼层
stm32cubmex生成的代码就是这个样子的。

使用特权

评论回复
Henryko| | 2022-12-10 15:51 | 显示全部楼层
用cubeMX直接生成试试

使用特权

评论回复
yeates333| | 2022-12-12 11:01 | 显示全部楼层
不同通道之间有干扰怎么解决呢?              

使用特权

评论回复
nomomy| | 2022-12-15 09:53 | 显示全部楼层
必须在ADC转换启动前或停止后  

使用特权

评论回复
Bowclad| | 2022-12-15 10:57 | 显示全部楼层
直接生成一下试试

使用特权

评论回复
mickit| | 2022-12-15 22:42 | 显示全部楼层
自动校准ADC,调用即可吧   

使用特权

评论回复
nomomy| | 2022-12-16 23:25 | 显示全部楼层
ADC的配置很简答,直接DMA+ADC就行。

使用特权

评论回复
gygp| | 2022-12-17 10:29 | 显示全部楼层
有些芯片不支持校准               

使用特权

评论回复
macpherson| | 2022-12-17 11:58 | 显示全部楼层
这个代码可以运行的。              

使用特权

评论回复
belindagraham| | 2023-3-4 20:35 | 显示全部楼层
ADC校准需在ADC开始前或结束后。  

使用特权

评论回复
lzbf| | 2023-3-4 22:13 | 显示全部楼层
这个使用的是哪个库函数呢              

使用特权

评论回复
Stahan| | 2023-3-5 19:47 | 显示全部楼层
cubeMX生成的代码吗?

使用特权

评论回复
claretttt| | 2023-3-7 20:32 | 显示全部楼层
ADC校准需在ADC开始前或结束后。  

使用特权

评论回复
pentruman| | 2023-3-10 10:46 | 显示全部楼层
这个使用的是哪个库函数呢              

使用特权

评论回复
51xlf| | 2023-3-18 11:40 | 显示全部楼层
使用hal库中adc采样频率如何查看和修改?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

837

帖子

0

粉丝