STM32F103C8T6 ADC1 连续采样和单次采样配置教程

本教程将介绍如何使用 STM32F103C8T6 芯片的 ADC1 模块,实现 ADC 连续采样(通道 1)和单次采样(通道 2)的配置方法,并提供代码示例。

目标:

  • 使用 ADC1 完成 ADC 采样任务,不使用 ADC2 的资源。
  • 通道 1 需要连续转换,周期在 10us 以内。
  • 通道 2 需要 50ms 转换一次,优先级不高,甚至 100ms 转换一次都是可以被允许的。

配置步骤:

  1. 初始化 ADC1 模块:

    • 设置 ADC 时钟:使用默认的 APB2 时钟(一般为 72MHz)。
    • 使能 ADC1 时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE)
    • 设置 ADC1 为独立模式:ADC_CommonInitTypeDef.ADC_Mode = ADC_Mode_Independent
    • 初始化 ADC1:ADC_Init(ADC1, &ADC_InitStructure)
    • 使能 ADC1:ADC_Cmd(ADC1, ENABLE)
  2. 配置 ADC1 的通道 1 (ch1):

    • 设置 ADC1 的转换模式:ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous
    • 设置 ADC1 的转换通道:ADC_InitStructure.ADC_RegularChannelConfig = ADC_Channel_1
    • 设置 ADC1 的采样时间:ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_XXcycles(根据实际需求设置)。
    • 配置 ADC1 的转换参数:ADC_Init(ADC1, &ADC_InitStructure)
    • 使能 ADC1 的通道 1:ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_XXcycles)
  3. 配置 ADC1 的通道 2 (ch2):

    • 设置 ADC1 的转换模式:ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous
    • 设置 ADC1 的转换通道:ADC_InitStructure.ADC_RegularChannelConfig = ADC_Channel_2
    • 设置 ADC1 的采样时间:ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_XXcycles(根据实际需求设置)。
    • 配置 ADC1 的转换参数:ADC_Init(ADC1, &ADC_InitStructure)
    • 使能 ADC1 的通道 2:ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_XXcycles)
  4. 配置 ADC1 的转换触发源和优先级:

    • 设置 ADC1 的转换触发源:ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None
    • 设置 ADC1 的转换优先级:ADC_InitStructure.ADC_RegularPriority = ADC_PriorityLevel_X(根据实际需求设置)。
    • 配置 ADC1 的转换触发源和优先级:ADC_Init(ADC1, &ADC_InitStructure)
  5. 启动 ADC1 的转换:

    • 启动 ADC1 的软件触发转换:ADC_SoftwareStartConvCmd(ADC1, ENABLE)
  6. 在需要的地方读取 ADC1 的转换结果:

    • 等待 ADC1 的转换完成:while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)
    • 读取 ADC1 的转换结果:uint16_t adcResult = ADC_GetConversionValue(ADC1)

代码示例:

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hadc->Instance==ADC1)
  {
    /* ADC1 clock enable */
    __HAL_RCC_ADC1_CLK_ENABLE();
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**ADC1 GPIO Configuration    
    PA1     ------> ADC1_IN1
    PA2     ------> ADC1_IN2
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance==ADC1)
  {
    /* Peripheral clock disable */
    __HAL_RCC_ADC1_CLK_DISABLE();
    
    /**ADC1 GPIO Configuration    
    PA1     ------> ADC1_IN1
    PA2     ------> ADC1_IN2
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2);
  }
}

static void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();

  while (1)
  {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 10);
    uint16_t adcResult = HAL_ADC_GetValue(&hadc1);
    // 使用 adcResult 进行后续处理
  }
}

注意:

  • 以上代码示例仅供参考,实际代码实现需要根据使用的开发环境和库函数进行调整。
  • 采样时间 ADC_SampleTime_XXcycles 需要根据实际需求设置,建议参考 STM32 的参考手册。
  • 优先级 ADC_PriorityLevel_X 需要根据实际需求设置,建议参考 STM32 的参考手册。
  • 转换触发源 ADC_ExternalTrigConv_None 可根据实际需求进行调整,例如使用定时器触发等。
  • 转换结果的读取需要等待 ADC1 的转换完成,可以使用 HAL_ADC_PollForConversion() 函数进行等待。
  • 转换结果的存储和处理需要根据实际需求进行设计。
STM32F103C8T6 ADC1 连续采样和单次采样配置教程

原文地址: https://www.cveoy.top/t/topic/br99 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录