硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4729|回复: 13
收起左侧

[ADC] [ADC]ADC1/ADC2初始化时,内部电压调节器没有工作

[复制链接]

1

主题

7

回帖

37

积分

新手上路

积分
37
发表于 2018-9-17 16:18:27 | 显示全部楼层 |阅读模式
各位大神,我在调ADC1时候,初始时没有过,单步看到程序在使能内部电压调节器时候TIMEOUT了。(ADC2有同样的问题)
if  (HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADVREGEN))
  {
    /* Enable ADC internal voltage regulator */
    SET_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN);
    /* Delay for ADC stabilization time                                       */
    /* Wait loop initialization and execution                                 */
    /* Note: Variable divided by 2 to compensate partially                    */
    /*       CPU processing cycles.                                           */
    wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / (1000000 * 2)));
    while(wait_loop_index != 0)
    {
      wait_loop_index--;
    }
  }


换了新的芯片还是这样,搞得不知所措了。还请大神解惑。

难道是硬件配置问题吗?
下图是我的硬件环境,使用外部3.3V电压链接到VREF+
(我用ADC3读取VREFINT得到3.2V左右,VBAT也是3.2V,内部温度也是正常)

ADC配置

ADC配置

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-17 16:28:09 | 显示全部楼层
那个,这个吗

回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2018-9-17 17:55:52 | 显示全部楼层

感谢大神!
但是我试过把VREF+那个10R电阻去掉,不外接VDDA时候,使用内部参考电压,VREFINT 为1.21V。然而ADC1同样初始化失败在使能内部电压调节器那。当外接VDDA时,我读回来的是3.2V左右,跳变很小。有点蒙圈这个内部参考电压和外接参考电压的设置。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-17 18:02:32 | 显示全部楼层
Zero_TOd9h 发表于 2018-9-17 17:55
感谢大神!
但是我试过把VREF+那个10R电阻去掉,不外接VDDA时候,使用内部参考电压,VREFINT 为1.21V。 ...

这就涉及到一个关键的知识点,仅ADC3支持温度,VBAT和REFINT

回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2018-9-17 18:14:43 | 显示全部楼层
eric2013 发表于 2018-9-17 18:02
这就涉及到一个关键的知识点,仅ADC3支持温度,VBAT和REFINT

是的,只有ADC3内部链接了温度,VBAT,VREFINT。
第一个问题是不是可以这样呢:
当不外接VDDA时,默认使用内部参考电压,
当外接VDDA时,我使用的是外部参考电压。
好像是硬件自动选择啊。

第二个问题我还是没明白,
使用ADC1的通道4和6(PA4和PA6)时,初始化ADC1时HAL_ADC_Init()中调用使能电压调节器时候,TIMEOUT,初始化失败,进入ERROR_Handle了.这里可能的原因是什么?
我用ADC1是想采集外部信号。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-17 18:23:32 | 显示全部楼层
Zero_TOd9h 发表于 2018-9-17 18:14
是的,只有ADC3内部链接了温度,VBAT,VREFINT。
第一个问题是不是可以这样呢:
当不外接VDDA时,默认 ...

1、第1个问题,这个要配置的
http://www.armbbs.cn/forum.php?m ... peid%26typeid%3D175

2、HAL_ADC_Init()里面这个参数?没注意过,你贴段参数配置程序看看。
回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2018-9-18 08:10:52 | 显示全部楼层
eric2013 发表于 2018-9-17 18:23
1、第1个问题,这个要配置的
http://www.armbbs.cn/forum.php?mod=viewthread&tid=89360&extra=page% ...

        ADC1_Handler.Instance                                           = ADC1;
       
        if (HAL_ADC_DeInit(&ADC1_Handler) != HAL_OK)
        {
                Error_Handler();
        }
        ADC1_Handler.Init.ClockPrescaler           = ADC_CLOCK_SYNC_PCLK_DIV4;             
        ADC1_Handler.Init.Resolution               = ADC_RESOLUTION_16B;            
        ADC1_Handler.Init.ScanConvMode             = ENABLE;                 
        ADC1_Handler.Init.EOCSelection             = ADC_EOC_SEQ_CONV;           
        ADC1_Handler.Init.LowPowerAutoWait         = DISABLE;                              
        ADC1_Handler.Init.ContinuousConvMode       = ENABLE;                        
        ADC1_Handler.Init.NbrOfConversion          = 2;                                    
        ADC1_Handler.Init.DiscontinuousConvMode    = DISABLE;               
        ADC1_Handler.Init.NbrOfDiscConversion      = 0;                             
        ADC1_Handler.Init.ExternalTrigConv         = ADC_SOFTWARE_START;                              
        ADC1_Handler.Init.ExternalTrigConvEdge     = ADC_EXTERNALTRIGCONVEDGE_NONE;
        ADC1_Handler.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;       
        ADC1_Handler.Init.Overrun                  = ADC_OVR_DATA_OVERWRITTEN;     
        ADC1_Handler.Init.OversamplingMode         = DISABLE;                       
        ADC1_Handler.Init.BoostMode                = ENABLE;                     

        if (HAL_ADC_Init(&ADC1_Handler) != HAL_OK)
        {
                Error_Handler();
        }

上边是我对ADC1的配置,请查看一下。

另外,ADVREGEN的使能与参考电压选择是内部还是外部,有关系吗?
Capture.PNG
谢谢!

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-18 10:06:02 | 显示全部楼层
Zero_TOd9h 发表于 2018-9-18 08:10
ADC1_Handler.Instance                                           = ADC1;
        
        if (HAL_ADC_DeInit(&ADC1_Handler) != HAL_OK)

看了下HAL_ADC_Init的源码。
while(wait_loop_index != 0) 就是个软件延迟等待。

难道是下面这个判断后退出了,那就延迟它10秒,看看是否还正常。
  1. /* Verification that ADC voltage regulator is correctly enabled, whether    */
  2.   /* or not ADC is coming from state reset (if any potential problem of       */
  3.   /* clocking, voltage regulator would not be enabled).                       */
  4.   if (HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADVREGEN))
  5.   {
  6.     /* Update ADC state machine to error */
  7.     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);

  8.     /* Set ADC error code to ADC IP internal error */
  9.     SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);

  10.     tmp_hal_status = HAL_ERROR;
  11.   }
复制代码


回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2018-9-18 14:27:35 | 显示全部楼层
eric2013 发表于 2018-9-18 10:06
看了下HAL_ADC_Init的源码。
while(wait_loop_index != 0) 就是个软件延迟等待。

问题就在这里,等待超时进ERROR了。
源码中:

  if  (HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADVREGEN))
  {
    /* Enable ADC internal voltage regulator */
    SET_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN);   
    /* Delay for ADC stabilization time                                       */
    /* Wait loop initialization and execution                                 */
    /* Note: Variable divided by 2 to compensate partially                    */
    /*       CPU processing cycles.                                           */
    wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / (1000000 * 2)));
    while(wait_loop_index != 0)
    {
      wait_loop_index--;
    }
  }


/* Delay for ADC voltage regulator startup time                               */
/*  Maximum delay is 10 microseconds                                          */
/* (refer device RM, parameter Tadcvreg_stup).                                */
#define ADC_STAB_DELAY_US               ((uint32_t) 10)     /*!< ADC voltage regulator startup time */



但是,测试过最大10ms和10s,依然没有过去。

观察hadc->Instance->CR寄存器值,没有变化。



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-19 01:39:34 | 显示全部楼层
Zero_TOd9h 发表于 2018-9-18 14:27
问题就在这里,等待超时进ERROR了。
源码中:

那看来你的硬件可能有问题了,得找找了,我手头的官方NUCLEO版本,没有这个问题。
回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2018-9-19 10:02:20 | 显示全部楼层
eric2013 发表于 2018-9-19 01:39
那看来你的硬件可能有问题了,得找找了,我手头的官方NUCLEO版本,没有这个问题。

谢谢!
硬件这边是根据官方推荐的外围: Capture.PNG

整理一下问问官方有什么可能的原因导致这种情况。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-20 00:33:52 | 显示全部楼层
Zero_TOd9h 发表于 2018-9-19 10:02
谢谢!
硬件这边是根据官方推荐的外围:

好的,等后面有消息了,希望可以告知下原因
回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2018-9-21 08:12:05 | 显示全部楼层
本帖最后由 Zero_TOd9h 于 2018-9-21 08:21 编辑
eric2013 发表于 2018-9-20 00:33
好的,等后面有消息了,希望可以告知下原因

前两天出差没时间搞,今天在ST社区查了一下,还真有人遇到过,也是说可能是时钟问题
源码注释里有句话 "if any potential problem of  clocking, voltage regulator would not be enabled)"

给出的解决方案是使用PER_CK,还没试,抽时间试试“Anyhow selecting PER_CK for ADC seems to be the only working solution to be able to run the ADC

https://community.st.com/s/feed/0D50X00009XkZJrSAN



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-9-21 09:18:04 | 显示全部楼层
Zero_TOd9h 发表于 2018-9-21 08:12
前两天出差没时间搞,今天在ST社区查了一下,还真有人遇到过,也是说可能是时钟问题
源码注释里有句话 " ...

那就是选择PLL2,PLL3或者HSE,HSI,CSI的时钟。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 05:55 , Processed in 0.201400 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表