蓝桥杯嵌入式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屏幕相应的电压值将会发生变化:

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)