STM32--ADC模数转换

文章目录

  • ADC简介
  • 逐次逼近型ADC
  • ADC框图
  • 转换模式
  • 数据对齐
  • 转换时间
  • 校准
  • ADC基本结构
  • ADC单通道工程
    • 代码:

ADC简介

STM32的ADC(Analog-Digital Converter)模拟-数字转换器是一种逐次逼近型模拟数字转换器,可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。拥有18个输入通道,可测量16个外部通道和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

输入电压范围:0-3.3V,转换结果范围:0~4095

在STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
在这里插入图片描述

逐次逼近型ADC

在这里插入图片描述
这个一个经典的逐次逼近型ADC,有8个输入通道,会在通道选择开关进行选择,通过地址锁存和译码进行锁定要输出的信号。利用ADDA,ADDB,ADDC进行锁存,ALE进行译码。

接着到比较器,它将输入信号与DAC(数值模拟转换器)的输出进行比较,在开始转换之前,DAC会输出一个初始值,然后与输入信号进行比较,比较结果会被送到一个控制逻辑电路上,控制逻辑电路根据比较结果调整ADC的输出值,这个过程会重复进行,直到ADC的输出与输入信号精度足够接近。每次调整DAC的输出,都使其更加接近于输入信号的值。当DAC的输出与输入信号的差异在可接受范围内时,转换结束。

逐次逼近型寄存器就是将调整DAC输出的值,通过二分查找的方法,找到接近输入信号的值

最后将最终值放入三态锁存寄存器,就可以进行输出了。

上面的CLOCK是ADC的时钟,通过它可以控制ADC的运行速度和转换精度。由于转换需要一定时间,可通过它控制转换速度。还可以实现与外部时钟同步。

START是运行控制位,EOC是转换结束标志位。

ADC框图

在这里插入图片描述
在这里插入图片描述
我们先从输入口看,大体上与传统的逐次逼近型ADC无差异,这里有16个外部通道和两个内部资源通道。接着会通过数据选择器,可以到注入通道或者规则通道。
在这里插入图片描述

注入通道最多可以有4个输入通道涌入,而规则通道可以有16个输入通道涌入
这里的模拟数字转换器原理就是逐次逼近型ADC的原理。

对于规则通道寄存器,只能存储一个结果,所以如果有多个通道进行转换的话,那么先存储的结果会被后来的结果覆盖过去,这有可能造成结果丢失;这里的DMA请求就会解决这种后果,通过对寄存器地址的移动,让数据存储在不同的地址,这样就不会数据丢失,具体下一章讲解。
那注入通道就是一次可以存储4个结果,注入通道还有一些具体的内容,这里不展开叙述。
ADCCLK就是时钟,可控制采样时间和转换时间;

最后汇集到地址数据总线上,进行输出。

左下角是触发转换的部分,对应逐次逼近型的START信号;对于STM32,有两种触发方式,一种是软件触发,通过在程序中进行编写代码,进行启动;另一种是硬件触发,就是图中的触发源;有定时器各个通道和定时器主模式的输出,还有外部中断引脚触发转换。
在这里插入图片描述

模拟看门狗会根据比较的结果,在一定范围内进行判断,一旦超出所在范围,那么将会产生看门狗事件;

转换结束后,规则通道的信号和注入通道的信号都会产生标志位,标志位可以触发中断使能,使其中断;

转换模式

在ADC中,有两种转换模式,可以搭配扫描模式一同使用;
单次转换模式下, ADC只执行一次转换。连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。扫描模式用来扫描一组模拟通道。

单转换,非扫描模式
在这里插入图片描述
每一次转换都需要进行一次触发,转换结束后会置出一个结束标志位;当进行下一次转换时,又需要进行重新触发和置出结束标志位。

连续转换,非扫描模式
在这里插入图片描述
连续转换,只需要在一开始进行转换触发,那么接下来的每一次转换都不需要进行转换触发;
且转换一次后,会迅速进入下一次转换,每一次EOC会被标志,这里可以理解为转换完成后EOC自动标志了。

单次转换,扫描模式
在这里插入图片描述
扫描模式会对所选通道都进行扫描,由于是单次转换,后来的通道内容会将前面的通道内容进行覆盖,所以如图中所示,到最后只有通道6的内容进行输出;

连续转换,扫描模式
在这里插入图片描述
同样的道理,到最后只有通道6的内容会进行输出;
所以扫描模式都会与DMA进行搭配,让数据不产生丢失的情况

数据对齐

在这里插入图片描述
对于规则通道来说,输出结果只有12位有效,而数据存储器有16位,所以这里就会产生两种方式进行存储;
右对齐:数据高位补0,这是我们常用的方式;
左对齐:数据低位补0,这样操作会使数据扩大16倍;

转换时间

AD转换的步骤:采样,保持,量化,编码

STM32 ADC的总转换时间为:
TCONV = 采样时间 + 12.5个ADC周期

例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

校准

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在
校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换
中每个电容器上产生的误差。
建议在每次上电后执行一次校准;
启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期。

ADC基本结构

在这里插入图片描述
通过输入端口到AD转换器,AD转换器需要触发控制和时钟进行初始化。转换结束后会产生标志位;接着将数据结果储存到AD数据寄存器中。该结构需要开关进行控制启动。

ADC单通道工程

接线方式:
在这里插入图片描述
通过对电位器的旋转,在OLED显示屏上显示数字转换后的结果。

代码:

OLED代码所取处

AD.h

#ifndef __AD_H__
#define __AD_H__void AD_Init();
uint16_t AD_GetValue();#endif

AD.c

#include "stm32f10x.h"                  // Device headervoid AD_Init()
{//开启外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置ADC时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);  // 72M/6=12MHz//引脚初始化GPIO_InitTypeDef GPIO_InitStructure;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);//为所选ADC规则通道配置其序列器对应等级和采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//ADC结构体成员ADC_InitTypeDef ADC_InitStructure;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_InitStructure.ADC_NbrOfChannel=1;ADC_InitStructure.ADC_ScanConvMode=DISABLE; //选择是否为扫描模式ADC_Init(ADC1,&ADC_InitStructure);//ADC运行控制ADC_Cmd(ADC1,ENABLE);//重置所选ADC校准寄存器ADC_ResetCalibration(ADC1);//获取ADC复位状态,复位后为0while(ADC_GetResetCalibrationStatus(ADC1));//开始校准ADC_StartCalibration(ADC1);//获取ADC所选标准位状态,校准需要时间,校准好后置0while(ADC_GetCalibrationStatus(ADC1));
}uint16_t AD_GetValue()
{//启动ADC软件转换,触发方式ADC_SoftwareStartConvCmd(ADC1,ENABLE);//检查ADC是否已有标志位,还没有就为SET,有为RESET(EOC)while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//返回一个转换结果return ADC_GetConversionValue(ADC1);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "AD.h"float V;
int main()
{OLED_Init();AD_Init();OLED_ShowString(1,1,"Value:");//显示电压OLED_ShowString(2,1,"Volatge:0.00");while(1){V=(float)(AD_GetValue()/4095*3.3);OLED_ShowNum(1,7,AD_GetValue(),4);OLED_ShowNum(2,9,V,1);OLED_ShowNum(2,11,(uint16_t)(V*100)%100,2);}
}

数字范围:0-4095
电压范围:0-3.3V
对于显示屏上的波动效果,是正常效果。由于转换总时间在1/12*(55.5+12.5)=5.6微妙;
转换速度是非常快的,而我们又在一个循环中不断显示结果,每次输出结果是由逐次逼近型ADC进行比较输出的,所以不可能每次比较值都非常精准,多多少少会有些误差的波动。

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

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

相关文章

Docker容器:docker基础概述、安装、网络及资源控制

文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.…

百华劳保|听厂家聊聊如何检测防水劳保鞋?

说起防水劳保鞋大家可能并不陌生,在有积水或水利工程这些工作场景中使用,是防止水渗透鞋子的安全防护鞋。许多企业会为员工发放防水劳保鞋,在采购时一般都需要进行防水测试,提供相对应的检测报告。今天百华小编与大家聊聊都是如何…

vue3+ts-tsconfig.json报错Option ‘importsNotUsedAsValues’

vue3ts-tsconfig.json报错Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption ‘“ignoreDeprecations”: “5.0”’ to silence this error. Use ‘verbatimModuleSyntax’ instead 自我记录 翻译 选项…

OpenGL —— 1、Vs2017搭建glad、glfw环境,并附代码测试

GLFW 简介           GLFW是一个开源的多平台库,用于OpenGL,OpenGL ES和 桌面上的 Vulkan 开发。它提供了一个简单的 API 来创建 窗口、上下文和表面,接收输入和事件。 GLFW是用C语言编写的,支持Windows,mac…

音视频FAQ(三):音画不同步

摘要 本文介绍了音画不同步问题的五个因素:编码和封装阶段、网络传输阶段、播放器中的处理阶段、源内容产生的问题以及转码和编辑。针对这些因素,提出了相应的解决方案,如使用标准化工具、选择强大的传输协议、自适应缓冲等。此外&#xff0…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由请求时,出现如下错误 yml配置如下: 可能的一种原因是:yml配置了gateway.discovery.locator.enabledtrue,此时gateway会使用负载均衡模式路由请求,但是SpringCloud Alibaba删除了Ribbon的…

深度学习入门-3-计算机视觉-卷积神经网络

一、计算机视觉 1.概述 计算机视觉作为一门让机器学会如何去“看”的学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场…

el-table 实现动态表头 静态内容 根据数据显示动态输入框

直接放代码了 <el-table:data"form.tableDataA"borderstripestyle"width: 100%; margin-top: 20px"><el-table-columnv-for"(category, categoryIndex) in form.tableDataA":key"categoryIndex":label"category.name&qu…

SHELL 基础 显示字符颜色, 修改历史命令,Linux里的命令 执行顺序

echo 打印命令 &#xff1a; 显示字符串 &#xff1a; [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo "this is SHELL language" this is SH…

Curson 编辑器

Curson 汉化与vacode一样 Curson 自带chat功能 1、快捷键ctrlk(代码中编辑) 2、快捷键ctrll 右侧打开窗口

MySQL- sql语句基础

文章目录 1.select后对表进行修改&#xff08;delete&#xff09;2.函数GROUP_CONCAT()3.使用正则表达式3.DATE_FORMAT()4.count() 加条件关于GROUP BY 使用可能忽悠而导致查询结果错误的点 1.select后对表进行修改&#xff08;delete&#xff09; 报错&#xff1a;You can’t…

前端学习记录~2023.8.3~JavaScript重难点实例精讲~第5章 DOM与事件

第 5 章 DOM与事件 前言5.1 DOM选择器5.1.1 传统原生JavaScript选择器&#xff08;1&#xff09;通过id定位&#xff08;2&#xff09;通过class定位&#xff08;3&#xff09;通过name属性定位&#xff08;4&#xff09;通过标签名定位 5.1.2 新型的querySelector选择器和quer…

【论文阅读】 Model Sparsity Can Simplify Machine Unlearning

Model Sparsity Can Simplify Machine Unlearning 背景主要内容Contribution Ⅰ&#xff1a;对Machine Unlearning的一个全面的理解Contribution Ⅱ&#xff1a;说明model sparsity对Machine Unlearning的好处Pruning方法的选择sparse-aware的unlearning framework Experiments…

AI 绘画Stable Diffusion 研究(十一)sd图生图功能详解-美女换装

免责声明: 本案例所用安装包免费提供&#xff0c;无任何盈利目的。 大家好&#xff0c;我是风雨无阻。 为了让大家更直观的了解图生图功能&#xff0c;明白图生图功能到底是干嘛的&#xff0c;能做什么事情&#xff1f;今天我们继续介绍图生图的实用案例-美女换装的制作。 对于…

实验一 ubuntu 网络环境配置

ubuntu 网络环境配置 【实验目的】 掌握 ubuntu 下网络配置的基本方法&#xff0c;能够通过有线网络连通 ubuntu 和开发板 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&#xff0c;以“#”开头的…

Android 命令行如何运行 JAR 文件

​ 最近有位老哥问了一个问题&#xff0c;说如果将java的jar文件在Android中执行&#xff1f;这个其实很简单的一个问题&#xff0c;直接写个App放里面不就可以了么&#xff1f;但是人家说没有App&#xff0c;直接使用命令行去运行。说明这个需求的时候&#xff0c;把我给整懵了…

无需公网IP——搭建web站点

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

python控制obs实现无缝切换场景!obs-websocket-py

前言 最近一直在研究孪生数字人wav2lip。目前成果可直接输入高清嘴型&#xff0c;2070显卡1分钟音频2.6分钟输出。在直播逻辑上可以做到1比1.3这样&#xff0c;所以现在开始研究直播。在逻辑上涉及到了无缝切换&#xff0c;看到csdn上有一篇文章还要vip解锁。。。那自己研究吧…

AMBA总线协议(4)——AHB(二)

目录 一、前言 二、AHB操作概述 三、AHB 基本传输 1、简单传输 2、带有等待的传输 3、多重传输 四、AHB传输类型 五、小结 一、前言 在之前的文章中对于AMBA AHB做了一个简单的介绍&#xff0c;AHB 主要用于高性能模块(如 CPU、DMA 和 DSP 等)之间的连接&#x…

dB(分贝)定义及其应用(音量 dB dBA 计算 调整)

一、dB的诞生背景 dB是英文“decibel”的简写&#xff0c;其中&#xff0c;deci表示十分之一&#xff0c;Bel表示“贝”。Decibel&#xff0c;分贝就是十分之一贝。“贝”是“贝尔”的简称&#xff0c;是以杰出科学家Alexander Graham Bell的名字来命名的单位。贝尔在1876年获…