STM32L051的ADC的ContinuousConvMode和DiscontinuousConvMode的理解

先上ADC配置函数:

/* ADC init function */
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_DIV2;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_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(__FILE__, __LINE__);
  }
    /**Configure for the selected ADC regular channel to be converted. 
    */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    /**Configure for the selected ADC regular channel to be converted. 
    */
  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    /**Configure for the selected ADC regular channel to be converted. 
    */
  sConfig.Channel = ADC_CHANNEL_VREFINT;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

 ADC配置了3个规则通道,即ADC1_IN4、内部温度传感器和内部参考电压VREFINT。

if(BSP_CheckTimer(3)) //200ms loop
{
  HAL_ADC_Start(&hadc);
  HAL_ADC_PollForConversion(&hadc, 100);
  while(!HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC));
  adc_temp = HAL_ADC_GetValue(&hadc);
  t_printf("adc_temp = %d\r\n",adc_temp);
}

程序采用轮询的方式采样ADC,200ms采样一次。

ContinuousConvMode即连续采样模式

DiscontinuousConvMode即非连续采样模式

如果ContinuousConvMode=DISABLE,DiscontinuousConvMode=DISABLE,则轮询读ADC只能读到ADC1_IN4的值:

如果ContinuousConvMode=DISABLE,DiscontinuousConvMode=ENABLE,则轮询读ADC能读到ADC1_IN4、内部温度传感器和内部参考电压VREFINT的值:

如果ContinuousConvMode=ENABLE,DiscontinuousConvMode=DISABLE,则轮询读ADC能读到ADC1_IN4、内部温度传感器和内部参考电压VREFINT的值,用此模式时,HAL_ADC_Start()只要调用一次即可,但是轮询读出的ADC通道并不是规律的:

原因应该是ADC配置成连续采样模式,而我 这边取ADC值的时间间隔太长而前面的值被覆盖了,此模式应该配合DMA 使用。

而ContinuousConvMode=ENABLE,DiscontinuousConvMode=ENABLE则ST在参考手册中是明文禁止这样使用的。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32L051ADC单通道采集模式下,可以通过以下步骤触发中断: 1. 配置ADC外设,包括时钟、采样时间、分辨率等参数。 2. 配置ADC转换模式为单通道模式,选择需要采集的通道,并使能ADC中断。 3. 配置NVIC中断向量表,使能ADC的中断。 4. 在主程序中开启ADC转换,等待ADC中断触发。 5. 在ADC中断服务函数中,读取转换数据寄存器,进行数据处理。 以下是代码示例: ``` // ADC配置 ADC_InitTypeDef ADC_InitStruct = {0}; ADC_InitStruct.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; ADC_InitStruct.Resolution = ADC_RESOLUTION_12B; ADC_InitStruct.ScanDirection = ADC_SCAN_DIRECTION_UPWARD; ADC_InitStruct.DataAlign = ADC_DATAALIGN_RIGHT; ADC_InitStruct.ScanMode = ADC_SCAN_DISABLE; ADC_InitStruct.ContinuousConvMode = DISABLE; ADC_InitStruct.DiscontinuousConvMode = DISABLE; ADC_InitStruct.NbrOfDiscConversion = 0; ADC_InitStruct.ExternalTrigConv = ADC_SOFTWARE_START; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } __HAL_ADC_ENABLE_IT(&hadc, ADC_IT_EOC); // ADC中断服务函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { uint32_t adc_value = HAL_ADC_GetValue(hadc); // 进行数据处理 } // 主程序 HAL_ADC_Start_IT(&hadc); while (1) { // 等待ADC中断触发 } ``` 在上述代码中,使用`HAL_ADC_Init()`和`HAL_ADC_ConfigChannel()`函数配置ADC外设和转换通道,使用`__HAL_ADC_ENABLE_IT()`函数使能ADC中断,使用`HAL_ADC_Start_IT()`函数开启ADC转换,并在主程序中等待ADC中断触发。在ADC中断服务函数中,使用`HAL_ADC_GetValue()`函数读取转换数据寄存器,并进行数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值