您的位置:首页 > 编程语言

STM32LxxADC单通道多次转换代码分析(非DMA)

2017-01-13 10:09 316 查看
stm32l0c8xADC特性如下:

有多达16 个通道和3个内部通道(温度传感器、参考电压),PA0、PA4、PA5为高速通道,其他为标准通道。

有单次转换模式和扫描模式,扫描模式下对选定的通道自动进行扫描转换。

ADC频率独立于CPU频率外,即使CPU速度低,ADC也可以达到允许最大采样速率1.14 MSPS。 

能耗很低频率(10kSPS,25μA;1MSPS,200μA)。 

自动关闭功能保证ADC在有效转换阶段期间外能够关闭。

可由DMA控制器控制,工作电压可低至1.65v

模拟看门狗功能

等等。。。

以下是基于上述mcu的ADC单通道多次转换(非DMA)代码,代码已经通过调试,欢迎指正交流。

1、声明相关变量 

float ADC_ConvertedValueLocal;
uint32_t ADC_ConvertedValue;
uint32_t DMA_Transfer_Complete_Count=0;
ADC_HandleTypeDef hadc;
IWDG_HandleTypeDef hiwdg;


2、ADC初始化,需要初始化ADC配置及ADC所用的GPIO通道

      本文选用PA1引脚作为采样输入引脚:

/*
*  Instance                  = ADC1.
*  OversamplingMode          = Disabled
*  ClockPrescaler            = PCLK clock with no division.
*  LowPowerAutoPowerOff      = Disabled (For this exemple continuous mode is enabled with software start)
*  LowPowerFrequencyMode     = Enabled (To be enabled only if ADC clock is lower than 2.8MHz)
*  LowPowerAutoWait          = Disabled (New conversion starts only when the previous conversion is completed)
*  Resolution                = 12 bit (increased to 16 bit with oversampler)
*  SamplingTime              = 7.5 cycles od ADC clock.
*  ScanConvMode              = Forward
*  DataAlign                 = Right
*  ContinuousConvMode        = Enabled
*  DiscontinuousConvMode     = Enabled
*  ExternalTrigConvEdge      = None (Software start)
*  EOCSelection              = End Of Conversion event
*  DMAContinuousRequests     = ENABLE
*/
static void MX_ADC_Init(void)
{
  ADC_ChannelConfTypeDef sConfig;
    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
    */
  hadc.Instance = ADC1;
  hadc.Init.OversamplingMode = DISABLE;
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.DMAContinuousRequests = ENABLE;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_SEQ_CONV;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerFrequencyMode = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }

    /**Configure for the selected ADC regular channel to be converted. 
    */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

}


3、GPIOA与ADC初始化后,即可在main中调用函数获得转化后的值void get_ADC_value()
{ int i;
float dat[6], ad_ch1;
/* ### Start conversion ################################# */
HAL_ADC_Start_IT(&hadc);
for(i=0;i<4;i++)
{
dat[i] =(float)ADC_ConvertedValue*3.3/4096;
}
ad_ch1=(dat[0]+dat[1]+dat[2]+dat[3])/4 ;
ADC_ConvertedValueLocal=ad_ch1;
}
/** * AD转换结束回调函数 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_ConvertedValue=HAL_ADC_GetValue(hadc);
}













                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息