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

STM32L073 AD转换

[复制链接]
song-407678 提问时间:2017-5-18 21:04 /
大神们好,我刚接触STM32L0系列芯片,现在搞AD转换,用HAL库,可以正常转换,但是转换时间太长了,效率很低。不知道是我程序有问题还是什么,现在想换寄存器写,不用库,用寄存器现在很没头绪,望大神们指点,最好给点例程。谢谢。下面是我用库写的
void vInitAdc(void)
{


  AdcHandle.Instance = ADC1;

  AdcHandle.Init.OversamplingMode      = DISABLE;

  AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;
  AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
  AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
  AdcHandle.Init.LowPowerAutoWait      = DISABLE;

  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;
  AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.ContinuousConvMode    = DISABLE;//ENABLE;
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  AdcHandle.Init.DMAContinuousRequests = DISABLE;

  /* Initialize ADC peripheral according to the passed parameters */
  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    ;//Error_Handler();
  }

  /* ### - 2 - Start calibration ############################################ */
  if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK)
  {
    ;//Error_Handler();
  }
}


unsigned int uiADC_Result(unsigned char ucChannel)
{       
        unsigned char i;
        unsigned int uiMaxResult = 0, uiMinResult = 0xFFFF;
        unsigned int j,uiResult = 0;
      ADC_ChannelConfTypeDef            sConfig;
      ADC1->CHSELR=0;
      ADC1->CHSELR=ucChannel;//sConfig.Channel;
     HAL_ADC_Start(&AdcHandle);

     for (i = 0;i < 6;i++)                  
        {
          HAL_ADC_PollForConversion(&AdcHandle, 10);
          /* Check if the continous conversion of regular channel is finished */
          if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
          {
                j = HAL_ADC_GetValue(&AdcHandle);       
          }
          if (j > uiMaxResult)
                {
                        uiMaxResult = j;
                }       
                if (j < uiMinResult)
                {
                        uiMinResult = j;
                }       
                uiResult += j;
           }

           uiResult -= uiMaxResult;     
        uiResult -= uiMinResult;              
       uiResult /= 4;   
    return uiResult;
}

收藏 2 评论3 发布时间:2017-5-18 21:04

举报

3个回答
Paderboy 回答时间:2017-5-18 22:27:15
你可以,把试下adc+dma方式。。。hal库里有例程,或者社区里也很多。
song-407678 回答时间:2017-5-18 22:39:16
Paderboy 发表于 2017-5-18 22:27
你可以,把试下adc+dma方式。。。hal库里有例程,或者社区里也很多。

我现在就需要的是单通道连续采集
Paderboy 回答时间:2017-5-19 08:03:27
song-407678 发表于 2017-5-18 22:39
我现在就需要的是单通道连续采集

adc+dma也可以单通道多次采样的。。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版