蓝桥杯嵌入式ADC+DMA数据采样
很多蓝桥杯嵌入式选手会在主函数中多次调用ADC(模数转换器)函数来获取模拟信号的数据。然而,这种方法往往会占用大量的软件资源,并限制采样速率。本文将介绍一种更高效的方法,通过结合使用ADC和DMA(直接存储器访问)来进行模拟信号采样。这种方式不仅能够充分利用硬件资源,还能显著减少软件资源的消耗,同时提高采样速率。下面是使用这种方法的例子:
1.新建工程
推荐观看:
【备战蓝桥杯 嵌入式组】CT117E-M4 新款开发板 3小时省赛模块 速成总结中的工程模板建立
并在bsp文件夹中添加LCD相关文件:fonts.h lcd.c lcd.h
2.配置ADC+DMA
(1)在CubeMX中启用对应引脚(PB12 PB15)的ADC1、ADC2通道
找到Categories选项,选择Analog,再选择ADC1,选择IN11 Single-ended:

选择ADC2,勾选IN15 Single-ended:

PB15、PB12出现以下提示表示成功打开相应通道:

(2)使能连续转换
回到ADC1,点击Parameter Settings,在Continuous Conversion Mode选项中选择Enabled:

选择ADC2,点击Parameter Settings,在Continuous Conversion Mode选项中选择Enabled:

(3)添加DAM
回到ADC1,选择DMA Settings,在出现的DMA Request选项中选择ADC1:

然后会出现如下图的选项卡,在Mode选项中选择Circular,其余不变:

ADC2同上配置:


(4)使能DMA请求为连续模式
回到ADC1,点击Parameter Settings,在DMA Continuous Requests选项中选择Enabled,其他不变:

ADC2同上:

(5)失能DMA中断(若不失能,程序将会卡死)
点击System Core,在System Core中选择NVIC,取消勾选Force DMA channels interrupts:

取消勾选DMA1 channel1 global interrupt、DMA1 channel2 global interrupt,其他不变:

(6)更新文件
点击右上角GENERATE CODE,出现如下提示框,点击Open Project:

3.显示模拟量电压值
在如下注释框中引用这两行代码,注意不要在没有USER CODE BEGIN和END的注释框之间编写代码,否则每次更新文件CubeMX会删除自己所写的代码:
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */
建立两个数组用来存储模拟量数据,char型数组用于LCD显示:
/* USER CODE BEGIN PTD */
char str[30];
uint16_t adc1[1];
uint16_t adc2[1];
/* USER CODE END PTD */
编写LCD屏幕显示电压函数:
/* USER CODE BEGIN 0 */
void LCD_Display(void)
{
sprintf(str, " U1:%.2fV ", (adc1[0]/4095.0)*3.3);
LCD_DisplayStringLine(Line6, (unsigned char *)str);
sprintf(str, " U2:%.2fV ", (adc2[0]/4095.0)*3.3);
LCD_DisplayStringLine(Line8, (unsigned char *)str);
}
/* USER CODE END 0 */
初始化LCD、ADC、DMA外设 :
/* USER CODE BEGIN 2 */
LCD_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1, 1);
HAL_ADC_Start_DMA(&hadc2, (uint32_t *)adc2, 1);
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
/* USER CODE END 2 */
持续运行LCD_Dispaly函数:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
LCD_Display();
}
/* USER CODE END 3 */
4.编译、烧录
5.现象
旋转R37、R38电位器,LCD屏幕相应的电压值将会发生变化:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)