你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f030rc 多路ad采样异常

[复制链接]
superst 提问时间:2019-1-2 10:56 /
采用hal库,多路采样,发现只要启动ad,ad输入就会莫名其妙有0.4V左右的电压。配置如下,
hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4 ;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection =ADC_EOC_SEQ_CONV;//
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = ENABLE;//
  hadc.Init.DiscontinuousConvMode =DISABLE;
  hadc.Init.ExternalTrigConv =ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = ENABLE;
  hadc.Init.Overrun =ADC_OVR_DATA_OVERWRITTEN;//
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler(ERR_ADC_init);
  }
  
  __HAL_RCC_DMA1_CLK_ENABLE();
    hdma_adc.Instance = DMA1_Channel1;
    hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc.Init.Mode = DMA_CIRCULAR;
    hdma_adc.Init.Priority = DMA_PRIORITY_MEDIUM;

    if (HAL_DMA_Init(&hdma_adc) != HAL_OK)
    {
      Error_Handler(ERR_DMA_Init);
    }
       __HAL_DMA1_REMAP(HAL_DMA1_CH1_ADC);
       __HAL_LINKDMA(&hadc,DMA_Handle,hdma_adc);


  if (HAL_ADCEx_Calibration_Start(&hadc) != HAL_OK)
  {
  
    Error_Handler(ERR_ADCEx_Cal);
  }
sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank =ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
   Error_Handler(ERR_ADC_Config);
  }
  
sConfig.Channel = ADC_CHANNEL_6;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
   Error_Handler(ERR_ADC_Config);
  }

  sConfig.Channel = ADC_CHANNEL_7;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler(ERR_ADC_Config);
  }

  
  sConfig.Channel = ADC_CHANNEL_14;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler(ERR_ADC_Config);
  }
    sConfig.Channel = ADC_CHANNEL_15;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler(ERR_ADC_Config);
  }
硬件io配置如下
__HAL_RCC_ADC1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
   
    /**ADC GPIO Configuration   
    PA0     ------> ADC_IN0
    PA6     ------> ADC_IN6
    PA7     ------> ADC_IN7
    PC4     ------> ADC_IN14
    PC5     ------> ADC_IN15
    */
    GPIO_InitStruct.Pin =AD6_NOISE_Pin| AD0_V25_Pin|AD7_R_Pin;
    GPIO_InitStruct.Mode =GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   /* GPIO_InitStruct.Pin = AD14_R_Pin|AD15_R_Pin;
   GPIO_InitStruct.Mode =GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull =GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);*/
之后在while(1)前启动ad,调用如下
HAL_ADC_Start_DMA(&hadc, (uint32_t *)ADCConvertedDMABUF, 5);
之后测量各路的ad输入,正常应该是0V,可测量得到是0.4V左右,ad值为600左右。
收藏 评论3 发布时间:2019-1-2 10:56

举报

3个回答
Paderboy 回答时间:2019-1-8 09:49:04
需要在初始化AD后,运行校准函数。。HAL_ADCEx_Calibration_Start(&hadc);然后再去采样。。

然后外部引脚最好不要悬空。。。。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

watershade 回答时间:2019-1-8 12:07:40
另外注意一下间隔时间,我曾经犯过采集切换的时间太快,互相之间有影响。官方专门有一篇文章讲解ADC到底设置多少SamplingTime合适。你可以找找看。找不到再给我留言。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

samhong 回答时间:2019-1-21 23:55:45
高高。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版