STM32
直播中

张涛

8年用户 1407经验值
私信 关注
[问答]

STM32G0RBT6 12个ADC通道采样返回全是0的原因?

请教大侠:
小弟现在使用G070的12位ADC进行12个通道采集
现在方案是
每次进行通道配置,启动采集一个通道,然后循环12个通道
下面是CUBE中的配置

下面是自动生成的代码
hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.LowPowerAutoPowerOff = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 12;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_79CYCLES_5;
  hadc1.Init.OversamplingMode = DISABLE;
  hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
  if (HAL_ADC_Init( hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_1;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_2;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_3;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_4;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_5;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_6;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_7;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_8;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_9;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_10;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_11;
  if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */
    /* Run ADC calibration */
    if (HAL_ADCEx_Calibration_Start( hadc1) != HAL_OK)
    {
      Error_Handler();
    }
  /* USER CODE END ADC1_Init 2 */

}


连续扫描12个通道,我用的是下面的代码
/******************************************************************************
  * @功能简介        :                单次采样12个通道一个函数
  * @参    数        :                无
  * @返 回 值        :                无
*******************************************************************************/
void ADC_SCAN_SAMPLE(void)
{
        
                uint8_t i;
                uint8_t chn=0;
                uint16_t adc_result = 0x0000;
                uint8_t adc_print[24];
        
                /* 启动转换 */
                HAL_ADC_Start( hadc1);
        
                do
                {
                                /* 等待转换完成 */
                                if (HAL_ADC_PollForConversion( hadc1, ADC_TIMEOUT) != HAL_TIMEOUT)
                                {
                                                /* 获取通道转换数据 */
                                                ADC_Val_Buf[chn] = HAL_ADC_GetValue( hadc1);
                                       
                                }
                                
                                chn++;
                                
                }while(chn==12);
               
                RS485_Transmit(startB,3);
                for(i=0;i<12;i++)
                {
                                adc_print[i*2] = (uint8_t)(ADC_Val_Buf>>8);
                                adc_print[i*2+1] = (uint8_t)(ADC_Val_Buf);
                }
                RS485_Transmit(adc_print,24);
                        
        
}

实际采集时,除了通道0有数据,其他通道返回全是0,请教下这是哪里配置问题吗?
我需要对通道0到通道11进行采集,求教!!!

回帖(1)

王婷

2024-4-7 17:18:30
首先,您可以确认以下事项是否已正确配置:

1. 确保您的引脚正确连接到ADC输入通道。检查引脚映射,并确保它们与您的硬件连接匹配。

2. 检查ADC通道的配置。您需要为每个通道配置正确的采样时间和转换模式。可以通过修改 `hadc1.Init.NbrOfConversion` 和 `hadc1.Init.SamplingTime` 在 `HAL_ADC_ConfigChannel` 函数中进行配置。

另外,可检查 `ADC1` 的时钟配置是否正确。确保 `ADC_CLOCK_SYNC_PCLK_DIV4` 与您的实际系统时钟频率相匹配。

3. 如果您使用了DMA来处理采样值,请确保已正确配置DMA,并设置了正确的DMA传输大小和内存地址。

4. 检查ADC转换的触发源。确保您正确配置了ADC转换的触发源。您可以通过修改 `hadc1.Init.ExternalTrigConv` 来设置触发源。

5. 最后,确保您在每次转换完成时,适当读取ADC数据寄存器以获得采样结果。

如果问题仍然存在,请提供更多代码和详细信息,以便我们可以更好地帮助您解决问题。
举报

更多回帖

×
20
完善资料,
赚取积分