STM32之CubeMX学习笔记(9)ADC+DMA多通道非连续查询模式


ADC+DMA

ADC,全称为A/D转换器,在STM32上是一个将模拟电压量转换为数字量的一个外设。STM32F401RCT6上有一个12位的ADC,它可以将GND到参考电压VREF之间的任一电压值,转换为0到4095的其中一个数字(4095为12位的二进制能表示的最大数字)。其一般用于采样电压值,或者将电流信号转换成电压信号,再采样其表示的电流值,还可以使用1个ADC的IO做一个多按键判断的键盘等等。
直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能。它在STM32上的作用就是可以代替CPU完成数据搬运的工作。一般用于通信,将通讯寄存器中的数据按照条例搬运到内存中,当CPU需要时,可以直接访问内存,分析之前传来的数据,不要等待通信完成,而在浪费时间和性能。
在cubemx中,我们一般使用以下代码来实现ADC采集并且将数据以DMA传输的方式传到我们在内存中开辟的数组中。

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

其中hadc是我们要操作的ADC所代表的参数结构体指针,pData是我们在内存中提前开辟的数组的指针,length是一次传输的ADC值数量。

多通道非连续查询

在实际操作过程中,我比较喜欢关闭连续采样(连续采样有时会不工作),在循环或者中断中来调用上面的HAL_ADC_Start_DMA。在需要的时刻持续监测ADC的值,由于ADC和DMA均为自动执行,从执行该指令到提取到更新后的ADC值,可以控制在5us以内(4Ranks,12bit,3cycle),可能需要时间更少(未测试),下面是具体实现。在这里插入图片描述
在这里插入图片描述

项目背景是在10us的中断内监测电池电压和UVW三相电机的电动势,Rank设置1–4
在这里插入图片描述

注意选择循环模式
接着我们定义一个数组

uint16_t ADCGET[4] = {0};

并在中断执行HAL_ADC_Start_DMA,将数组的首地址填进去。

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADCGET, 4);

开启中断后,就可以在主函数中将这个数组的值显示出来了。

OLED_ShowNum(20, 13, ADCGET[0], 4, 12);
OLED_ShowNum(70, 13, ADCGET[1], 4, 12);
OLED_ShowNum(70, 26, ADCGET[2], 4, 12);
OLED_ShowNum(70, 39, ADCGET[3], 4, 12);
OLED_Refresh_Gram();

小问题

不需要在初始化中写HAL_ADC_Start,会使RANK顺序乱一位。仅仅需要CubeMX自己生成的初始化即可。需要更新ADC值直接调用HAL_ADC_Start_DMA
我的芯片在选择连续工作模式时,地址内的数据不更新,而且在任何模式下,连续工作都不启用。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款具有多通道ADC、TIM、DMA和FFT功能的微控制器。 首先,多通道ADC允许我们同时采集多个不同通道的模拟信号。这对于需要同时监测多个传感器或信号源的应用常有用。通过配置ADC的多个通道,并设置相应的采样速率和分辨率,可以轻松实现高效的数据采集。 其次,TIM(定时器)模块允许我们生成精确的时间基准。在实时系统和定时器应用中,我们可以配置TIM来实现各种定时和计时功能。通过设置预分频器、计数器和比较器,我们可以准确地生成周期性的、定时的或脉冲宽度可变的信号。这对于控制和调度其他外设常有用。 接下来,DMA(直接内存访问)控制器允许我们实现高速数据传输,而不需要CPU的干预。通过配置DMA通道并定义源和目标的地址、传输长度和传输方向,我们可以实现高效的数据传输操作。这对于处理大量数据、高速数据流或实时响应的应用常有用。 最后,FFT(快速傅里叶变换)是一种用于信号处理和频谱分析的重要算法。通过使用STM32F103的FFT库,我们可以对采集到的模拟信号进行频谱分析,以提取信号的频率和幅度特征。这对于音频处理、通信系统、传感器数据分析等应用常有用。 总之,STM32F103的多通道ADC、TIM、DMA和FFT功能为我们提供了丰富的数据采集、定时、数据传输和信号处理能力,使得我们可以设计出高度灵活、高效的嵌入式系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值