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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版