当前位置: 首页 > article >正文

STM32 ADC 读取模拟量

问题

我有一个调速开关,模拟量输入,因此需要使用 STM32 读取模拟量,并通过串口输入来调试。串口相关知识参考 STM32 串口输出调试信息。

硬件信息:

  • CubeMX version 6.12.1
  • Keil uVision V5.41.0.0

参考知识

  • 【STM32】HAL库 STM32CubeMX教程九—ADC[通俗易懂]
  • STM32CubeIDE的ADC经验分享
  • STM32CubeMX学习笔记(4)–ADC模数转换器应用
  • STM32CubeMX学习笔记(8)——ADC接口使用

参考上面链接,弄懂下面列出的问题。

基础知识

  1. 什么是 ADC
  2. STM32 ADC 介绍
  3. ADC 单通道 与 多通道,单路 ADC 与多路 ADC。
  4. ADC 数据的最对齐和右对齐
  5. ADC 注入通道 与 规则通道
  6. ADC 时钟, = APB2 / Prescale, 最高 14MHz, ADC 的 parameter setting 中设置 Prescale。
  7. 多个通道,读取顺序是什么,rank 设置

数据读取

  1. 软件触发,使用函数直接读取
  2. 开启 ADC 中断回调函数,在其中使用函数读取数据。相当于把上一步代码搬到中断函数中。
  3. 轮询或者扫描模式
  4. 使用 Timer 触发定时读取 ADC,参考链接。

注意

There is no hardware ADC calibration for our STM32F4, it is self-calibrated upon reset and once ADC is activated. 来源于:There are no instructions for calibrating ADC in STM32F407。

示例程序

一个模拟量输入

参考:STM32CUBEMX的adc读取 stm32 adc hal。

CubeMX 配置

在这里插入图片描述

程序

  • 串口中使用了部分字符串处理函数, 在 main.c 添加
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include <string.h>
/* USER CODE END Includes */
  • main.c 中定义变量存储 ADC 转换结果。int main 函数中间定义,
  /* USER CODE BEGIN Init */
	uint16_t adc_value;
  /* USER CODE END Init */
  • while 循环中读取 模拟量引脚。前三行是读取数据,后面是处理数据,输出到串口。
/* USER CODE BEGIN 3 */
		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1,50);
		adc_value = HAL_ADC_GetValue(&hadc1);
		
		char str1[5];
		sprintf(str1, "%d", adc_value);
		HAL_UART_Transmit(&huart1,str1,sizeof(str1),10);// Sending in normal mode
		HAL_Delay(3000);
  }
  /* USER CODE END 3 */

多个模拟量输入

参考:STM32CUBEMX的adc读取 stm32 adc hal。

CubeMX

在这里插入图片描述

编程

  • 串口中使用了部分字符串处理函数, 在 main.c 添加
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include <string.h>
/* USER CODE END Includes */
  • main.c 中定义变量存储 ADC 转换结果。int main 函数中间定义 数组 按顺序存储 ADC 引脚数据。
/* USER CODE BEGIN PV */
uint16_t adc_value[2];
/* USER CODE END PV */
  • while 循环中读取 模拟量引脚。前三行是读取数据,后面是处理数据,输出到串口。
    /* USER CODE BEGIN 3 */
		for(int i=0; i<2; i++)
		{
			HAL_ADC_Start(&hadc1);
			HAL_ADC_PollForConversion(&hadc1, 1);
			adc_value[i] = HAL_ADC_GetValue(&hadc1);
		}

		char tmp[5];
		sprintf(tmp, "%d", adc_value[0]);
		char str1[50] = "Knob: ";
		strcat(str1, tmp);
		char str2[50] = "---Driving wheel: ";
		sprintf(tmp, "%d", adc_value[1]);
		strcat(str2, tmp);
		strcat(str1, str2);
		HAL_UART_Transmit(&huart1,str1,sizeof(str1),10);// Sending in normal mode

		HAL_Delay(1000);
  }
  /* USER CODE END 3 */

http://www.kler.cn/a/405787.html

相关文章:

  • 游戏引擎学习第20天
  • Vue 3 自定义插件开发
  • 跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用
  • 【前端知识】nodejs项目配置package.json深入解读
  • Django一分钟:django中收集关联对象关联数据的方法
  • amd显卡和nVidia显卡哪个好 amd和英伟达的区别介绍
  • GitLab|数据迁移
  • DICOM图像处理:深入解析DICOM彩色图像中的Planar配置及其对像素数据解析处理的实现
  • [linux]linux c实现mac地址写入文件,实现删除和增加操作
  • windows下sqlplus连接到linux oracle不成功
  • dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
  • 【论文阅读】Poison Forensics: Traceback of Data Poisoning Attacks in Neural Networks
  • 【大模型-智能体】AutoGen Studio测试和导出工作流程
  • C++:设计模式-单例模式
  • 如何优化Sql的查询性能?
  • 实景三维赋能国土空间智慧治理
  • Python爬虫中的IP封禁问题及其解决方案
  • Chrome 浏览器 131 版本新特性
  • WebLogic 版本升级的注意事项与流程
  • STM32 RAM在Memory Map中被分为3个区域
  • Vscode/Code-server无网环境安装通义灵码
  • Jenkins修改LOGO
  • 【大数据测试Flume:从 0-1详细教程】
  • Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
  • 基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码
  • 使用Electron将vue2项目打包为桌面exe安装包