STM32 ADC模数转换器原理及单通道多通道测量电压模板代码

ADC简介:

(主要用来测电压)

 1us转换时间(最大支持1MHZ的信号转换)

12位(0~4095)就是分辨率

通过ADC0809外挂芯片来理解STM32中的ADC

 地址锁存和译码是用来选择通路的,通过调节DAC(数字-模拟转换器)中的电压(通过改变SAR值来调节)使得比较器两端电压近似相等时的SAR值就是该模拟信号的值(一般采用二分法逼近,如果是12路的话,最多判断12次),EOC是转换结束信号,START是开始转换信号,要给个脉冲,CLOCK是ADC的时钟,VREF是参考电压。


 

STM32的ADC:

 

可以看到注入组和规则组的区别,规则组可以一次性接收16个信号数据,但是每次只能往寄存器里写入处理好的一个信号,所以要立马把寄存器里的值拿走(可以用DMA),而注入一次性可以接收4个信号数据,也可以一次性放入4个信号数据到寄存器

 

 这些相当于START(触发源选择触发的从模式或寄存器配置控制)

 

至于VREF(参考电压)和VDDA和VSSA ,STM32F103C8T6中已经将参考电压与单片机VDDA和VSSA相连了

相当于CLOCK

看门狗  

结构简图:

输入通道:

但是STM32F103C8T6只有10个外部输入通道 ,且没有ADC3和PC0~PC5

规则组的4钟转换模式:(单次就是每次都要触发,连续就是只需要触发一次,扫描就是一个一个从头到尾,非扫描就是只能看一个)

为了防止寄存器被覆盖,要及时使用DMA挪走数据,当扫描数量等于通道数目并完成转换后(通过配置)的时候产生EOC信号 

 

还有一个间断模式,就是在扫描的时候扫了几个后间断一下,要重新触发才能继续(了解即可)

 ——————————————————————————————————————————

规则组触发控制:

EXTI线11/TIM8_TRGO实践这一栏可以来自外部引脚也可以来自定时器内部信号,具体哪个通过AFIO重映射来决定

该ADC是12位的,转换结果是一个12位的二进制数,寄存器是16位,可以选择对齐方式,一般选择右对齐,因为读出来就是结果,左对齐的好处是可以裁剪分辨率,只取高8位舍弃掉后四位精度

转换时间:

 校准:

 在ADC初始化后加几条代码即可,无需知道如何校准

———————————————————————————————————————————

代码: 

单通道单次测量代码:

#include "stm32f10x.h"void AD_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//打开ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟分频,选择6分频,72/6 = 12MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//ADC专用模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//配置ADC1通道0放于序列1的位置,采样时间设为55.5个ADCCLK的周期ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//设置为单次模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发源ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//配置ADC模式为独立模式(非双ADC模式)ADC_InitStructure.ADC_NbrOfChannel = 1;//指定在扫描模式会用到的通道数为1(可以不用)ADC_InitStructure.ADC_ScanConvMode = DISABLE;//设置为非扫描模式ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//以下是校准的代码ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发ADC1while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//等待转换完成EOC发出信号return ADC_GetConversionValue(ADC1);//返回寄存器里的值,读完EOC自动置0(RESET)
}

单通道连续测量代码:

void AD_continus_Init(void)//单通道连续扫描
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//打开ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟分频,选择6分频,72/6 = 12MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//ADC专用模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//配置ADC1通道0放于序列1的位置,采样时间设为55.5个ADCCLK的周期ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//设置为单次模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发源ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//配置ADC模式为独立模式(非双ADC模式)ADC_InitStructure.ADC_NbrOfChannel = 1;//指定在扫描模式会用到的通道数为1(可以不用)ADC_InitStructure.ADC_ScanConvMode = DISABLE;//设置为非扫描模式ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//以下是校准的代码ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//只需软件触发ADC1一次即可,GetValue函数不需要再触发   
}
uint16_t AD_Continus_GetValue(void)
{//因为连续的会一直更新状态所以不用等待了return ADC_GetConversionValue(ADC1);//返回寄存器里的值,读完EOC自动置0(RESET)
}

多通道测量代码(使用单次非扫描模式,不用DMA方法实现):

void AD_Much_NoneDMA_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//打开ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟分频,选择6分频,72/6 = 12MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//ADC专用模式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);ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//配置ADC1通道0放于序列1的位置,采样时间设为55.5个ADCCLK的周期ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//设置为单次模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发源ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//配置ADC模式为独立模式(非双ADC模式)ADC_InitStructure.ADC_NbrOfChannel = 1;//指定在扫描模式会用到的通道数为1(可以不用)ADC_InitStructure.ADC_ScanConvMode = DISABLE;//设置为非扫描模式ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//以下是校准的代码ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}
uint16_t AD_Much_NoneDMA_GetValue(uint8_t ADC_Channel)
{//想看哪个通道电压就放哪个进序号1中,然后单次非扫描转换ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发ADC1while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//等待转换完成EOC发出信号return ADC_GetConversionValue(ADC1);//返回寄存器里的值,读完EOC自动置0(RESET)
}

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

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

相关文章

Android矩阵Matrix实现Glide图像fitCenter转换为centerCrop,Kotlin

Android矩阵Matrix实现Glide图像fitCenter转换为centerCrop&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.a…

电子电气架构 -- 新的架构带来的软件革命

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

后端 Java发送邮件 JavaMail 模版 20241128测试可用

配置授权码 依赖 <dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version> </dependency> <dependency><groupId>com.sun.mail</groupId><artifa…

【零基础学习UDS诊断测试】——0x10测试用例设计

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 1.概述 2.三个会话介绍 3.会话切换逻辑 4.会话响应格式 5.解析测试点 5.1. 0x10 5.1.1 具体用例设计 5.1.1.1 NRC否定响应码 6.详细用例展示 1.概述 主要基于诊断调查表介…

【Robocasa】Code Review

文章目录 OverviewalgoInitializationImportant Class MethodsTrain LoopTest Time ConfigsdemoConfig FactoryConfig StructureConfig Locking默认锁定状态配置修改的上下文管理器 dataset示例数据集对象参数说明 model基础模块EncoderCoreVisualCoreScanCore随机化器 (Random…

阅读笔记--知识蒸馏

1.一些基本概念 教师模型&#xff08;Teacher Model&#xff09;&#xff1a;预训练复杂神经网络&#xff0c;高精度&#xff0c;计算存储开销大。学生模型&#xff08;Student Model&#xff09;&#xff1a;简单参数少推理快的模型&#xff0c;目标从教师模型获取知识&#…

【Maven Helper】分析依赖冲突案例

目录 Maven Helper实际案例java文件pom.xml文件运行抛出异常分析 参考资料 《咏鹅》骆宾王 鹅&#xff0c;鹅&#xff0c;鹅&#xff0c;曲项向天歌。 白毛浮绿水&#xff0c;红掌拨清波。 骆宾王是在自己7岁的时候就写下了这首杂言 Maven Helper A must have plugin for wor…

一些基于宏基因组的巨型病毒研究

Introduction 上次已经介绍了巨型病毒的一些基本内容&#xff0c;也讲到了不依赖培养的方法是从环境样本中发现巨型病毒基因组成的不可或缺的工具。可以通过基因组解析宏基因组学来从环境序列数据中获取 NCLDV 基因组并进行深入研究如功能基因&#xff0c;宿主&#xff0c;进化…

李宏毅深度强化学习入门笔记:Actor-Critic

李宏毅-深度强化学习-入门笔记&#xff1a;Actor-Critic 一、深度强化学习简介二、Policy-based 方法&#xff08;一&#xff09;学习一个 Actor&#xff08;二&#xff09;Deep Learning 的 3 个步骤1. 确定 Function&#xff1a;作为 Actor 的神经网络2. 确定 Actor 的好坏3.…

基于Java Springboot成人教育APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

知乎启用AutoMQ替换Kafka,开辟成本优化与运维提效新纪元

作者&#xff1a;知乎在线架构组 王金龙 关于知乎 知乎公司&#xff0c;成立于 2010 年 8 月 10 日&#xff0c;于 2011 年 1 月 26 日正式上线&#xff0c;是中文互联网的高质量问答社区和创作者聚集的原创内容平台。 知乎起步于问答&#xff0c;而超越了问答。知乎以「生…

mysql数据库varchar截断问题

用了这么多年mysql数据库&#xff0c;才发现varchar是可以截断的&#xff0c;而且是在我们线上数据库。个人觉得dba的这个设置是非常有问题的&#xff0c;用户往数据库里存东西&#xff0c;就是为了以后用的&#xff0c;截断了存放&#xff0c;数据不完整&#xff0c;就用不了了…

SeggisV1.0 遥感影像分割软件【源代码】讲解

在此基础上进行二次开发&#xff0c;开发自己的软件&#xff0c;例如&#xff1a;【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等&#xff0c;不管是您用来个人学习还是公司研发需求&#xff0c;都相当合适&#xff0c;包您满…

MySQL底层概述—9.ACID与事务

大纲 1.ACID之原子性 2.ACID之持久性 3.ACID之隔离性 4.ACID之一致性 5.ACID的关系 6.事务控制演进之排队 7.事务控制演进之排它锁 8.事务控制演进之读写锁 9.事务控制演进之MVCC 10.事务隔离级别之隔离级别的类型 11.事务隔离级别之和锁的关系 12.事务隔离级别之隔…

基于 SpringBoot 的新冠密接者跟踪系统:如何实现高效信息推送功能

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需要…

手撸了一个文件传输工具

在日常的开发与运维中&#xff0c;文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件&#xff0c;还是快速从一台机器下载日志文件&#xff0c;一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天&#xff0c;我想分享我自己手撸一个文件传输工具的全过程…

基于Java Springboot电子书阅读器APP且微信小程序

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信开发者工具 数…

【AI系统】AI 编译器基本架构

AI 编译器基本架构 在上一篇文章中将 AI 编译器的发展大致分为了 3 个阶段&#xff0c;分别为 1&#xff09;朴素编译器、2&#xff09;专用编译器以及 3&#xff09;通用编译器。 本文作为上一篇文章 AI 编译器架构的一个延续&#xff0c;着重讨论 AI 编译器的通用架构。首先…

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中&#xff0c;华为的品牌形象较高&#xff0c;且产品质量过硬&#xff0c;因此用户基数也大。与此同时&#xff0c;随着影响力的增大&#xff0c;华为不断向外扩张&#xff0c;也逐渐成为了海外市场的香饽饽。作为开发者和运营者&#xff0c;我们要认识到…

SuperMap GIS基础产品FAQ集锦(20241202)

一、SuperMap iDesktopX 问题1&#xff1a;请问一下&#xff0c;iDesktopX11.2.1如何修改启动界面 11.2.0 【解决办法】参考帮助文档的“自定义启动界面”内容&#xff1a;https://help.supermap.com/iDesktopX/zh/SpecialFeatures/Development/DevelopmentTutorial/UserCust…