IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> # 软件stm32cubeIDE下使用STM32F103的ADC+DMA测量-基础样例 -> 正文阅读

[嵌入式]# 软件stm32cubeIDE下使用STM32F103的ADC+DMA测量-基础样例

(1)叙述

这两天在调试ADC,网上关于这方面的资料已经非常多了,查看很多资料后,还是想自己写一篇,用以记录和复查,本篇希望以“从原理-到实验步骤”的方式,尽量全面说明做的本次实验。

(2)ADC原理已经实现原理

(1)ADC是什么

一句话总结:“模拟量”转换成“数字量”。
讲个笑话,这可不是联盟里的ADC.
举个例子,目前来说,真实世界里有很多东西都是“模糊”的模拟量,当我们想采集电压的时候,发现设备都是数字的,可以说模拟量的分辨率是”接近无限“或者就是“无限的”。那么如下图,只能用一个比较接近的数值来表示,如下图,想知道T0时刻具体值,看它更接近左右哪个方格,取个近似值。

在这里插入图片描述

另外关于ADC介绍,也可以参考以下文档。
链接文档:https://blog.csdn.net/xtmtm/article/details/107708053?spm=1001.2014.3001.5502

(2)STM32实现ADC原理

关于STM32实现原理,要看看32的手册相关寄存器和系统时钟,具体可以看看以下文档,觉得也说的挺好了。
链接文档:https://blog.csdn.net/DDGGG1/article/details/123530094

(3)参考实现文档

查了很多文章,如果在STM32cubeIDE下,操作其实都大同小异,本人也是参照以下文档弄的,
其实如果你只是想用STM32的ADC话,更多时候,不要太关心寄存器,HAL库人家都给你写好了,只要配置没问题,就可以使用,所以本片更多简绍具体配置。
参照文档:https://blog.csdn.net/weixin_45488643/article/details/108164547

(4)测试环境

  • 软件环境:STM32cubeIDE 1.8.0
  • 硬件环境:野火-指南者STM32F103VET6
  • 硬件配件:j-link,串口转换器,PC
    硬件拍照

在这里插入图片描述

(5)实现实验说明

本次使用F103,使用ADC+DMA方式,并且使用uart3串口进行打印输出,测量电压为0~3.3V.使用ADC1的IN1,IN2,IN3,也就是PA1,PA2和PA3三个引脚进行测量。

(6)实验操作步骤

(1)查下ADC引脚
在使用ADC之前,还是要知道ADC连接哪个引脚的,如下图所示,是F103的ADC连接情况,具体型号请根据单片机手册来。
请添加图片描述
(2)软件配如下

  1. 基础配置-下载
    建完工程后,基础配置。
    在这里插入图片描述

  2. 基础配置-调试
    建完工程后,基础配置。
    在这里插入图片描述

  3. 输出配置-uart3配置
    建完工程后,建议先单独测试下uart3,否则要是uart3不打印东西,还是挺摸不着头脑的。
    >>中断设置在这里插入图片描述

>>DMA设置
在这里插入图片描述
>>波特率设置
在这里插入图片描述

  1. ADC配置-注意细节
    >>通道选择
    在这里插入图片描述
    >>通道配置
    在这里插入图片描述

>>DMA设置
在这里插入图片描述

  1. 时钟配置-ADC单独配置-配置完成后就可以保存生成代码了。
    在这里插入图片描述
    (3)增加代码测试-printf重定向–主要目的打印浮点数(float)
    这块开始使用printf重定向来着,结果没成功,直接将整个工程弄出来,结果不知道问题再那里,关于这点,最好单独测试下printf,确保串口能输出还是挺重要的,具体可以看我写的这篇文章。

//>>第一步:添加库
#include "string.h"
#include "stdint.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */
//>>第二步:定义数组
uint8_t u_buf[64];

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//>>第三步:定义输出函数printf
#define printf(...)  HAL_UART_Transmit_DMA((UART_HandleTypeDef * )&huart3, (uint8_t *)u_buf,\
											sprintf((char *)u_buf,__VA_ARGS__));
/* USER CODE END PTD */

//>>第四步:打印输出
	  	  printf("abscdasdf");
		  HAL_Delay(1000);

文章连接:https://waka-can.blog.csdn.net/article/details/124452661?spm=1001.2014.3001.5502
(4)增加代码测试-打印3个通道的值


uint16_t abc_buf[3];
//>>第三步:ADC初始化
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)abc_buf, (uint32_t)3);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
//ADC+非DMA传输
//	  HAL_ADC_Start(&hadc1);
//		  HAL_ADC_PollForConversion(&hadc1, 50);
//		  AD_Value = HAL_ADC_GetValue(&hadc1);
//	  sprintf(str,"value:%d",AD_Value);
//	  HAL_UART_Transmit_DMA(&huart3, (uint8_t *)str, 10);



//>>第四步:float打印输出
	  	  printf("ADC0=%d\r\n",abc_buf[0]);
	  	HAL_Delay(100);
	  	  printf("voltage0:%f\r\n",(float)abc_buf[0]/4096*3.3);
		  HAL_Delay(1000);

	  	  printf("ADC1=%d\r\n",abc_buf[1]);
	  	HAL_Delay(100);
	  	  printf("voltage1:%f\r\n",(float)abc_buf[1]/4096*3.3);
		  HAL_Delay(1000);

	  	  printf("ADC2=%d\r\n",abc_buf[2]);
	  	HAL_Delay(100);
	  	  printf("voltage2:%f\r\n",(float)abc_buf[2]/4096*3.3);
		  HAL_Delay(1000);
  }

(7)链接样例代码

代码连接:https://download.csdn.net/download/qq_22146161/85236728

(8)细节-踩坑细节

(1)ADC通道不对,导致无法读出正确数据。
在调试的时候,发现通道3也就是PA3读的一直不对,并且和PA1一样。其实是通道配置不对。
在这里插入图片描述
(2)定义数组时,有些文章说要配置一个长数组,因为在扫描模式下,是一个值一个值往里放的,最好测几路,开个相同数组,注意匹配问题。
在这里插入图片描述
(2)刻度值
因为STM32F103上的ADC是12位的,所以最大是4095,如下

0~~~~3.3V
0~~~~4095

那么每一个数,也就是最小刻度值是0.0008V左右
在这里插入图片描述

(9)后期验证

在这里插入图片描述

(10)实际应用模型

在实际应该中,不可能说让你简单测个电压,本片只是介绍基础测试ADC的一些记录样例。

另外就是想说的是实际可能不止测量0~3.3V,可以通过运放电路,可以测量不在范围内的电路。

以下为,一个应该用模型,在调试的时候最好有以下几个电路,一个是要测的电压,一个是单片机,一个是基础电压和能够显示的部分。

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:52:58  更:2022-04-30 08:54:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:47:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码