登录/注册

stm32 adc 多通道 不用dma

更多

在STM32上实现多通道ADC采样而不使用DMA,可以通过扫描模式结合中断单次转换模式手动切换通道来实现。以下是具体步骤和示例代码:


方法一:扫描模式 + 中断(适合连续采样)

  1. 配置ADC参数

    • 选择扫描模式(Scan Mode),连续转换(Continuous Conversion)。
    • 设置通道数及顺序(规则组通道列表)。
    • 使能转换完成中断(EOC)。
  2. 中断处理

    • 每次所有通道转换完成后触发中断。
    • 在中断中读取所有通道数据(需按顺序读取)。
// 示例代码(以HAL库为例)
ADC_HandleTypeDef hadc;

void ADC_Init() {
  hadc.Instance = ADC1;
  hadc.Init.ScanConvMode = ENABLE;       // 开启扫描模式
  hadc.Init.ContinuousConvMode = ENABLE; // 连续转换
  hadc.Init.NbrOfConversion = 3;         // 3个通道
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发
  // 其他参数(时钟、分辨率等)根据需求配置...

  HAL_ADC_Init(&hadc);

  // 配置通道顺序(例如通道0、1、2)
  HAL_ADC_ConfigChannel(&hadc, &(ADC_ChannelConfTypeDef){ADC_CHANNEL_0, 1, ADC_SAMPLETIME_3CYCLES});
  HAL_ADC_ConfigChannel(&hadc, &(ADC_ChannelConfTypeDef){ADC_CHANNEL_1, 2, ADC_SAMPLETIME_3CYCLES});
  HAL_ADC_ConfigChannel(&hadc, &(ADC_ChannelConfTypeDef){ADC_CHANNEL_2, 3, ADC_SAMPLETIME_3CYCLES});

  HAL_ADC_Start_IT(&hadc); // 启动ADC并开启中断
}

// ADC转换完成中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
  uint16_t adc_values[3];
  adc_values[0] = HAL_ADC_GetValue(&hadc); // 读取通道0数据
  adc_values[1] = HAL_ADC_GetValue(&hadc); // 通道1(需确认是否自动切换)
  adc_values[2] = HAL_ADC_GetValue(&hadc); // 通道2
  // 注意:某些型号需通过DR寄存器偏移读取多通道数据
}

方法二:单次转换 + 手动切换(适合按需采样)

  1. 配置ADC为单次模式

    • 关闭扫描模式,使用单次转换(Single Conversion)。
    • 每次转换后手动切换通道并重新启动。
  2. 中断或轮询处理

    • 每次转换完成后触发中断,读取数据后切换到下一通道。
ADC_HandleTypeDef hadc;
uint8_t current_channel = 0;
uint16_t adc_values[3];

void ADC_Init() {
  hadc.Instance = ADC1;
  hadc.Init.ScanConvMode = DISABLE;      // 关闭扫描模式
  hadc.Init.ContinuousConvMode = DISABLE; // 单次转换
  // 其他参数配置...
  HAL_ADC_Init(&hadc);

  // 启动第一个通道的转换
  HAL_ADC_Start_IT(&hadc);
}

// 中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
  adc_values[current_channel] = HAL_ADC_GetValue(hadc);
  current_channel = (current_channel + 1) % 3; // 循环切换通道

  // 配置下一通道并重启转换
  ADC_ChannelConfTypeDef sConfig = {0};
  sConfig.Channel = current_channel; // 假设通道0、1、2
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(hadc, &sConfig);
  HAL_ADC_Start_IT(hadc);
}

关键注意事项

  1. 数据寄存器读取

    • 在扫描模式中,不同型号的STM32可能通过ADC_DR寄存器按顺序存储数据,需通过偏移地址读取,或依赖库函数处理。
  2. 中断频率

    • 扫描模式的中断频率为所有通道转换一次后触发一次,而单次模式每个通道转换均触发中断。
  3. 通道配置

    • 确保每个通道的GPIO已初始化为模拟输入模式。

通过上述方法,即可在不使用DMA的情况下实现多通道ADC采样。

stm32cubemx建立通道ADC+DMA,想使用DMA中断要怎么实现?

各位大神: 我在用stm32 cubemx建立ADC+DMA多通道,想使

2024-04-02 07:14:47

STM32G0开发笔记:通道ADCDMA的使用

使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为多通道

2023-01-17 10:41:03

stm32 定时器触发ADC通道采样+DMA提取数据相关资料下载

stm32g0 定时器触发ADC多通道采样+

2022-02-15 06:46:31

STM32F1 ADCDMA的简单理解

本文主要讲解stm32f1中ADC和DMA的使用,在学习中参考了多篇文章

资料下载 佚名 2021-12-27 19:09:32

STM32ADC通道采样

基于STM32Cube的ADC多通道采样STMCube+MDK用hal库

资料下载 佚名 2021-12-24 19:29:29

STM32CubeMX下STM32单片机声音传感器DMA方式采集通道数据(ADC-DMA

前言:之前一篇博客介绍了环境光传感器通过ADC的方式采集单通道的数据,现在介绍一下DMA方式采集

资料下载 佚名 2021-12-24 19:25:14

stm32 定时器触发ADC通道采样+DMA提取数据

stm32g0 定时器触发ADC多通道采样+

资料下载 佚名 2021-12-16 16:56:32

STM32实现用DMA完成通道AD采样资料下载

电子发烧友网为你提供STM32实现用DMA完成多通道AD采样资料下载的电

资料下载 131594 2021-03-29 16:47:46

STM32-ADC通道通道采集

STM32-ADC单通道与多通道采集单

2021-12-17 07:29:56

STM32之如何使用DMA进行通道ADC转换

STM32之如何使用DMA进行多通道

2021-10-13 07:13:46

STM32通道DMAADC如何进行采样

STM32多通道DMA—

2021-10-13 06:58:23

怎样去解决STM32通道ADC+DMA无法进入中断的问题

STM32多通道ADC+DMA为什么会无法进入中断呢?怎样去解决

2021-09-26 08:04:41

STM32通道DMAADC采样 精选资料推荐

title: STM32多通道DMA—

2021-08-04 07:19:31

关于ADC通道DMA配置的顺序

我所选用的芯片是STM32F030C6,采用官方STM32CubeMX配置ADC多

2021-08-04 06:10:13

STM32通道ADC+DMA为什么无法进入中断

STM32 多通道ADC+DMA无法进入中断问题中断函数名称不一致

2021-08-02 08:33:08
7天热门专题 换一换
相关标签