STM32外设之ADC应用--寄存器开发

1.ADC简介

  模数转换器(Analog-to-Digital Converter,简称ADC)是一种重要的电子设备,它能够将模拟信号转换为数字信号。是一种将连续变化的模拟信号转换为离散的数字信号的电子设备。这种转换使得模拟信号可以在数字系统中进行处理、存储和传输。
  ADC的工作原理通常包括采样、保持、量化和编码四个步骤:
  采样:在采样阶段,ADC使用一定的时间间隔对模拟信号进行采样,从而得到一系列离散的信号样本。
  保持:在保持阶段,ADC将采样得到的信号样本保持一段时间,以便进行后续的量化操作。
  量化:在量化阶段,ADC将连续变化的模拟信号幅度转换为有限数量的离散值。这些离散值通常是以二进制形式表示的。
  编码:在编码阶段,ADC将量化后的离散值转换为数字信号,并输出到数字系统中。

2.ADC性能

  分辨率:分辨率表示ADC能够分辨的最小模拟信号电平值,通常以位数(bit)来表示。位数越多,ADC的分辨率越高,能够转换的模拟信号范围越广。
  采样率:采样率表示ADC每秒钟能够采样的次数,通常以每秒采样点数(SPS)或兆每秒采样点数(MSPS)来表示。采样率越高,ADC能够捕获的模拟信号细节越多。
  信噪比(SNR):SNR是衡量ADC转换过程中噪声干扰程度的指标。SNR越高,表示ADC转换过程中的噪声越小,转换精度越高。

  ADC有多种类型和结构,常见的包括逐次逼近型ADC、计数/斜率积分型ADC、并联比较型ADC以及Σ-Δ(Sigma-delta)ADC等:
  逐次逼近型ADC:逐次逼近型ADC通过不断地将采样输入信号与已知电压进行比较,逐步逼近输入信号的实际值。这种ADC具有结构简单、功耗低等优点,但采样率可能受到限制。
  计数/斜率积分型ADC:计数/斜率积分型ADC使用积分器将输入模拟电压转换为时间间隔,并使用计数器对这个时间间隔进行计数。这种ADC具有抑制交流噪声干扰的能力,适用于嘈杂的工业环境。
  并联比较型ADC:并联比较型ADC使用一系列互连的比较器和电压参考来生成特定分辨率的等效输出代码。这种ADC具有转换速度快、结构简单的优点,但可能需要较多的比较器和精密电阻网络。
  Σ-Δ ADC:Σ-Δ ADC通过积分器、比较器、1位DA转换器和数字滤波器组成。它使用高频时钟信号对输入信号进行调制和采样,并通过数字滤波器对采样结果进行滤波和解调。这种ADC具有高精度、低噪声等优点,适用于高精度数据采集领域。

3.应用领域

  ADC在电子和计算机工程领域具有广泛的应用,包括但不限于以下几个方面:
  通信领域:ADC用于将模拟语音信号转换为数字信号进行传输和处理。
  数据处理领域:ADC用于将模拟信号转换为数字信号以便进行数字信号处理和分析。
  自动化控制领域:ADC用于将传感器输出的模拟信号转换为数字信号以便进行自动化控制。
  音频和视频处理领域:ADC用于将音频和视频信号转换为数字信号以便进行数字音频和视频处理。
  综上所述,ADC是一种重要的电子设备,在电子和计算机工程领域具有广泛的应用前景。随着技术的不断发展,ADC的性能将不断提高,应用领域也将不断拓展。

4.STM32F10X系列中的外设ADC

  在STM32中是12位ADC,一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
  模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
  其ADC框图如下:
在这里插入图片描述
  ADC转换组分为规则组转换和注入组转换两种。有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。

  • 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规
    则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。
  • 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入
    组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。
      如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。

4.1 采样周期

  ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。
  总转换时间如下计算:
    TCONV = 采样时间+ 12.5个周期

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

4.2 ADC配置步骤

  1.配置ADC通道引脚,设置工作模式为模拟输入。
  2.使能ADC时钟,设置工作频率不超过14MHZ。
  3.设置通道采样周期。
  4.设置要转换的通道,以及转换的通道个数
  5.若需要多通道转换,则开始扫描模式;若需要循环转换,则开启连续转换模式和自动注入转换。
  6.启动ADC,初始化ADC校准寄存器,等待校准完成。
  7.开启ADC转换。

  • 代码配置实现如下:
/*
ADC规则通道初始化
ADC_IN8 --PB0*/
void ADC1_RegulerInit(void)
{//1.配置引脚RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFFFF0;//配置为模拟输入//2.配置ADC时钟RCC->APB2ENR|=1<<9;//ADC1时钟RCC->APB2RSTR|=1<<9;RCC->APB2RSTR&=~(1<<9);RCC->CFGR&=~(0x3<<14);RCC->CFGR|=0x2<<14;//设置ADC工作频率:72MHZ/6=12MHZ//3配置ADC的规则组转换ADC1->CR2|=1<<23;//启动内存温度传感器ADC1->CR2|=1<<20;//选择外部事件启动ADC1->CR2|=0x7<<17;//选择软件触发//设置通道信息ADC1->SMPR1|=7<<18;//设置通道16的采用周期ADC1->SMPR2|=7<<24;//设置通道8采样周期ADC1->CR2|=1<<0;//启动ADC1ADC1->CR2|=1<<3;//初始化校准寄存器while(ADC1->CR2&1<<3){}//等待初始化完成ADC1->CR2|=1<<2;//开始校准while(ADC1->CR2&1<<2);//等待校准完成
}

  本次使用ADC1的通道8,采集光照强度数据,其光强模块硬件原理图如下:
在这里插入图片描述
  通道16为STM32内部温度传感器,其温度转换算法如下:
  温度传感器在内部和ADC1_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入推荐采样时间是17.1μs。
在这里插入图片描述
  读温度

  1. 选择ADC1_IN16输入通道
  2. 选择采样时间为17.1 μs
  3. 设置ADC控制寄存器2(ADC_CR2)的TSVREFE位,以唤醒关电模式下的温度传感器
  4. 通过设置ADON位启动ADC转换(或用外部触发)
  5. 读ADC数据寄存器上的VSENSE 数据结果
  6. 利用下列公式得出温度
      温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25
  • 相关参数
      V25 = VSENSE在25°C时的数值
      Avg_Slope = 温度与VSENSE曲线的平均斜率(单位为mV/ °C 或 μV/ °C)
    在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4e7db606a74e47e2bc192776462d9601.png)

4.3 读取AD通道值

/*
规则通道启动一次转换
形参:chx --要转换的通道
返回值:通道采集的AD值
*/
u16 ADC1_GetRegChx(u8 chx)
{ADC1->SQR1&=~(0xF<<20);//转换序列为1ADC1->SQR3&=~(0x1F<<0);ADC1->SQR3|=chx;//设置要转换的通道ADC1->CR2|=1<<22;//启动转换while(!(ADC1->SR&1<<1)){}//等待转换完成u16 data=ADC1->DR;//读取转换的AD值return  data;    
}

4.4 光强和温度采集示例

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart1.h"
#include "timer.h"
#include "adc.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
u8 rtc_menu_cnt=0;
int main()
{Beep_Init();//蜂鸣器器初始化LED_Init();//LEDKey_Init();USARTx_Init(USART1,115200);//一个字符的收发时间:1s/(115200/10)=86usTIMx_Init(TIM2,72,10000);//工作频率:72MHZ/72=1MHZ//10000*(1/1)us=10msUSARTx_Init(USART3,115200);//串口3配置u16 temp=0;ADC1_RegulerInit();//ADC规则通道初始化float cpu_temp=0;while(1){if(usart1_flag){usart1_buffer[usart1_cnt]='\0';printf("rx1=%s,%d\n",usart1_buffer,usart1_cnt);usart1_cnt=0;usart1_flag=0;}LED1=!LED1;temp=DS18B20_GetTemp();//读取温度printf("temp=%.1f\n",temp*0.0625);//采集光强temp=ADC1_GetRegChx(8);printf("光强:%d\n",temp);//采集内部温度temp=ADC1_GetRegChx(16);/*温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25Avg_Slope=4.3mV/℃-->0.0043V/℃V25=1.43VVSENSE --温度传感器采集的AD值对应的电压ADC分辨率:0~4095  参考电压:0~3.3V温度传感器采集的对应的电压: temp*3.3/4095;*/cpu_temp=(1.43-temp*3.3/4095)/0.0043+25;printf("内部温度:ad:%d  Temp=%.2f ℃\n",temp,cpu_temp);Delay_Ms(1000);}
}

在这里插入图片描述

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

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

相关文章

A-23OH型树脂在汽车涂装行业溶剂回收中的应用

随着汽车制造业的不断发展&#xff0c;市场竞争愈发激烈。为了提升生产柔性、生产效率和成本效益&#xff0c;同时确保喷漆质量并满足日益增长的非标和定制化设计需求&#xff0c;汽车生产商需要寻求更加高效、环保的解决方案。 其中&#xff0c;水性涂料的应用已经成为一种趋势…

Maven 快速入门

Maven 快速入门 一、简介1、概述2、特点3、工作原理4、常用命令5、生命周期6、优缺点&#x1f388; 面试题 二、安装和配置1、安装2、环境配置3、命令测试是否安装成功4、功能配置5、idea配置本地 maven6、maven 工程依赖包查询网站 三、基于IDEA创建Maven工程1、maven 工程中的…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

常用代码整理

字符串操作相关函数的实现 gets puts strlen strcat strncat strcpy strncpy strcmp strncmp memcpy 内存大小端判断 类型强制转换 联合 排序 选择排序 冒泡排序 插入排序 快速排序 先选一个基准值&#xff0c;通过双指针扫描并交换元素将数组划分为两部分&#xff0c;左…

6.计算机网络_UDP

UDP的主要特点&#xff1a; 无连接&#xff0c;发送数据之前不需要建立连接。不保证可靠交付。面向报文。应用层给UDP报文后&#xff0c;UDP并不会抽象为一个一个的字节&#xff0c;而是整个报文一起发送。没有拥塞控制。网络拥堵时&#xff0c;发送端并不会降低发送速率。可以…

gitee建立/取消关联仓库

目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件&#xff0c;右击&#xff0c;选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…

transformer的基础知识

transformer的基础知识 transformer网络结构图 seq2seq 一般Seq2seq会分成两部分:Encoder、Decoder。 Encoder Transformer 中的 Encoder 就是用的 Self-attention。 encoder的内部结构 补充:block的内部结构主要由self-attention和全连接神经网络所构成。 在原来的论…

TSmaster CAN的E2E检验配置

文章目录 一. 自定义E2E校验算法1. 导入DBC文件2. 模拟报文发送3. 自定义E2E算法 问题&#xff1a;C代码编辑器中 数据库头文件为空问题&#xff1a;C代码编辑器中 程序启动和暂停按钮为灰色 一. 自定义E2E校验算法 1. 导入DBC文件 点击载入CAN数据库&#xff0c;在弹窗中选择…

添加卡巴斯基杀毒软件(KES)的更新源

最近不知道怎么了&#xff0c;家里的电脑卡巴斯基&#xff08;KES&#xff09;怎么更新都更新不了&#xff0c;在网上找到了几个卡巴斯基的服务器: 添加步骤&#xff1a; 1.双击右下角的卡巴斯基图标。 2.依次按如下图示添加&#xff1a; 以下这步是最关键的&#xff0c;一定要…

HDU Ignatius‘s puzzle

题目大意&#xff1a;f&#xff08;x&#xff09;5*x^1313*x^5k*a*x&#xff0c;输入一个无负整数 k&#xff08;k<10000&#xff09;&#xff0c;要找到最小的非负整数 a&#xff0c;将任意整数 x &#xff0c;65|f&#xff08;x&#xff09;&#xff0c;如果不存在该 a&am…

矩阵AB=0

矩阵AB0的性质 一、二的证明 这里还有一种说法 三、四的证明 详情请跳转五

linux环境下的程序设计与git操作

目录 前言&#xff1a; 进度条小程序&#xff1a; 先介绍几个背景知识 代码实现 Git操作 总结 其他指令 前言&#xff1a; 本文将重点介绍1. linux下的程序设计&#xff0c;并使用linux下的几个函数接口。实现一个简单的小程序 2.本着开源精神&#xff0c;进行git操作。…

数据同步工具Sqoop原理及场景优化

目录 0 数据同步策略 1 数据同步工具 ​编辑 2 Sqoop同步数据原理分析 2.1 原理分析 2.2 Sqoop基本使用分析 3 切片逻辑 3.1 MR切片逻辑 3.2 Hive CombineInputformat切片逻辑 3.3 实验1:Map任务并行度分析1 3.4 实验2: Map任务并行度分析2 3.5 实验3:Map任务并行…

SDIO - DWC MSHC 电压切换和频率切换

背景 我们的sdio访问sd card过去一直跑在低频上&#xff0c;HS50M。前段时间给eMMc添加了HS200模式&#xff0c;eMMc的总线模式定义是这样的&#xff1a; 可以看到1.8V的IO 电压可以支持所有模式&#xff0c;我们过去的芯片&#xff0c;由硬件部门放到evb上&#xff0c;其IO …

【学习笔记】什么是MongoDB

文章目录 MongoDB 简介体系结构数据模型MongoDB 的特点 MongoDB 简介 学习一个东西就跟认识一个人一样&#xff0c;下面有情MongoDB来做个自我介绍 大家好&#xff0c;俺是MongoDB&#xff0c;是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计俺就是用于简化开…

Redis-03 持久化(RDB, AOF,混合持久化)及原理

1&#xff0c;持久化 Redis的持久化是必须的&#xff0c;当Redis服务宕机后&#xff0c;如果没有持久化&#xff0c;重启服务后redis中的数据都将丢失&#xff0c;所有的数据操作都将直连数据库&#xff0c;系统性能会大幅降低&#xff0c;所以在使用Redis做缓存服务时必须持久…

LabVIEW离心泵振动监控与诊断系统

利用LabVIEW结合数据采集与处理技术&#xff0c;构建了一套高效、低成本的振动监测与诊断系统&#xff0c;有效提升了测试精度与设备可靠性。 项目背景 在化工生产中&#xff0c;离心泵作为关键设备&#xff0c;其稳定运行对保障生产安全与效率至关重要。由于传统振动测试系统…

#数据结构(一)

线性表 两者都属于线性表线性表&#xff1a;逻辑结构------必连续      物理结构------不一定连续顺序表的物理结构 -----连续 &#xff0c;链表的物理结构 ----不连续顺序表的本质是数组&#xff0c;数组是一块地址连续的空间。而链表只是像细线一样&#xff0c;将不同地址…

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中&#xff0c;继承和重载是面向对象编程&#xff08;OOP&#xff09;中的重要概念。通过合理运用继承与重载&#xff0c;不仅能提高代码的复用性和灵活性&#xff0c;还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载&#xff0c;并…

萤石云服务支持云端视频AI自动剪辑生成

萤石视频云存储及媒体处理服务是围绕IoT设备云端存储场景下的音视频采集、媒体管理、视频剪辑和分发能力的一站式、专业云服务&#xff0c;并可面向广大开发者提供复杂设备存储场景下的完整技术方案。目前该服务新增了视频剪辑功能&#xff0c;支持将视频片段在云端进行裁剪并拼…