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

news2024/9/28 13:19:17

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

【蓝桥杯嵌入式】附录

目录

重点提炼:

一、需求分析

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 */

四、运行测试

编译、下载(见附录)。

运行结果如下:

ADC_SofwareAndTimTrigger_Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1538511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十三届蓝桥杯物联网试题(省赛)

做后感悟&#xff1a; OLED显示函数需要一直显示&#xff0c;所以在主函数中要一直循环&#xff0c;为了确保这个检错功能error只输出一次&#xff0c;最好用中断串口进行接收数据&#xff0c;数据收完后自动进入中断函数中&#xff0c;做一次数据检查就好了&#xff0c;该开灯…

十三、MySQL基于GTID的半同步复制

目录 一、MySQL半同步复制 一、三种复制方式比较 1、异步复制 2、同步复制 3、半同步复制 4、半同步复制比较 5、半同步复制的特点 二、搭建半同步复制 1、如果不清楚Plugin的目录&#xff0c;用如下查找&#xff1a; 2、所有数据库服务器&#xff0c;安装半同步插件…

如何使用ospf (enps) 简单实践ospf协议

1. OSPF的基本概念 OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种广泛应用于TCP/IP网络中的内部网关协议&#xff08;Interior Gateway Protocol, IGP&#xff09;&#xff0c;主要用于在同一自治系统&#xff08;Autonomous Sys…

Django的forms组件

divmod(被除数, 除数)传入两个参数之后得到一个元组,元组中的第一个值是商,第二个是余数 forms组件 写一个注册功能,获取用户名和密码,利用form表单提交数据,在后端判断用户名和密码是否符合一定的条件:用户名必须超过3个字,密码最多6位.最后将验证信息返回到前端页面 1.手动…

【Algorithms 4】算法(第4版)学习笔记 21 - 5.2 单词查找树

文章目录 前言参考目录学习笔记0&#xff1a;前置介绍0&#xff1a;前置介绍1&#xff1a;单词查找树 R-way tries1.1&#xff1a;介绍1.2&#xff1a;查找操作1.2.1&#xff1a;成功命中1.2.2&#xff1a;未命中1.3&#xff1a;插入操作1.4&#xff1a;Java 实现1.5&#xff1…

刷题DAY31 | LeetCode 455-分发饼干 376-摆动序列 53-最大子序和

455 分发饼干&#xff08;easy&#xff09; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并…

惠普EliteBook使用VirtualBox安装ISO镜像

实验环境 虚拟机软件&#xff1a;Oracle VM VirtualBox 6.1.16镜像文件&#xff1a;CentOS-7-x86_64-Minimal-2009.iso笔记本&#xff1a;惠普EditBook操作系统&#xff1a;Window10 BIOS开启虚拟化技术 一遍笔记本都不会开启虚拟化技术的&#xff0c;但是在window里使用虚拟…

二叉树|257.二叉树的所有路径

力扣题目链接 class Solution { private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中&#xff0c;中为什么写在这里&#xff0c;因为最后一个节点也要加入到path中 // 这才到了叶子节…

Qt实现TFTP Server和 TFTP Client(一)

1 概述 TFTP协议是基于UDP的简单文件传输协议&#xff0c;协议双方为Client和Server.Client和Server之间通过5种消息来传输文件,消息前两个字节Code是消息类型&#xff0c;消息内容随消息类型不同而不同。传输模式有三种&#xff1a;octet,netascii和mail&#xff0c;octet为二…

nodejs安装使用React

1、react安装 首先&#xff0c;确保电脑上具备nodejs环境&#xff0c;之后用 winr 呼出控制台&#xff0c;输入 cmd 命令弹出cmd控制台&#xff08;小黑框&#xff09;之后在默认路径输入如下代码 npm i -g create-react-app //全局安装react环境无需选择特定文件夹安装成功后…

代码随想录--排序算法

912.排序数组 快速排序 思路&#xff1a; 1. 设置一个pivot2. 将小于nums[pivot]的值 放在左边3. 将 大于nums[pivot]的值 放在 右边4. 递归调用注意&#xff1a;必须先比较nums[high] 与pivot 代码&#xff1a; class Solution {int partition(vector<int>&nu…

论文解读:Frozen Feature Augmentation for Few-Shot Image Classification

文章总结 动机 通过各种图像增强手段和冻结特征(已经训练好的特征)结合起来训练轻量级模型。 最终得到的最佳设置顺序 亮度&#xff0c;对比度FroFA (C)和后置cFroFA (Pc) 这三种连续的数据增强操作(具体这三种数据增强操作是干了什么&#xff0c;得去附录找) 这里三种FroFA…

国内IP地址格式的多样性与规范化

在当今数字化时代&#xff0c;IP地址作为互联网通信的基本要素之一&#xff0c;在网络通信中扮演着至关重要的角色。了解国内IP地址的格式、规范以及不同类型的IP地址对网络通信的影响&#xff0c;对于构建高效稳定的网络环境至关重要。虎观代理小二将深入探讨国内IP地址的格式…

Centos虚拟机忘记密码;重置虚机密码

虚拟机是一个好用的工具&#xff0c;在本地搭建的虚拟机可以给我们提供测试&#xff0c;但时间长了也会忘记密码&#xff1b;因此这里以centos系统的虚机为例&#xff0c;提供一个重置虚机密码的方法 1.在开机页面按“E”进入编辑模式 进入后长这样&#xff1a; 2.找到ro cras…

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱&#xff0c;问题也不少。&#x1f602; 那就有病治…

Tensorflow 2.0 常见函数用法(一)

文章目录 0. 基础用法1. tf.cast2. tf.keras.layers.Dense3. tf.variable_scope4. tf.squeeze5. tf.math.multiply 0. 基础用法 Tensorflow 的用法不定期更新遇到的一些用法&#xff0c;之前已经包含了基础用法参考这里 &#xff0c;具体包含如下图的方法&#xff1a; 本文介…

使用PDFBox调整PDF每页格式

目录 一、内容没有图片 二、内容有图片 maven依赖&#xff0c;这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

vue 消息左右滚动(前后无缝衔接)

演示效果 封装的组件 <!--* Author:* Date: 2024-03-21 19:21:58* LastEditTime: 2024-03-21 20:31:50* LastEditors: Please set LastEditors* Description: 消息左右滚动 --> <template><divid"textScroll"class"text-scroll"mousemove&…

Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)

Quick Start Dubbo&#xff01;用更优雅的方式来实现RPC调用吧 - 掘金 dubbozookeeper demo 项目结构&#xff1a; RpcService 仅仅是提供服务的接口&#xff1a; public interface HelloService {String sayHello(String name); }DubboServer pom&#xff1a; <?xm…