首页 > 其他分享 >【蓝桥杯嵌入式】四、各种外设驱动(十一)ADC(1):软件触发与中断触发方式

【蓝桥杯嵌入式】四、各种外设驱动(十一)ADC(1):软件触发与中断触发方式

时间:2024-03-23 09:03:26浏览次数:19  
标签:触发 HAL 函数 中断 蓝桥 Volt ADC

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录

【蓝桥杯嵌入式】附录

目录

重点提炼:

一、需求分析

1、需要的外设资源分析:

 2、外设具体分析:

比赛时ADC可能需要配置的部分:

二、软件配置

按照分析配置外设:

ADC2_IN15:采用软件触发的方式

 ADC1_IN11:采用TIM6触发的方式

三、程序功能实现

用到的函数:

程序流程:

在MDK中编写代码:

找到ADC的中断回调函数:

四、运行测试


重点提炼:

转换结果电压计算公式:

实际电压值(mV)=ADC读取值*VREF+(mV)/2^(转换精度)

VREF+是ADC转换的正参考电压,开发板上理论是3300mV;转换精度可以在CubeMX中设置;

在代码中描述如下:

uint32_t Volt=3300*HAL_ADC_GetValue(&hadc2);
Volt = Volt>>12;

 用到的函数:

一、需求分析

        开发板上有两个电压采集R37和R38,如图:

查看原理图可知,R37连接PB15,R38连接PB12.而使用CubeMX可以查到:PB15是ADC2的通道15,PB12是ADC1的通道11。

        设计一个示例,使用ADC的软件触发功能和中断触发功能。其中,中断触发包括外部中断触发和定时器中断触发,这里使用定时器触发。使用软件触发的方式检测R37的电压,中断触发方式检测R38的电压。

1、需要的外设资源分析:

  • ADC1_IN11——PB12——R38(电压采集2)
  • ADC2_IN15——PB15——R37(电压采集1)
  • LCD
  • TIM6

 2、外设具体分析:

查看原理图,和手册:

与LCD的相关的部分请参考附录。

比赛时ADC可能需要配置的部分:
  • ADC Mode:选择需要的通道,选择single_ended
  • ADCs_Common_Settings独立模式或多个ADC合作的模式(下一篇文章会用)
    • DMA Access Mode(DMA接入方式)
    • Delay between 2 sampling phases(2个采样相位之间的间隔)
  • Resolution:转换精度
  • DMA Continuous Requests:是否连续产生DMA请求(下一篇文章会用)
  • External Trigger Conversion Source:中断触发方式
  • External Trigger Conversion Edge:外部触发时使用的信号沿
  • Rank里的Sampling Time:采样时间,不设置也行,建议比赛时为提高准确性设置为640.5。

二、软件配置

参考附录的内容,建立名为“ADC_SofwareAndTimTrigger_Demo”的项目。

按照分析配置外设:

ADC2_IN15:采用软件触发的方式

软件触发方式很简单,打开ADC2_IN15即可,可以保持默认设置,也可以设置一下Rank里的Sampling Time为640.5。

 ADC1_IN11:采用TIM6触发的方式

开启ADC全局中断,ADC1和ADC2 的中断号是同一个,所以需要用到中断回调函数来判断是哪个ADC引起的中断。

TIM6:

按照附录中内容将TIM6设置为500ms一次触发Trigger Event Selection中断设置为Update Event。

无需开启TIM6的中断。

生成项目文件后,打开MDK;

导入LCD驱动程序文件。

三、程序功能实现

用到的函数:

中断回调函数:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc);

 ADC功能函数:

HAL_ADC_Start_IT(&hadc1);//以中断方式启动ADC
HAL_ADC_Start(&hadc2);//以软件方式启动ADC
HAL_ADC_PollForConversion(&hadc2,200);//查看ADC的转换是否完成
HAL_ADC_GetValue(&hadc2);//读取ADC转换后的结果并返回

程序流程:

  1. 在初始化HAL库后初始化LCD,之前实验发现中断可能会影响LCD初始化。
  2. 在main函数的while中每次以软件方式启动ADC2,计算并显示电压值。
  3. 以中断模式启动ADC1,启动定时器TIM6。
  4. 重新实现ADC中断回调函数,计算并显示电压值。

在MDK中编写代码:

 在main.h中 

/* USER CODE BEGIN Includes */
#include "lcd.h"
#include <stdio.h>
/* USER CODE END Includes */

 初始化HAL库后初始化LCD:

main.c 的 /* USER CODE BEGIN WHILE */ 代码段,编写以下代码

   /* USER CODE BEGIN WHILE */
	HAL_ADC_Start_IT(&hadc1);
	HAL_TIM_Base_Start(&htim6);
  while (1)
  {
		HAL_ADC_Start(&hadc2);
		if(HAL_ADC_PollForConversion(&hadc2,200)==HAL_OK)
		{
			uint32_t Volt=3300*HAL_ADC_GetValue(&hadc2);
			Volt = Volt>>12;
			char str[20];
			sprintf(str,"R37 Volt = %d",Volt);
			LCD_DisplayStringLine(Line3,str);
		}
		HAL_Delay(500);
    /* USER CODE END WHILE */
找到ADC的中断回调函数:

(详细步骤请查看附录NVIC部分)

stm32g4xx_it.c 中找到ADC的中断服务函数:

右键函数,点击 GoTo Definition,然后在跳转到的文件中使用

Find模式搜索"HAL_ADC_Con",找到带"__weak"的弱函数定义如图:

复制此函数到stm32g4xx_it.c的最下面的代码段中:

在代码段编写程序:注意这里是HAL_ADC_GetValue(hadc);

/* USER CODE BEGIN 1 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	if(hadc->Instance == ADC1)
	{
		uint32_t Volt=3300*HAL_ADC_GetValue(hadc);
		Volt = Volt>>12;
		char str[20];
		sprintf(str,"R38 Volt = %d",Volt);
		LCD_DisplayStringLine(Line5,str);
	}
}
/* USER CODE END 1 */

四、运行测试

编译、下载(见附录)。

运行结果如下:

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="o7yl9orr-1711083989658" src="https://live.csdn.net/v/embed/372929"></iframe>

ADC_SofwareAndTimTrigger_Demo

标签:触发,HAL,函数,中断,蓝桥,Volt,ADC
From: https://blog.csdn.net/lyh13239510484/article/details/136928534

相关文章

  • 扫雷(蓝桥杯,acwing)
    题目描述:扫雷是一种计算机游戏,在 2020 世纪 80 年代开始流行,并且仍然包含在某些版本的MicrosoftWindows操作系统中。在这个问题中,你正在一个矩形网格上玩扫雷游戏。最初网格内的所有单元格都呈未打开状态。其中 M个不同的单元格中隐藏着 M 个地雷。其他单元格内......
  • 全球变暖(蓝桥杯,acwing每日一题)
    题目描述:你有一张某海域 N×N像素的照片,”.”表示海洋、”#”表示陆地,如下所示:........##.....##........##...####....###........其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 22 座岛屿。由于全球变暖导致了海面上升,科学家预测未......
  • 蓝桥杯单片机快速开发笔记——利用定时器计数器设置定时器
    一、基本原理        参考本栏http://t.csdnimg.cn/iPHN0二、具体步骤三、主要事项    如果使用中断功能记得打开总中断EA四、示例代码voidTimer0_Isr(void)interrupt1{}voidTimer0_Init(void) //10毫秒@12.000MHz{ AUXR&=0x7F; //定时......
  • 蓝桥杯2015省B——生命之树
     蓝桥杯官网 洛谷[蓝桥杯2015省B]生命之树题目描述在X森林里,上帝创建了生命之树。他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。上帝要在这棵树内选出一个非空节点集 S(这里洛谷和蓝桥杯官网的不一样),使得对于S 中的任意两个点......
  • 蓝桥杯 python
    目录一、遍历列表1.使用for循环和enumerate()函数实现2.案例代码二、对列表进行统计和计算1.统计数值列表的元素和2.案例代码三、对列表进行排序1.使用列表对象的sort()方法2.使用内置的sorted()函数实现四、列表推导式1.从列表中选择符合条件的元素组成新的列表......
  • 蓝桥杯Java ABC组 AcWing P1020 潜水员
    题目链接:https://www.acwing.com/problem/content/1022/#二维背包#Model#Favorite思路好题!可以让你思考各种背包问题中,对体积的定义不同,则初始化就不同本题求的是是至少需要体积VV......
  • 备战蓝桥杯Day28 - 贪心算法
    一、贪心算法贪心算法(GreedyAlgorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效。最优子结构指的是问题的最优解可以由子问题的最优解有效地构造出来。贪心算法与动......
  • 第十四届蓝桥杯大赛软件赛省赛Python 《三国游戏》
    问题描述问题类型排序,贪心算法。问题分析当第i个事件发生时会分别让X,Y,Z增加Ai,Bi,Ci即当某个事件发生时,三国各增加士兵数Ai,Bi,Ci。如果X,Y,Z的其中一个大于另外两个之和,我们认为其获胜。即当n个事件都确定了是否会发生后,存在X,Y,Z中任一大于另外两个之和,则有其中一个国家获......
  • 蓝桥杯-翻转
    """题目来源:https://www.lanqiao.cn/problems/3520/learning/?page=1&first_category_id=1&name=%E7%BF%BB%E8%BD%AC"""importosimportsysimportcopy#请在此输入您的代码n=int(input())#n组测评数据data=[[]foriinrange(n)]for......
  • 蓝桥杯-百亿富翁
    """https://www.lanqiao.cn/problems/1142/learning/"""importosimportsys#请在此输入您的代码n=int(input())a=list(map(int,input().split()))#求右边第一个比其高的楼房编号defright(a,n):#单调栈stack=[]#ans[i]记录右边第一座比......