请选择 进入手机版 | 继续访问电脑版

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

请教:STM32G0RBT6,12个ADC通道采样

[复制链接]
老客 提问时间:2021-4-26 22:51 / 未解决
请教大侠:
小弟现在使用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 评论1 发布时间:2021-4-26 22:51

举报

1个回答
老客 回答时间:2021-4-26 22:55:29
以前使用F103的经典固件库时,使用规则通道进行采样,但规则序列里只有一个通道,采样完一个通道,进行通道配置,再启动采样。
/******************************************************************************
  * @功能简介        :                获取指定ADC通道数据函数
  * @参    数        :                ch                指定ADC通道
  * @返 回 值        :                无
*******************************************************************************/
uint16_t ADC_ONCHIP_Get_Data(uint8_t ch)   
{
          //设置指定ADC的规则组通道,一个序列,采样时间,如果一个序列有多个通道,则用多个ADC_RegularChannelConfig()函数配置顺序
                ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      

                ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
         
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

                return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
}

HAL刚开始使用不久,普通的UART,GPIO等移植比较简直,ADC就有点烦了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版