深入STM32的ADC世界:从理论到实践,打造精准数据采集系统

news2024/12/25 10:22:55

摘要: 在嵌入式系统中,模拟信号的采集与处理至关重要。本文将深入浅出地介绍STM32的ADC模块,结合实际项目,详细阐述ADC的工作原理、配置方法以及数据处理技巧,并辅以Mermaid图表和代码示例,助你轻松掌握ADC应用开发。

一、ADC:模拟世界通往数字世界的桥梁

现实世界充斥着各种模拟信号,如温度、压力、声音等,而MCU只能处理数字信号。ADC(Analog-to-Digital Converter,模数转换器)就像一座桥梁,将连续变化的模拟信号转换为离散的数字信号,使MCU能够感知和处理模拟世界的信息。

二、STM32 ADC:功能丰富、性能卓越

STM32系列MCU集成了高性能的ADC模块,具备以下特点:

  • 多通道转换: 支持多达16个外部通道和2个内部通道,可同时采集多个模拟信号。
  • 高分辨率: 提供12位分辨率,能够分辨出细微的电压变化。
  • 多种转换模式: 支持单次转换、连续转换、扫描转换等多种模式,满足不同应用需求。
  • 可编程增益: 可根据输入信号幅度选择不同的增益,提高测量精度。
  • DMA支持: 支持DMA数据传输,减轻CPU负担,提高系统效率。

三、实战项目:基于STM32的温度监测系统

本项目将使用STM32F103C8T6单片机、DS18B20温度传感器和OLED显示屏,搭建一个简单的温度监测系统。

3.1 硬件连接

3.2 软件设计

  1. 初始化ADC:
    • 使能ADC时钟。
    • 设置ADC工作模式、通道、采样时间等参数。
    • 校准ADC。
  2. 读取ADC数据:
    • 启动ADC转换。
    • 等待转换完成。
    • 读取ADC转换结果。
  3. 温度数据转换:
    • 将ADC转换结果转换为实际温度值。
  4. OLED显示:
    • 初始化OLED显示屏。
    • 将温度值显示在OLED屏幕上。

3.3 代码示例

#include "stm32f10x.h"
#include "delay.h"
#include "oled.h"

// DS18B20温度传感器连接的GPIO引脚
#define DS18B20_PORT GPIOA
#define DS18B20_PIN GPIO_Pin_0

// ADC1通道0,对应PA0
#define ADC1_CHANNEL ADC_Channel_0

// 初始化ADC
void Adc_Init(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  // 使能ADC1和GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

  // 配置PA0为模拟输入模式
  GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

  // 配置ADC1参数
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  // 设置ADC1通道0的采样时间
  ADC_RegularChannelConfig(ADC1, ADC1_CHANNEL, 1, ADC_SampleTime_239Cycles5);

  // 校准ADC
  ADC_Cmd(ADC1, ENABLE);
  ADC_ResetCalibration(ADC1);
  while(ADC_GetResetCalibrationStatus(ADC1));
  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));

  // 使能ADC1
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

// 读取ADC数据
uint16_t Adc_Read(void)
{
  // 等待ADC转换完成
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

  // 读取ADC转换结果
  return ADC_GetConversionValue(ADC1);
}

int main(void)
{
  // 初始化系统时钟和外设
  SystemInit();
  Delay_Init();
  OLED_Init();
  Adc_Init();

  while (1)
  {
    // 读取ADC数据
    uint16_t adcValue = Adc_Read();

    // 将ADC转换结果转换为温度值
    // 注意:此处的转换公式仅供参考,实际应用中需要根据传感器特性进行调整
    float temperature = adcValue * (3.3 / 4096) * 100;

    // 在OLED屏幕上显示温度值
    OLED_ShowString(0, 0, "Temperature:");
    OLED_ShowNum(80, 0, temperature, 1, 16);
    OLED_ShowString(104, 0, "C");
    OLED_Refresh_Gram();

    // 延时1秒
    Delay_Ms(1000);
  }
}

四、 总结

本文通过一个简单的温度监测系统,详细介绍了STM32 ADC模块的应用方法。从硬件连接到软件设计,从ADC初始化到数据读取和转换,每一个步骤都进行了详细的说明,并辅以代码示例,方便读者理解和实践。

相关知识点链接:

  • STM32 HAL库 ADC相关API函数: https://www.st.com/resource/en/reference-manual/dm00043574-stm32f10xxx-stm32f10xxx-cortexm3-programming-manual-stmicroelectronics.pdf
  • ADC工作原理: https://en.wikipedia.org/wiki/Analog-to-digital_converter
  • DS18B20温度传感器: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
  • OLED显示屏: China LCD Display Manufacturer for TFT,OLED,e-Paper,Character,Graphic LCD Module

希望本文能够帮助你轻松入门STM32 ADC,并将其应用到自己的项目中!不懂可以私信我!!!

 

 

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

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

相关文章

回流焊常见缺陷

不润湿(Nonwetting)/润湿不良(Poor Wetting) 通常润湿不良是指焊点焊锡合金没有很好的铺展开来,从而无法得到良好的焊点并直接影响到焊点的可靠性。 产生原因: 1. 焊盘或引脚表面的镀层被氧化,氧化层的存在阻挡了焊锡与镀层之间的接触; 2. 镀层厚度不够或是加工不良,很…

arm-linux-gnueabihf-gcc:Command not found 解决办法

问题描述 使用虚拟机交叉编译程序,当使用了sudo去编译, 出现arm-linux-gnueabihf-gcc:Command not found的问题。明明已经安装并配置好环境了,发现还是提示找不到编译器。 原因分析: 特意去查了一下sudo方法,我们在sud…

chunk-vendors.js 优化

问题背景 在 App.vue 加入 web-vitals 性能监控指标并打印 import {onLCP, onINP, onCLS, onTTFB} from web-vitals/attribution;// Measure and log LCP as soon as its available. onLCP(console.log); onINP(console.log); onCLS(console.log); onTTFB(console.log);网页的…

linux开发常用工具和命令

文章目录 服务器文件挂载服务器终端挂载vscode编辑服务器代码linux开发常用命令dulnllobjdump 服务器文件挂载 在本地操作服务器文件。 在文件夹右侧‘其他位置‘’—>‘链接到服务器s’ sftp://usernameip/目录,回车后输入密码即可在左侧看到映射的服务器文件夹…

网络基础-RIP协议

RIP(Routing Information Protocol)是一个基于距离矢量的动态路由协议,常用于小型到中型网络。RIP是较早的路由协议之一,具有简单易用的特点。以下是关于RIP协议的详细介绍: RIP的主要特点 ①使用跳数(ho…

自己分析的逆向案例八——中国新烟商盟登录密码加密

网址:会员登录 - 新商盟 登陆界面分析,找到登录接口,跟栈分析。 没有异步,也没有webpack,很简单的跟栈 打上断点,逐步网上找,找到$ajax老朋友 上面就有对密码加密的部分,是一个RSA加密。 b 被…

认识100种电路之耦合电路

在电子电路的世界中,耦合电路宛如一座精巧的桥梁,连接着各个功能模块,发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中,不同的电路模块往往需要协同工作,以实现特定的功能。然而,这些模…

C++ STL unique_ptr智能指针源码剖析

由于上一篇博客将shared_ptr,weak_ptr,enable_shared_form_this的源码实现整理了一遍,想着cpp智能指针还差个unique_ptr故写下此篇博客,以供学习 源码剖析 一,模板参数 首先,我们先看unique_ptr的模板参数,第一个参数_TP自是不用说表示对象类型,第二个模板参数定义了unique_p…

新书速览|Adobe Firefly:萤火虫:AI绘画快速创意设计

《Adobe Firefly:萤火虫:AI绘画快速创意设计》 本书内容 人工智能(Artificial Intelligence,AI)浪潮的席卷已经变成不可阻挡的趋势,伴随着这种变化,在图形设计、图像制作、绘画领域也相应发生了…

程序员鱼皮的写简历指南(保姆级)1、基本写法

大家好,我是程序员鱼皮。做知识分享这些年来,我看过太多简历、也帮忙修改过很多的简历,发现很多同学是完全不会写简历的、会犯很多常见的问题,不能把自己的优势充分展示出来,导致错失了很多面试机会,实在是…

一篇搞懂!LinuxCentos中部署KVM虚拟化平台(文字+图片)

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年6月28日15点11分 🀄️文章质量:94分 目录 ————前言———— KVM的优点 KVM…

人脸特征68点识别 C++

1、加载一张图片 main函数&#xff1a; cv::Mat img cv::imread("5.jpg");vector<Point2f> points_vec dectectFace68(img);2、人脸68特征识别函数 在这里vector<Point2f> dectectFace68(Mat src) {vector<Point2f> points_vec;int* pResults …

数据开源|GigaSpeech 2:三万小时东南亚多语种语音识别开源数据集发布

“Giga”一词源于“gigantic”&#xff0c;互联网上具有海量音频资源&#xff0c;但语音质量良莠不齐&#xff0c;高质量音频文本对数据十分稀缺且标注成本高昂&#xff0c;特别是在小语种领域。GigaSpeech 是一个非常成功的英文开源数据集&#xff0c;以 YouTube 和 Podcast 为…

JavaScript——数组的应用内排序

目录 任务描述 相关知识 冒泡排序 一趟冒泡排序 冒泡排序全过程 选择排序 一趟选择排序 选择排序全过程 编程要求 任务描述 本关任务&#xff1a;掌握冒泡排序和选择排序。 相关知识 所谓排序是指将一组数据按照从小到大&#xff08;或从大到小&#xff09;的顺序重…

windows USB 驱动开发-URB结构

通用串行总线 (USB) 客户端驱动程序无法直接与其设备通信。 相反&#xff0c;客户端驱动程序会创建请求并将其提交到 USB 驱动程序堆栈进行处理。 在每个请求中&#xff0c;客户端驱动程序提供一个可变长度的数据结构&#xff0c;称为 USB 请求块 (URB) &#xff0c;URB 结构描…

C# 验证PDF数字签名的有效性

数字签名作为PDF文档中的重要安全机制&#xff0c;不仅能够验证文件的来源&#xff0c;还能确保文件内容在传输过程中未被篡改。然而&#xff0c;如何正确验证PDF文件的数字签名&#xff0c;是确保文件完整性和可信度的关键。本文将详细介绍如何使用免费.NET控件通过C#验证PDF签…

【TS】TypeScript 入门指南:强大的JavaScript超集

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 入门指南&#xff1a;强大的JavaScript超集一、TypeScript 简介1.1 …

【ARM系列】1 of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

零成本、高收益!我是怎么通过Stable Diffusion做副业的,AI绘画助你轻松开启副业!

通过Stable Diffusion赚钱的方法 人工智能&#xff08;AI&#xff09;已经在创意领域取得了重大进展。特别是Stable Diffusion为各行各业提供了创新解决方案。从播客标志到生日蛋糕设计&#xff0c;由AI生成的艺术呈现了个人和企业的无限可能性。以下是您可以通过Stable Diffu…

利用MATLAB绘制傅里叶变换后的图形

题目如下&#xff0c;其中周期是 2 π 2\pi 2π y { 1 0 < x < π 0 x 0 − 1 − π < x < 0 y\begin{cases} 1 \ 0<x<\pi\\ 0 \ x0\\ -1 \ -\pi <x<0\\ \end{cases} y⎩ ⎨ ⎧​1 0<x<π0 x0−1 −π<x<0​ 计算可得 a n 1 π ∫ −…