STM32 AD单通道与多通道实战指南

文章目录

    • AD单通道(实验)
      • 有关配置的库函数
      • AD单通道部分主要代码
    • AD多通道实现
      • 多通道采集实现思路探讨
      • 单次转换非扫描模式实现AD多通道
      • AD多通道部分代码

学习建议:推荐搭配 江协科技 AD单通道 AD多通道一起食用!!!!
【STM32入门教程-2023版 细致讲解 中文字幕】https://www.bilibili.com/video/BV1th411z7sn?p=22&vd_source=66c03c3ecc640bbe982dc3d48bfd8841

AD单通道(实验)

在这里插入图片描述
在这里插入图片描述

  1. 初始化流程
    开启时钟 → 配置 GPIO 为模拟输入 → 配置规则组通道 → 初始化 ADC 结构体 → 开启 ADC 电源 → 校准 ADC。
  2. 单次转换流程
    软件触发转换 → 等待 EOC 标志位 → 读取转换结果。

有关配置的库函数

1. RCC_ADCCLKConfig

  • 功能:配置 ADC 的时钟分频器,确定 ADC 工作时钟(ADCCLK)。
  • 参数:可选分频系数为 2、4、6、8,输入时钟为 APB2 的 72MHz 时钟。
    • 示例:若选择 6 分频,ADCCLK = 72MHz / 6 = 12MHz。
  • 作用:确保 ADC 工作在合适的时钟频率下,保证转换精度和稳定性。
  • 在RCC库函数中,配置ADC工作时钟。

2.电源与校准函数

  • ADC_Cmd
    • 功能:开启或关闭 ADC 电源。
    • 参数ENABLE 启动 ADC,DISABLE 关闭。
  • 校准函数组(需按顺序调用):
    • ADC_ResetCalibration:复位校准寄存器。
    • ADC_GetResetCalibrationStatus:等待复位校准完成(通过循环检测标志位)。
    • ADC_StartCalibration:启动校准。
    • ADC_GetCalibrationStatus:等待校准完成(通过循环检测标志位)。
    • 作用:减小 ADC 转换误差,需在初始化后调用。

3.中断与 DMA 相关函数

  • ITConfig:开启或关闭 ADC 中断(如模拟看门狗中断)。
  • NVIC_Init:配置中断优先级(需结合 ITConfig 使用)。
  • DMA_Cmd:开启 DMA 传输(用于多通道数据搬运,会议中未深入讲解)。

4.触发与转换控制函数

  • ADC_SoftwareStartConvCmd
    • 功能:软件触发 ADC 开始转换(适用于单次转换模式)。
    • 参数ENABLE 触发转换,DISABLE 关闭。
  • ADC_GetSoftwareStartConvStatus
    • 不能获取软件触发转换状态,因为当有软件触发标志时,一旦开始转化就会将软件触发标志位清零,不会通过该函数获得是否转化完成。
  • ADC_GetFlagStatus
    • 功能:获取转换状态标志位。
    • 关键参数
      • ADC_FLAG_EOC:规则组转换完成标志位(转换结束后硬件置 1)。
    • 用途:通过检测 EOC 标志位判断转换是否完成,而非使用 ADC_GetSoftwareStartConvStatus(该函数仅返回触发状态,与转换完成无关)。

5.配置间断模式函数

  • ADC_DiscModeChannelCountConfig
    • 每隔几个通道间断一次
  • ADC_DiscModeCmd
    • 是否开启间断模式

6.规则组通道配置

  • ADC_RegularChannelConfig
    • 功能:配置规则组通道参数,如通道号、序列位置、采样时间。
    • 参数
      • ADCx:ADC 外设(如 ADC1)。
      • ADC_Channel:通道编号(如 PA0 对应 ADC_Channel_0)。
      • Rank:序列位置(1~16,非扫描模式下仅需设为 1)。
      • ADC_SampleTime:采样时间(影响转换速度和稳定性,可选短 / 中 / 长周期)。

7.其他

  • ADC_ExternalTrigConvCmd

    • 外部触发转换控制 ,就是是否允许外部触发转换
  • ADC_GetConversionValue

    • 功能:读取规则组通道的转换结果(16 位无符号整数)。
    • 返回值:转换后的数字量,需结合参考电压计算实际模拟值。
  • ADC_GetDualModeConversionValue

    • ADC获取双模式转换值,双ADC模式读取转化结果的函数
  • ADC_TempSensorVrefintCmd

    • ADC温度传感器,内部参考电压控制,用来开启内部的两个通道。

8.注入组与模拟看门狗函数

  • 注入组函数:带 Injected 前缀的函数(如 ADC_InjectedChannelConfig),用于配置紧急通道(会议中未使用)。

  • 模拟看门狗函数

    • ADC_AnalogWatchdogCmd:启动模拟看门狗,监测输入电压是否超出阈值。
    • ADC_AnalogWatchdogThresholdsConfig:设置电压阈值(高 / 低阈值)。
  • ADC_AnalogWatchdogSingleChannelConfig

    • 配置看门的通道

AD单通道部分主要代码

// AD.c
#include "stm32f10x.h"                  // Device headervoid AD_Init(void)
{//1.开始时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//2. 配置ADC时钟信号//只能使用6 或者 8 分频,因为有限制RCC_ADCCLKConfig(RCC_PCLK2_Div6);//3.配置gpio口 //初始化gpioinit参数中的结构体GPIO_InitTypeDef GPIO_InitStructure;//将gpio口设置为模拟输入模式,就是io口不起作用不会影响数据转化GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//4.配置规则组通道ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);//5.初始化ADC模块ADC_InitTypeDef ADC_InitStruct;//是否连续转化ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//对齐方式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//外部触发方式,使用软件触发,所以配置为ADC_ExternalTrigConv_NoneADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel = 1;//配置连续扫描ADC_InitStruct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1, &ADC_InitStruct);//6. 开启ADC总开关ADC_Cmd(ADC1, ENABLE);//7.校准ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}
//启动转换,获取结果函数
uint16_t AD_GetValve(void)
{//内部软件启动转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);//查看是否转化完成//查看标志位,转化完成会将EOC标志位置一while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//读取数据return ADC_GetConversionValue(ADC1);
}

AD多通道实现

多通道采集实现思路探讨

  • 扫描模式结合 DMA :利用列表填充四个通道触发转换可实现多通道,但存在数据覆盖问题,最好配合 DMA 实现,讲完 DMA 后再尝试。
  • 手动转运数据问题 :扫描模式下单个通道转换完成无标志位和中断,只有整个列表转换完才有 EOC 标志位和中断,易造成数据覆盖丢失;且 AD 转换快,手动转运数据对程序要求高,操作困难。
  • 间断模式手动转运 :可使用间断模式,每转换一个通道暂停,手动转运数据后再继续,但因无标志位需靠 delay 延时保证转换完成,不省心且效率低,暂不推荐。

单次转换非扫描模式实现AD多通道

  • 具体实现方式 :每次触发转换前手动更改列表第一个位置的通道,如依次写入通道 0、1、2、3 等,触发转换等待读值,就能实现多通道转换。

AD多通道部分代码

//AD.c
#include "stm32f10x.h"                  // Device headervoid AD_Init(void)
{//1.开始时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//2. 配置ADC时钟信号//只能使用6 或者 8 分频,因为有限制RCC_ADCCLKConfig(RCC_PCLK2_Div6);//3.配置gpio口  //初始化gpioinit参数中的结构体GPIO_InitTypeDef GPIO_InitStructure;//将gpio口设置为模拟输入模式,就是io口不起作用不会影响数据转化GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//5.初始化ADC模块ADC_InitTypeDef ADC_InitStruct;//是否连续转化ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//对齐方式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//外部触发方式,使用软件触发,所以配置为ADC_ExternalTrigConv_NoneADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel = 1;//配置连续扫描ADC_InitStruct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1, &ADC_InitStruct);//6. 开启ADC总开关ADC_Cmd(ADC1, ENABLE);//7.校准ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}
//使用单次转化,非扫描模式实现AD多通道
//启动转换,获取结果函数
uint16_t AD_GetValve(uint8_t ADC_Channel)
{//配置规则组通道ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);//内部软件启动转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);//查看是否转化完成//查看标志位,转化完成会将EOC标志位置一while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//读取数据return ADC_GetConversionValue(ADC1);
}
//main.c#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"
uint16_t value0;
uint16_t value1;
uint16_t value2;
uint16_t value3;int main(void)
{OLED_Init();AD_Init();OLED_ShowString(1, 1, "V0:");OLED_ShowString(2, 1, "V1:");OLED_ShowString(3, 1, "V2:");OLED_ShowString(4, 1, "V3:");while(1){value0 = AD_GetValve(ADC_Channel_0);value1 = AD_GetValve(ADC_Channel_1);value2 = AD_GetValve(ADC_Channel_2);value3 = AD_GetValve(ADC_Channel_3);OLED_ShowNum(1, 4, value0, 4);OLED_ShowNum(2, 4, value1, 4);OLED_ShowNum(3, 4, value2, 4);OLED_ShowNum(4, 4, value3, 4);Delay_ms(100);}
}

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

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

相关文章

沟通频率不合适,如何找到平衡点

在团队协作中,沟通频率过高、信息干扰、节奏错位常常导致效率下降与成员倦怠。PMI研究指出,沟通不当是75%项目延误的根源,其中沟通频率失衡是关键变量之一。要解决这一问题,关键在于设定节奏、分层沟通、制定协议。其中&#xff0…

EC2 实例详解:AWS 的云服务器怎么玩?☁️

弹性计算、灵活计费、全球可用,AWS EC2 全攻略 在 AWS 生态中,有两个核心服务是非常关键的,一个是 S3(对象存储),另一个就是我们今天的主角 —— Amazon EC2(Elastic Compute Cloud&#xff09…

lvs-keepalived高可用群集

目录 1.Keepalived 概述及安装 1.1 Keepalived 的热备方式 1.2 keepalived的安装与服务控制 (1)安装keep alived (2)控制 Keepalived 服务DNF 安装 keepalived 后,执行以下命令将keepalived 服务设置为开机启动。 2.使用 Keepalived 实现双机热备 …

车载诊断架构SOVD --- 车辆发现与建连

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

BUUCTF之[ACTF2020 新生赛]BackupFile

打开环境就一句话 找出源文件! 结合题目名字&#xff1a;BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

Rag技术----项目博客(六)

RAG 定义&#xff1a;检索增强生成&#xff08;Retrieval Augmented Generation&#xff09;&#xff0c;简称 RAG&#xff0c;已经成为当前最火热的LLM应用方案。 目的&#xff1a;通过提供相关领域数据库通过问题检索信息&#xff0c;将相关信息合并到Prompt中&#xff0c;…

设计模式——外观设计模式(结构型)

摘要 本文介绍了外观设计模式&#xff0c;它是一种结构型设计模式&#xff0c;通过引入一个外观类来封装复杂子系统的调用细节&#xff0c;对外提供简单统一的接口。文中通过生活类比、关键角色介绍、使用场景分析以及结构说明等方面对这一模式进行了全面阐述&#xff0c;还涉…

LabVIEW磁悬浮轴承传感器故障识别

针对工业高端装备中主动磁悬浮轴承&#xff08;AMB&#xff09;的位移传感器故障检测需求&#xff0c;基于 LabVIEW 平台构建了一套高精度故障识别系统。通过集成品牌硬件与 LabVIEW 的信号处理能力&#xff0c;实现了传感器探头故障的实时监测与精准定位&#xff0c;解决了传统…

集成学习三种框架

集成学习通过组合多个弱学习器构建强学习器&#xff0c;常见框架包括Bagging&#xff08;装袋&#xff09;、Boosting&#xff08;提升&#xff09; 和Stacking&#xff08;堆叠&#xff09; 一、Bagging&#xff08;自助装袋法&#xff09; 核心思想 从原始数据中通过有放回…

PCI DSS培训记录

22日上午: 整体PCI DSS 结构分享VISA分享全球欺诈风险动态 信用卡被偷枚举攻击依然是最为主要的安全威胁之一(枚举验证码),增加3DS验证防护勒索软件和信息泄漏攻击欺诈分子对AI技术的兴趣日益增加,如换脸软件过验证基于NFC技术利用非接交易进行欺诈成为新的攻击手段,如NF…

数据安全中心是什么?如何做好数据安全管理?

目录 一、数据安全中心是什么 &#xff08;一&#xff09;数据安全中心的定义 &#xff08;二&#xff09;数据安全中心的功能 1. 数据分类分级 2. 访问控制 3. 数据加密 4. 安全审计 5. 威胁检测与响应 二、数据安全管理的重要性 三、如何借助数据安全中心做好数据安…

黑马Java面试笔记之 微服务篇(业务)

一. 限流 你们项目中有没有做过限流?怎么做的? 为什么要限流呢? 一是并发的确大(突发流量) 二是防止用户恶意刷接口 限流的实现方式: Tomcat:可以设置最大连接数 可以通过maxThreads设置最大Tomcat连接数,实现限流,但是适用于单体架构 Nginx:漏桶算法网关,令牌桶算法自定…

PostgreSQL的扩展 passwordcheck

PostgreSQL的扩展 passwordcheck passwordcheck 是 PostgreSQL 内置的一个密码复杂度检查扩展&#xff0c;用于强制实施基本的密码策略。 一、扩展概述 功能&#xff1a;在创建或修改用户密码时检查密码复杂度目的&#xff1a;防止使用过于简单的密码适用版本&#xff1a;Po…

Go语言学习-->编译器安装

Go语言学习–&#xff1e;编译器安装 Go采用的是UTF-8编码的文本文件存放源代码&#xff0c;理论上使用任何一款文本编辑器都可以做Go语言开发。这里推荐使用VS Code和Goland。 VS Code是微软开源的编辑器&#xff0c;而Goland是jetbrains出品的付费IDE。我们这里使用VS Code …

基于Android的一周穿搭APP的设计与实现 _springboot+vue

开发语言&#xff1a;Java框架&#xff1a;springboot AndroidJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.6 系统展示 APP登录 A…

井字棋——ai PK you

挑战人工智能&#xff0c;体验经典井字棋的对决&#xff01;AI 拥有强大的逻辑计算能力&#xff0c;每一步都经过精准推演。你能战胜它吗&#xff1f;还是会被 AI 彻底碾压&#xff1f; 特点&#xff1a; 智能 AI&#xff0c;难度可调 极简界面&#xff0c;快速上手 实时胜负…

关于easyx头文件

一、窗口创建 &#xff08;1&#xff09;几种创建方式 #include<easyx.h>//easyx的头文件 #include<iostream> using namespace std;int main() {//创建一个500*500的窗口//参数为&#xff1a;长度&#xff0c;宽度&#xff0c;是否显示黑框&#xff08;无参为不…

【学习记录】Django Channels + WebSocket 异步推流开发常用命令汇总

文章目录 &#x1f4cc; 摘要&#x1f9f0; 虚拟环境管理✅ 创建虚拟环境✅ 删除虚拟环境✅ 激活/切换虚拟环境 &#x1f6e0;️ Django 项目管理✅ 查看 Django 版本✅ 创建 Django 项目✅ 创建 Django App &#x1f4ac; Channels 常用操作✅ 查看 Channels 版本 &#x1f50…

Java线程状态及其流转

在Java编程中&#xff0c;线程是一种重要的并发实体。为了更好地理解和管理多线程应用程序&#xff0c;我们需要清楚线程的不同状态及其流转机制。本文将详细介绍Java中线程的几种主要状态以及它们之间的转换关系。 一、线程状态概述 Java线程的生命周期有多个状态&#xff0…

LabVIEW双光子显微镜开发

基于LabVIEW 开发高性能双光子显微镜系统&#xff0c;聚焦于生物样本深层成像与纳米材料三维表征。实现了超快激光控制、多维数据采集与实时图像重建。系统采用飞秒激光光源与高精度振镜扫描模块&#xff0c;结合 LabVIEW 的 FPGA 实时控制能力&#xff0c;可对活体组织、荧光纳…