STM32F103ZET6_ADC

news2024/12/23 12:54:24

ADC主要特征

         ● 12位分辨率

        ●18个通道 ,16个外部通道 2个内部通道

        ● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断

        ● 单次和连续转换模式        

         ● 从通道0到通道n的自动扫描模式

         ● 自校准

         ● 带内嵌数据一致性的数据对齐

        ● 采样间隔可以按通道分别编程

        ● 规则转换注入转换均有外部触发选项

        ● 间断模式

        ● 双重模式(带2个或以上ADC的器件)

        ● ADC转换时间:

                 ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

                ─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs)

                ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs

                ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

        ● ADC供电要求:2.4V到3.6V

        ● ADC输入范围:VREF- ≤ VIN ≤ VREF+

         ● 规则通道转换期间有DMA请求产生。

程序内部的运行步骤:

  1. 配置ADC时钟:通过RCC(Reset and Clock Control)来使能ADC时钟。

  2. 配置ADC引脚:配置模拟引脚为模拟输入模式。

  3. 配置ADC模式:选择单次转换模式或连续转换模式,是否启用扫描模式等。

  4. 配置触发源:如果需要的话,配置ADC的触发源。

  5. 配置采样时间:根据输入阻抗来配置ADC通道的采样时间。

  6. 启动ADC校准:如果需要的话,进行ADC校准。

  7. 启动ADC:配置好ADC后,启动ADC以开始转换。

  8. 读取转换结果:在转换完成后,读取规则通道或注入通道的转换结果。

 

ADC模块的框图 

输入通道与引脚的关系

转换模式

       1开启一次运行一次运行完后产生信号,关闭ADC,

2开启一次会一直转换下去

3开启一次,逐次转换一个ADC设置的通道,每个通道产生的值放入寄存器(规则主只有一个寄存器所以数据会被覆盖,可以用DMA快速转移数据),最后关闭ADC

4与上一个不同之处是开启之后不会停止,会一直转换下去

数据对其

STM32CudeMX设置

(只有ADC配置,其它配置自行查阅资料//如USART或显示屏)

1配置时钟

将时钟设置外部输入

注意ADC最大输入为14MHz

2选择ADC在选择通道,通道对应的引脚请看上面的图片

3ADC的设置

1

2

3

4

5

我没修改,可根据情况修改

HAL有哪些函数(配置完后使用的)

  1. HAL_ADC_Start() 或 HAL_ADC_Start_IT() 或 HAL_ADC_Start_DMA()

    • HAL_ADC_Start():启动ADC转换,但不启用中断或DMA。
    • HAL_ADC_Start_IT():启动ADC转换,并启用中断。当转换完成时,会调用中断处理函数。
    • HAL_ADC_Start_DMA():启动ADC转换,并使用DMA来传输转换结果。这适用于需要连续获取大量数据的情况。
    • HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
      HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
      HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
      
      
      hadc:这是一个指向ADC_HandleTypeDef结构的指针,这个结构包含了ADC的配置信息,如ADC句柄、配置选项、状态等。这个结构必须在调用这个函数之前初始化。
      
      pData:这是一个指向数据缓冲区的指针,这个缓冲区用于存储ADC转换的结果。DMA会自动将ADC转换的结果传输到这个缓冲区中。缓冲区的大小应该足够存储所有转换结果。
      
      Length:这是一个无符号整数,表示要传输的数据长度,即ADC转换的次数。这个值应该与数据缓冲区的大小相匹配,以确保所有转换结果都能被存储。
      
      
      返回值
      
      HAL_OK:函数执行成功。
      HAL_ERROR:函数执行失败。
      HAL_BUSY:ADC已经在忙于其他操作,无法启动DMA。
      HAL_TIMEOUT:在函数执行期间发生了超时。

  2. HAL_ADC_PollForConversion()

    • 如果没有使用中断或DMA(可以使用DMA中断判断DMA是否传输完,也可以判断其寄存器),可以使用这个函数来轮询ADC转换是否完成。
    • HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
      
      
      hadc:这是一个指向 ADC_HandleTypeDef 结构的指针,这个结构包含了 ADC 的配置信息。
      Timeout:这是一个无符号整数,用于指定轮询的超时时间(以毫秒为单位)
      
      返回值
      HAL_OK:转换已经完成。
      HAL_ERROR:发生了错误。
      HAL_BUSY:ADC 正在忙于转换。
      HAL_TIMEOUT:在超时时间内转换没有完成。

  3. HAL_ADC_GetValue()

    • 当转换完成后,使用这个函数来获取ADC的转换结果。这个函数会返回最近一次转换的值。
    • uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
      

  4. HAL_ADC_Stop()

    • 当不再需要ADC转换时,调用这个函数来停止ADC。
    • HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
      
      
      返回值
      
      
      HAL_OK:ADC 停止成功。
      HAL_ERROR:发生了错误。

如果你使用了中断(HAL_ADC_Start_IT()),则在中断服务函数(ISR)中调用 HAL_ADC_IRQHandler() 来处理ADC中断。在中断处理函数中,HAL库会自动调用 HAL_ADC_ConvCpltCallback()(如果定义了的话),你可以在其中读取ADC的值。

如果你使用了DMA(HAL_ADC_Start_DMA()),则不需要手动获取转换结果,因为DMA会自动将转换结果传输到指定的内存缓冲区中。当DMA传输完成时,可以调用 HAL_ADC_ConvCpltCallback() 来处理转换完成的事件。

注意

在使用STM32的HAL库进行ADC操作时,如果你设置了ADC为连续转换模式(ADC_CONTINUOUS_MODE),ADC会在开始转换后自动连续进行多次转换,直到你停止它。如果你希望在每次需要采样时手动控制ADC的启动和停止,你可以将ADC配置为单次转换模式(ADC_SINGLE_CONV_MODE)。

在单次转换模式下,每次想要进行ADC转换时,都需要手动调用HAL_ADC_Start()来启动转换。转换完成后,可以调用HAL_ADC_PollForConversion()来检查转换是否完成,并使用HAL_ADC_GetValue()来获取转换结果。完成后,可以调用HAL_ADC_Stop()来停止ADC,或者在获取结果后直接再次调用HAL_ADC_Start()来启动下一次转换。

如果你使用的是连续转换模式,并且在某些情况下需要暂时停止ADC(例如,为了节省电源或者在不需要采样时),那么确实需要调用HAL_ADC_Stop()来停止ADC。当你再次需要采样时,可以调用HAL_ADC_Start()来重新启动ADC。

总之,是否每次都要开启ADC取决于你的转换模式和应用程序的需求。如果你使用的是单次转换模式,或者在连续转换模式下需要控制ADC的启停,那么是的,你需要在每次需要采样时手动开启ADC。

ADC返回的计算结果如何计算

由于其精度为12 位   即最大返回的值为4095  (2的12次方减1)(二进制为12个1)

输入的标准电压为3.3V

值=(检测值/4095)*输入的标准电压 

程序实例

思路

1配置串口和ADC

2采集数据

3数符转换

4发送数据

main函数

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	uint8_t zi_fu []={"电压为:"};					//字符
	char ADC_char_zhi[4];									//转换后的字符
	float ADC_zhi=0.1;											//ADC保存的位置
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_ADC_Start(&hadc1);																														//开启ADC
		
		if(HAL_ADC_PollForConversion(&hadc1,50)==HAL_OK){																	//判断是否转换完成
				ADC_zhi=((float)(HAL_ADC_GetValue(&hadc1)/4095.0)*3.3);																	//计算电压
				//((float)HAL_ADC_GetValue(&hadc1)/4095.0)*3.3;
		/**************************************************************/
		//将浮点数转换成字符
		//参数1:为保存的数组名  参数2:要转换的数字符号  参数3:要转换的值
		/**************************************************************/
		sprintf(ADC_char_zhi,"%.1f",ADC_zhi);																							//将浮点数转换成字符
		HAL_UART_Transmit(&huart1,zi_fu,sizeof(zi_fu)-1,20);															//输出文字
		HAL_UART_Transmit(&huart1,(uint8_t*)ADC_char_zhi,sizeof(ADC_char_zhi)-1,20);			//输出检测值
		}
		
		HAL_Delay(300);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

main.文件全代码

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	uint8_t zi_fu []={"电压为:"};					//字符
	char ADC_char_zhi[4];									//转换后的字符
	float ADC_zhi=0.1;											//ADC保存的位置
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_ADC_Start(&hadc1);																														//开启ADC
		
		if(HAL_ADC_PollForConversion(&hadc1,50)==HAL_OK){																	//判断是否转换完成
				ADC_zhi=((float)(HAL_ADC_GetValue(&hadc1)/4095.0)*3.3);																	//计算电压
				//((float)HAL_ADC_GetValue(&hadc1)/4095.0)*3.3;
		/**************************************************************/
		//将浮点数转换成字符
		//参数1:为保存的数组名  参数2:要转换的数字符号  参数3:要转换的值
		/**************************************************************/
		sprintf(ADC_char_zhi,"%.1f",ADC_zhi);																							//将浮点数转换成字符
		HAL_UART_Transmit(&huart1,zi_fu,sizeof(zi_fu)-1,20);															//输出文字
		HAL_UART_Transmit(&huart1,(uint8_t*)ADC_char_zhi,sizeof(ADC_char_zhi)-1,20);			//输出检测值
		}
		
		HAL_Delay(300);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

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

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

相关文章

【唯美情侣爱情表白纪念HTML单页】

唯美情侣爱情表白纪念HTML单页 效果图部分代码领取代码下期更新预报 效果图 整图 背景图 部分代码 index.html <!DOCTYPE html> <html lang"en"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"…

开发板通过网线连接电脑而上网

简介 关闭win11的防火墙&#xff08;之前不关也可以的&#xff0c;很奇怪&#xff09; 一句话&#xff1a;&#xff01;&#xff01;&#xff01;dhcp能自动分配IP即可联通外网&#xff01;&#xff01;&#xff01; 原理也不懂&#xff0c;或许有其他方法也不清楚&#xff0c…

【简单介绍下机器学习之sklearn基础】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

详解QColor的使用

Qt中的QColor类是用来处理颜色的对象&#xff0c;它在Qt GUI编程中有着广泛的应用&#xff0c;比如设置控件的颜色、绘制图形的颜色等等。下面将详细介绍QColor的基本使用方法、一些实用技巧以及需要注意的事项&#xff0c;并给出C代码示例。 基本使用 创建QColor对象 构造默…

枚举(enum)/共用体(union)/结构体(struct)---详解

前言 C语言包含内置类型和自定义类型。 其实C语言中有内置类型&#xff0c;包含&#xff1a;char,short,int,long,long long,float,double,long double ,这些是C语言本身支持的现成的类型。 但仅仅只有内置类型是远远不够的&#xff0c;在描述一个复杂对象是无法使用内置类型来…

RealSenseSR300工程环境配置说明

新建目录结构如下&#xff1a; output:存储可执行文件.exe等src:存储源码.cpp .h等3rdparty:存储第三方库 opencv等 其中将源码按照main及其相关文件分为以下三类 vs2015许可证到期后先激活&#xff0c;激活码很多网上有&#xff0c;如&#xff1a;HMGNV-WCYXV-X7G9W-YCX63…

多目标粒子群算法及其MATLAB实现

多目标粒子群优化&#xff08;Multi-Objective Particle Swarm Optimization, MOPSO&#xff09;算法是一种基于种群的优化算法&#xff0c;它结合了粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;和多目标优化的思想。多目标粒子群&#xff08;MOPSO&am…

Python小功能实现(链接下载图品并存储到EXCEL中)

import os import requests from openpyxl import Workbook from openpyxl.drawing.image import Image from concurrent.futures import ThreadPoolExecutor# 图片链接列表 image_urls ["https://uploads/file/20230205/f85Lpcv8PXrLAdmNUDE1Hh6xqkp0NHi2gSXeqyOb.png&q…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-UNIX时间戳

UNIX时间戳 UNIX时间戳最早是在UNIX系统使用的&#xff0c;所以叫做UNIX时间戳&#xff0c;之后很多由UNIX演变而来的系统也继承了UNIX时间戳的规定&#xff0c;目前linux&#xff0c;windows&#xff0c;安卓这些操作系统的底层计时系统都是用UNIX时间戳 时间戳这个计时系统和…

C++ Qt QMainWindow实现无边框窗口自定义标题栏可拖拽移动拉伸改变窗口大小

本篇博客介绍C Qt QMainWindow实现无边框窗口&#xff0c;适用于win10/win11系统。 QMainWindow相对于QWidget多了dockedwidget功能&#xff0c;跟多人可能更喜欢用QMainWindow做主窗口&#xff0c;如果不需要dockedwidget功能&#xff0c;QMainWindow与QWidget做主窗口基本无…

Spring - 4 ( 11000 字 Spring 入门级教程 )

一&#xff1a;Spring IoC&DI 在前⾯的章节中, 我们学习了 Spring Boot 和 Spring MVC 的开发, 可以完成⼀些基本功能的开发了, 但是什么是 Spring 呢? Spring, Spring Boot 和 SpringMVC 又有什么关系呢? 咱们还是带着问题去学习.我们先看什么是Spring 1.1 Spring 是什…

万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计

文章目录 前言&#xff1a;1、ARP协议详解2、ARP工作机制 二、ARP_RX模块设计三、ARP_TX模块设计四、ARP_table模块5、仿真5.1、发送端5.2、接收端5.3、缓存表 总结 前言&#xff1a; 1、ARP协议详解 ARP数据格式&#xff1a; 硬件类型:表示硬件地址的类型。它的值为1表示以太…

微信小程序使用echarts组件实现饼状统计图功能

微信小程序使用echarts组件实现饼状统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;具体的实现步骤思路可进我主页查看我的另一篇博文https://blog.csdn.net/weixin_45465881/article/details/138171153进行查看&#xff0c;本篇文章主要使用echarts组件实…

javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 目录 3.JUC(java.util.concurrent)常见的类3.1Callable接口3.2 RentrantLoc…

Yolov5 v7.0目标检测——详细记录环境配置、自定义数据处理、模型训练与常用错误解决方法(数据集为河道漂浮物)

1. Yolov5 YOLOv5是是YOLO系列的一个延伸&#xff0c;其网络结构共分为&#xff1a;input、backbone、neck和head四个模块&#xff0c;yolov5对yolov4网络的四个部分都进行了修改&#xff0c;并取得了较大的提升&#xff0c;在input端使用了Mosaic数据增强、自适应锚框计算、自…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

牛客NC98 判断t1树中是否有与t2树完全相同的子树【simple 深度优先dfs C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4eaccec5ee8f4fe8a4309463b807a542 思路 深度优先搜索暴力匹配 思路和算法这是一种最朴素的方法——深度优先搜索枚举 s 中的每一个节点&#xff0c;判断这个点的子树是否和 t 相等。如何判断一个节点的子树是否…

HTTP/1.1,HTTP/2.0和HTTP/3.0 各版本协议的详解(2024-04-24)

1、HTTP介绍 HTTP 协议有多个版本&#xff0c;目前广泛使用的是 HTTP/1.1 和 HTTP/2&#xff0c;以及正在逐步推广的 HTTP/3。 HTTP/1.1&#xff1a;支持持久连接&#xff0c;允许多个请求/响应通过同一个 TCP 连接传输&#xff0c;减少了建立和关闭连接的消耗。 HTTP/2&#…

基于STM32和阿里云的智能台灯(STM32+ESP8266+MQTT+阿里云+语音模块)

一、主要完成功能 1、冷光模式和暖光模式两种灯光 主要支持冷光和暖光模式两种&#xff0c;可以通过语音模块或手机app远程切换冷暖光 2、自动模式和手动模式 主要支持手动模式和自动两种模式&#xff08;app或语音助手切换&#xff09; (1)自动模式&#xff1a;根据环境光照…

vscode 使用文件模板功能来添加版权信息

vscode 新建文件的时候&#xff0c;自动填充作者及版权信息 无需使用插件&#xff0c;操作如下&#xff1a; 选择 “首选项(Preferences)”。在搜索框中输入 “file template” 或者 “文件模板”&#xff0c;然后选择相关的设置项。 {"C_Cpp.clang_format_fallbackSt…