WhyCan Forum

本站无需注册,无需积分,无需回复可下载所有资料,如果真的喜欢小站,请您注册之后请至少回复一个帖子激活Id,谢谢支持! 站长QQ: 516333132 (挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2018-12-27 17:29:00

BugActiveDaughter
Moderator
注册时间: 2017-10-17
累计积分: 58

stm32f030rc ad采样异常

采用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左右。

离线

#2 2018-12-27 17:29:41

BugActiveDaughter
Moderator
注册时间: 2017-10-17
累计积分: 58

Re: stm32f030rc ad采样异常

高手有空帮忙分析一下,第一次玩rc这个尾缀,有点闷逼了

离线

#3 2018-12-27 17:36:35

科技植
会员
注册时间: 2018-11-05
累计积分: 34

Re: stm32f030rc ad采样异常

是不是供电不足

离线

#4 2018-12-28 10:02:49

BugActiveDaughter
Moderator
注册时间: 2017-10-17
累计积分: 58

Re: stm32f030rc ad采样异常

不是供电不足,同样板子换st的103可以

离线

#5 2018-12-28 12:29:33

lcfmax
会员
注册时间: 2018-04-13
累计积分: 162

Re: stm32f030rc ad采样异常

我用103,还是集成库,没问题,应该软件那里设置有问题吧

离线

#6 2019-01-24 10:31:22

BugActiveDaughter
Moderator
注册时间: 2017-10-17
累计积分: 58

Re: stm32f030rc ad采样异常

已解决,跟串口的接收有冲突,f0潜在的bug。

离线

#7 2019-06-10 11:25:35

JenniferL
会员
注册时间: 2019-05-31
累计积分: 2

Re: stm32f030rc ad采样异常

BugActiveDaughter 说:

已解决,跟串口的接收有冲突,f0潜在的bug。

请问什么冲突哈

离线

页脚