STM32 ADC --- 任意单通道采样

STM32 ADC --- 单通道采样

文章目录

需求:有多个通道需要进行ADC采样,实现每次采样只采样一个通道,且可以随时采样不同通道的功能

cubeMX配置

这里我们想通过10通道和11通道分别进行ADC采样。需要注意的是:当ADC规则转换中配置的转换数大于1时,cubeMX会自动将扫描转换模式使能 。但这里我们实际需要扫描转换模式为关闭,这里可以等下在代码中修改。还有个需要注意的地方是结束转换的选择:单个通道完成转换时即触发EOC标志位

代码修改:

为了方便后续继续使用cubeMX生成代码不影响改动,我们采用重新初始化ADC的方式来实现需求:

c 复制代码
void adc1_init(void) {
  /* 配置ADC引脚 */
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  
  /* 重新初始化ADC1 */
  HAL_ADC_DeInit(&hadc1);
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE; //ENABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  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){};
  
}

uint16_t adc_sample(ADC_HandleTypeDef *hadc, uint32_t adc_channel) {
  ADC_ChannelConfTypeDef sConfig = {0};
  sConfig.Channel = adc_channel;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;
  HAL_ADC_ConfigChannel(hadc, &sConfig);
  
  HAL_ADC_Start(hadc);
  HAL_ADC_PollForConversion(hadc, 100); //等待转换完成
  uint16_t value = HAL_ADC_GetValue(hadc);
  return value;
}

通过adc1_init()函数将ADC1重新初始化

  • 将扫描转换模式修改为DISABLE
  • 将转换通道数设置为1
  • 后续还有其它引脚通道需要转换时在配置ADC引脚处添加相关的初始化即可

后续便可以通过adc_sample()函数根据通道号进行ADC采样了,这里的采样方式为轮询等待模式。

应用

相关推荐
DS小龙哥17 分钟前
基于STM32设计的智能鞋柜【华为云IOT】
stm32·物联网·华为云
小灰灰搞电子23 分钟前
STM32L4 使用低功耗串口唤醒休眠状态源码分享
stm32·单片机·嵌入式硬件
咸蛋-超人11 小时前
聊一聊 - STM32的堆和栈空间怎么分配
stm32·单片机·嵌入式硬件
raindrops.13 小时前
STM32之LL库使用(二)
stm32·单片机·嵌入式硬件
单片机系统设计16 小时前
基于STM32的水质检测系统
网络·stm32·单片机·嵌入式硬件·毕业设计·水质检测
Y1rong18 小时前
STM32之IIC
stm32·单片机
光子物联单片机1 天前
STM32传感器模块编程实践(十七)DIY智能电子门锁套件模型
c语言·stm32·单片机·嵌入式硬件·mcu
raindrops.1 天前
STM32之LL库使用(一)
stm32·单片机·嵌入式硬件
麻辣长颈鹿Sir1 天前
STM32出现FLASH擦除失败异常现象分析及解决方法
stm32·单片机·嵌入式硬件·flash写入失败·stm32g070·类内构造函数定义域异常
码咔吧咔1 天前
STM32 MCU 的引脚分类
stm32·单片机·嵌入式硬件