STM32使用HAL库实现DMA-driven ADC采集

文章目录

  • 一. 前言
  • 二. CubeMX配置
  • 三. ADC读取
  • 一. 前言

    请添加图片描述

    ADC是指模数转化,即将模拟信号转化为数字信号。 世界的信号本质都是模拟信号,如速度、温度、声音,在本质上都是模拟的。但是微控制器和微处理器上运行的电子设备不能直接读取或者解释这些模拟值,因为它们只在0和1上运行。所以我们需要将这些模拟值转换成0和1,以便微控制器和微处理器能够理解它们。这就是我们所说的模拟信号转化为数字信号。与ADC相对应的是DAC,即将数字信号转化为模拟信号。

    二. CubeMX配置

    开发环境:Keil 、 CubeMX
    软件版本:5.31 、6.2.1
    使用芯片:STM32F103C8T6
    开发语言:C

    CubeMX的配置非常简单:Analog->ADCx->INx


    此处选择多通道采集,选择ADC1 ,勾选IN1 IN2 。配置如下:

  • 由于是多通道采集,需开启Scan Conversion Mode 扫描模式
  • 需要多次读取,因此开启Continuous Conversion Mode 连续转换模式
  • 选配Rank,给IN1、IN2选择合适的采样通道和采样周期。

  • 添加DMA通道 ,将模式改为Circular 循环模式 ,这样每次DMA传输成功后会主动开启下一次传输。

    三. ADC读取

    启动函数:

    HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
    

    将ADC用于遥杆的读取: 遥杆的本质是一个电位器,通过ADC采集变化的电压可以得到遥杆X、Y轴的遥杆值。按照上面的配置,在生成的Keil工程中加入如下代码可以便可以得到采集的遥杆值。

    
    uint16_t Joystick_ADC[2];
    
    HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&Joystick_ADC,2);
    
    


    注意: 如果开启ADC的DMA接收后没办法继续运行主函数可能是因为设置的采样周期太短,频繁触发DMA接受中断导致的。可以在CubeMX中把Rank中通道的采样周期Samplink Time 设长一些,亲测有效。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32使用HAL库实现DMA-driven ADC采集

    发表评论