很多蓝桥杯嵌入式选手会在主函数中多次调用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屏幕相应的电压值将会发生变化:

Logo

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

更多推荐