STM32-模数转化器

ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换
为离散的数字信号的器件。
ADC相关参数说明:
分辨率:
分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16
位等,它说明模数转换器对输入信号的分辨能力,位数越多,表示分辨率越高,恢复模拟信
号时会更精确。
精度:
精度表示 ADC 器件在所有的数值点上对应的模拟值和真实值之间的最大误差值,
也就是输出数值偏离线性最大的距离。
转换速率:
转换速率是指 A/D 转换器完成一次从模拟到数字的 AD 转换所需时间的倒数。例
如,某 A/D 转换器的转换速率为 1MHz,则表示完成一次 AD 转换时间为 1 微秒。
 
7.1、STM32ADC介绍
是12bit逐次逼近型模拟数字转换器,有多达18个通道,可测量16个外部和2个内部信
号源,各通道的A/D转换可以单次、连续、扫描或间断模式执行,ADC的结果可以左对齐或
右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
ADC供电要求:2.4V到3.6V
ADC输入范围:VREF- ≤ VIN ≤ VREF+‘
7.2、ADC框架
组成部分:
7.2.1、ADC引脚 对于stm32f103系列单片机来讲,能测量的转化的电压范围0-3.3V。
注:超出转换测量范围需要额外增加外围电路,使其电压范围纠正到0-3.3V内,然后再进行转换测量。
引脚
7.2.2、ADC输入通道
ADC有16个外部输入通道和2路内部通道(温度传感器、内部参考电压)。
16个通道对应两种转换组:规则组和注入组,经由规则通道和注入通道转换,转换后
的数据写入对应的规则通道数据寄存器和注入通道数据寄存器*4
规则组:由多达16个转换组成
注入组:由多达4个转换组成
一般情况下我们都使用的是规则通道进行转换,转化顺序和转化总数由ADC_SQRx寄
存器进行设置;注入通道是在规则通道转换的时候强行插入的转换通道,转化顺序和转化总
数由ADC_JSQR寄存器进行设置。
利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换后。
如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫
描方式进行转换,然后恢复上次被中断的规则组通道转换;如果在注入转换期间产生一规则
事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
转换模式包括:单次转换模式、连续转换模式、间断模式和扫描模式 。 具体参考数据手册
11.3.4、11.3.5、11.3.8、11.3.10
对齐方式 :由于ADC为12bit精度,寄存器有效位16位,所有会涉及对齐方式:左对齐和右
对齐
DMA请求 :因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则
通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。
只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到
用户
指定的目的地址。
通道,和内部通道(温度传感器和Vrefint即参考电压通道)
7.2.3、ADC时钟
ADC时钟
可编程的通道采样时间 :ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可
以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改;每个通道可以分别用不
同的时间采样。
总转换时间如下计算:
TCONV = 采样时间+ 12.5个周期
例如:采样周期设置为1.5周期
TCONV = 1.5+12.5 = 14个周期
频率为14MHz时,转换一次的时间为1us
7.2.4、触发转换方式
转换可以由外部事件触发(例如定时器捕获,EXTI线)。如果设置了EXTTRIG控制位,则
外部事
件就能够触发转换。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中
某一个,可以触发规则和注入组的采样

7.2.5、ADC中断
规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都
独立的中断使能位。
转换结束以后可以触发中断,中断事件送至NVIC,切断中断控制器进行管理,最终给到cpu进行处理
7.2.6、双ADC模式
在有2个或以上ADC模块的产品中,可以使用双ADC模式,在双ADC模式里,根据
ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从
的交替触发或同步触发。
共有6种可能的模式:
─ 同步注入模式
─ 同步规则模式
─ 快速交叉模式 ─ 慢速交叉模式
─ 交替触发模式
独立模式
还有可以用下列方式组合使用上面的模式:
─ 同步注入模式 + 同步规则模式
─ 同步规则模式 + 交替触发模式
─ 同步注入模式 + 交叉模式
7.3、STM32ADC固件库函数介绍
7.3.1、ADC初始化
1 void ADC_Init ( ADC_TypeDef * ADCx , ADC_InitTypeDef * ADC_InitStruct )
ADC初始化结构体:
1 typedef struct
2 {
3 uint32_t ADC_Mode ; // 工作模式
4 FunctionalState ADC_ScanConvMode ; //ADC 扫描(多通道)使能 / 失能
5 FunctionalState ADC_ContinuousConvMode ; // 连续转换使能 / 失能
6 uint32_t ADC_ExternalTrigConv ; //ADC 触发信号选择
7 uint32_t ADC_DataAlign ; //ADC 数据对齐模式
8 uint8_t ADC_NbrOfChannel ; //ADC 采集通道
9 }
1、ADC_Mode
1 ADC_Mode_Independent //ADC1 ADC2 工作在独立模式
2 ADC_Mode_RegInjecSimult //ADC1 ADC2 工作在同步规则和同步注入模式
3 ADC_Mode_RegSimult_AlterTrig //ADC1 ADC2 工作在同步规则模式和交替触发模式
4 ADC_Mode_InjecSimult_FastInterl //ADC1 ADC2 工作在同步规则模式和快速交替模式
5 ADC_Mode_InjecSimult_SlowInterl //ADC1 ADC2 工作在同步注入模式和慢速交替模式
6 ADC_Mode_InjecSimult //ADC1 ADC2 工作在同步注入模式
7 ADC_Mode_RegSimult //ADC1 ADC2 工作在同步规则模式
8 ADC_Mode_FastInterl //ADC1 ADC2 工作在快速交替模式
9 ADC_Mode_SlowInterl //ADC1 ADC2 工作在慢速交替模式
10 ADC_Mode_AlterTrig //ADC1 ADC2 工作在交替触发模式
2、ADC_ScanConvMode
1 //ADC 的扫描模式 , 不断扫描 ADC1,2,3, 扫描多用在多通道上
2 ENABLE
3 DISABLE
3、ADC_ContinuousConvMode 1 // 连续转换模式 ,ADC 通道连续采集 , 一次采集转化完继续采集
2 ENABLE
3 DISABLE
4、ADC_ExternalTrigConv
1 // 外部触发转换选择
2 ADC_ExternalTrigConv_T1_CC1 // 选择定时器 1 的捕获比较 1 作为转换外部触发
3 ADC_ExternalTrigConv_T1_CC2 // 选择定时器 1 的捕获比较 2 作为转换外部触发
4 ADC_ExternalTrigConv_T1_CC3 // 选择定时器 1 的捕获比较 3 作为转换外部触发
5 ADC_ExternalTrigConv_T2_CC2 // 选择定时器 2 的捕获比较 2 作为转换外部触发
6 ADC_ExternalTrigConv_T3_TRGO // 选择定时器 3 TRGO 作为转换外部触发
7 ADC_ExternalTrigConv_T4_CC4 // 选择定时器 4 的捕获比较 4 作为转换外部触发
8 ADC_ExternalTrigConv_Ext_IT11 // 选择外部中断线 11 事件作为转换外部触发
9 ADC_ExternalTrigConv_None // 转换由软件而不是外部触发启动
5、ADC_DataAlign
1 #define ADC_DataAlign_Right (( uint32_t ) 0x00000000 )
2 #define ADC_DataAlign_Left (( uint32_t ) 0x00000800 )
6、ADC_NbrOfChannel
1 ADC 要转化的通道数目 , 可以设置为 1 16
7.3.2、使能/失能ADC外设
1 void ADC_Cmd ( ADC_TypeDef * ADCx , FunctionalState NewState )
7.3.3、使能/失能ADC的DMA功能
1 void ADC_DMACmd ( ADC_TypeDef * ADCx , FunctionalState NewState )
7.3.4、ADC中断功能配置
1 void ADC_ITConfig ( ADC_TypeDef * ADCx , uint16_t ADC_IT , \
2 FunctionalState NewState )
@arg ADC_IT_EOC: End of conversion interrupt mask
@arg ADC_IT_AWD: Analog watchdog interrupt mask
@arg ADC_IT_JEOC: End of injected conversion interrupt mask
7.3.5、ADC获取转换值
1 uint16_t ADC_GetConversionValue ( ADC_TypeDef * ADCx );
7.3.6、ADC获取和清除中断标志
1 ITStatus ADC_GetITStatus ( ADC_TypeDef * ADCx , uint16_t ADC_IT );
2 void ADC_ClearITPendingBit ( ADC_TypeDef * ADCx , uint16_t ADC_IT );
7.3.7、ADC预分频配置
1 void RCC_ADCCLKConfig ( uint32_t RCC_PCLK2 )
@arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4
@arg RCC_PCLK2_Div6: ADC clock = PCLK2/6
@arg RCC_PCLK2_Div8: ADC clock = PCLK2/8
7.3.8、ADC使能/失能软件触发转换
1 void ADC_SoftwareStartConvCmd ( ADC_TypeDef * ADCx , FunctionalState
NewState )
7.3.9、ADC使能/失能外部触发转换
1 void ADC_ExternalTrigConvCmd ( ADC_TypeDef * ADCx , FunctionalState NewState )
7.3.10、ADC规则转换通道配置
1 void ADC_RegularChannelConfig ( ADC_TypeDef * ADCx , uint8_t ADC_Channel , \
2 uint8_t Rank , \uint8_t ADC_SampleTime )
ADC_Channel:
1 @arg ADC_Channel_0 : ADC Channel0 selected
2 @arg ADC_Channel_1 : ADC Channel1 selected
3 @arg ADC_Channel_2 : ADC Channel2 selected
4 @arg ADC_Channel_3 : ADC Channel3 selected
5 @arg ADC_Channel_4 : ADC Channel4 selected
6 @arg ADC_Channel_5 : ADC Channel5 selected
7 @arg ADC_Channel_6 : ADC Channel6 selected
8 @arg ADC_Channel_7 : ADC Channel7 selected
9 @arg ADC_Channel_8 : ADC Channel8 selected
10 @arg ADC_Channel_9 : ADC Channel9 selected
11 @arg ADC_Channel_10 : ADC Channel10 selected
12 @arg ADC_Channel_11 : ADC Channel11 selected
13 @arg ADC_Channel_12 : ADC Channel12 selected
14 @arg ADC_Channel_13 : ADC Channel13 selected
15 @arg ADC_Channel_14 : ADC Channel14 selected
16 @arg ADC_Channel_15 : ADC Channel15 selected
17 @arg ADC_Channel_16 : ADC Channel16 selected
18 @arg ADC_Channel_17 : ADC Channel17 selected
Rank:通道采样顺序:1-16
ADC_SampleTime:
1 @arg ADC_SampleTime_1Cycles5 : Sample time equal to 1.5 cycles
2 @arg ADC_SampleTime_7Cycles5 : Sample time equal to 7.5 cycles
3 @arg ADC_SampleTime_13Cycles5 : Sample time equal to 13.5 cycles
4 @arg ADC_SampleTime_28Cycles5 : Sample time equal to 28.5 cycles 5 @arg ADC_SampleTime_41Cycles5 : Sample time equal to 41.5 cycles
6 @arg ADC_SampleTime_55Cycles5 : Sample time equal to 55.5 cycles
7 @arg ADC_SampleTime_71Cycles5 : Sample time equal to 71.5 cycles
8 @arg ADC_SampleTime_239Cycles5 : Sample time equal to 239.5 cycles
7.4、ADC实例
7.4.1、ADC单通道中断采集
1、ADC通道初始化
需要知道那些功能模块调用初始化函数
引脚先看原理图,先查看模拟量接到了那个通道上了,你接到了那个通道就对那个通道进行采集
比如ADC1/2使用ps4通道,设置ps4的引脚为模拟输入的引脚,还需要开启gpio的时钟就需要调用gdc的初始化函数,开启ADC的时钟转换完成,触发中断,NVIC也需要配置
使用的ADC1的通道4的pA4引脚,
开启对应的时钟,ADC1,GPIOA的时钟在APB2总线上
对ADC1的总线时钟进行分频,最大14m

gpio设置,gpio引脚为gpiopin4,模式为模拟输入的模式
设置初始化结构体,模式为独立模式;扫描转换模式关掉了;连续转换设置为使能了;外部触发事件关掉了;对齐方式选择为右对齐;转换的通道模式为1,;
开启中断的转换通道,设置为ADC1,通道4,1是转换顺序设置为第一次转换,转换的周期为1.5个周期
转换完成中断
使能了ADC
配置了NVIC,设置了NVIC的优先级
初始化好ADC通道,通过软件的方式开启ADC的模式转换,将转换好的结果存放到数据寄存器中,触发一个中断
到ADC中断中判断规则转换是否完成,如果是转换完成,就去读它的数据值,读取成功后赋值给一个变量,最终去清除转换的标志位
将读到的值转换成电压值,将转换的电压值通过串口的方式读取出来看有没有问题
7.4.2、ADC多通道DMA采集
配置pa4和pa5的两个引脚,再配置adc1和adc5;再开启dma的方式,通过的dma的方式将数据存放到内存上,不需要开启中断功能
开启时钟,开发ADC1的时钟,开启GPIOA的时钟到APB2上,还要开启DMA1的时钟
查看DMA1的配置,ADC1对应ADC1通道
再配置gpio4和5,这两个引脚是模拟输入的功能, 配置ADC,模式为独立模式;扫描转换模式开启了多通道扫描;开启了连续采集的功能;外部触发事件关掉了;对齐方式选择为右对齐;通道数为2; 规则通道的配置,ADC1和5,周期都是1.5个周期;转换顺序是先转换4再去转换2
开启ADC1的DMA功能,再开启ADC1 关闭了NVIC功能
开启了DMA功能 设置了DMA的外设的地址,ADC的DR的地址,将DR的值读到内存上
内存的地址,放两个转换好的值
外设的方向设置为把这个外设作为圆,从ADC1的dr中拷贝数据到内存中
buffer的大小为2个,两个通道为2
外设的地址是否递增关掉了 使能了内存的递增 ADC1的DR寄存器再转换通道4和通道5,又先后的顺序,先转换通道4再转换通道5,转换完通道4的数据就存放到DR寄存器中,再开启DMA功能,我们会把数据存放到指定的内存上,开辟的内存是定义的一个数组,把内存的地址给它,它通过DMA的方式将数据从DR上存放到数组里面,这个内存地址递增,转换通道5,转换通道5的数据存放到DR寄存器上,我们在通过DMA的方式将数据从DR上存放到数组中,转换完一次我们就可以读内存的数据了
一次拷贝的地址大小为16bit位的数据 开启的DMA模式为循环模式,循环的模式采集和读取模式
DMA的内存拷贝关掉 初始化dma通道成功
开启DMA通道为dma1 dma和ADC1初始化好了,就可以去读取DR中的数据到内存中,读取通道中断数据到数组中进行计算 就是转换后的dr值,再去测量电压值,完成多通道的adc的采集
接线方式
接入的pa4和pa5,可以通过滑动电阻调节电阻

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

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

相关文章

Transformer模型-decoder解码器,target mask目标掩码的简明介绍

今天介绍transformer模型的decoder解码器,target mask目标掩码 背景 解码器层是对前面文章中提到的子层的包装器。它接受位置嵌入的目标序列,并将它们通过带掩码的多头注意力机制传递。使用掩码是为了防止解码器查看序列中的下一个标记。它迫使模型仅使用…

WPF 多语言切换及ResourceDictionary的Source路径填写

WPF 多语言切换 1. 添加资源字典 新增两个资源字典&#xff0c;里面分别存储不同语言的文本 <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s…

使用API有效率地管理Dynadot域名,确认域名转移流程状态

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

虚拟网络设备与网络安全:深入分析与实践应用

在数字化时代&#x1f4f2;&#xff0c;网络安全&#x1f512;成为了企业和个人防御体系中不可或缺的一部分。随着网络攻击的日益复杂和频繁&#x1f525;&#xff0c;传统的物理网络安全措施已经无法满足快速发展的需求。虚拟网络设备&#x1f5a7;&#xff0c;作为网络架构中…

计算机网络——39密钥分发和证书

密钥分发和证书 可信赖中介 对称密钥问题 相互通信的实体如何分享对称密式的密钥&#xff1f; 解决办法 trusted key distribution center(KDC) 在实体之间扮演可信赖中介的角色 公共密钥问题 当Alice获得Bob的公钥(from web site,e-mail,diskette)&#xff0c;她如何知…

16、普通数组-除自身以外的数组乘积

思路 通过辅助数组的方式 第一个从左向右的辅助数组乘积第二次从右向左的辅助数组乘积对于0<i<N-1 他的数组乘积就是左边的数组乘积*右边数组乘积然后再分类讨论i0 就是右边1-N-1的数组乘积iN-1就是左边从N-2到0的数组乘积 代码如下&#xff1a; class Solution {pub…

C# 优雅的处理 TCP 数据

前言 Tcp是一个面向连接的流数据传输协议&#xff0c;用人话说就是传输是一个已经建立好连接的管道&#xff0c;数据都在管道里像流水一样流淌到对端。 那么数据必然存在几个问题&#xff0c;比如数据如何持续的读取&#xff0c;数据包的边界等。 Nagles算法 Nagle 算法的核…

电商技术揭秘十五:数据挖掘与用户行为分析

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

vue2 使用vue-org-tree demo

1.安装 npm i vue2-org-tree npm install -D less-loader less安装 less-loader出错解决办法&#xff0c;直接在package.json》devDependencies下面加入less和less-loader版本&#xff0c;然后执行npm i &#xff0c;我用的nodejs版本是 16.18.0&#xff0c;“webpack”: “^4…

Tomcat SSL/TLS Configuration

see https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html//1:use jdk keytool A:Generate Keystore 01: C:\Users\User>keytool -genkey -alias tomcat -keyalg RSA -keystore d:/ks/tomcatKeyStore //也可参考:keytool -genkeypair -alias "tomcat" -k…

番茄 abogus rpc调用

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章…

如何将h5网页打包成iOS苹果IPA文件

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;最近有很多小伙伴都被难住了&#xff0c;是什么问题给他们都难住了呢&#xff0c;许多小伙伴都说想要把h5网页打包成iOS苹果IPA文件&#xff0c;但是却不知道具体怎么操作&#xff0c;是怎么样的一个流程…

探秘大模型:《提示工程:技巧、方法与行业应用》背后的故事

提示工程是一种新兴的利用人工智能的技术&#xff0c;它通过设计提示引导生成式 AI 模型产生预期的输出&#xff0c;来提升人与 AI 的互动质量&#xff0c;激发 AI 模型的潜力&#xff0c;提升AI的应用水平。 为了让每一个人都拥有驱动大模型的能力&#xff0c;以微软全球副总裁…

基于HASM模型的高精度建模matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1HASM模型概述 4.2 HASM模型的数学表述 5.完整程序 1.程序功能描述 本课题主要使用HASM进行高精度建模&#xff0c;主要对HASM模型进行介绍以及在实际中如何进行简化实现的。HASM原始的模…

SQL注入利用学习 - 延时盲注

延时盲注原理 无法利用页面显示结果判断SQL注入是否执行成功&#xff0c;此时可以利用 SQL语句执行的延时 判断SQL是 否执行成功。 只要可以执行延时&#xff0c;那么就可以利用该注入技术。 sql时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟&#xff0c;插入的SQ…

gpt科普1 GPT与搜索引擎的对比

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的自然语言处理模型。它通过大规模的无监督学习来预训练模型&#xff0c;在完成这个阶段后&#xff0c;可以用于各种NLP任务&#xff0c;如文本生成、机器翻译、文本分类等。 以下是关…

【VUE】Vue3+Element Plus动态间距处理

目录 1. 动态间距调整1.1 效果演示1.2 代码演示 2. 固定间距2.1 效果演示2.2 代码演示 其他情况 1. 动态间距调整 1.1 效果演示 并行效果 并列效果 1.2 代码演示 <template><div style"margin-bottom: 15px">direction:<el-radio v-model"d…

【实用工具】使用飞书机器人监控工程日志

1.创建一个飞书群聊&#xff0c;设置-->群机器人-->添加机器人-->自定义机器人-->修改机器人名称-->添加 2.复制webhook地址 3.编写日志请求代码 import logging import requests import json import os from datetime import datetime import time import sub…

云平台和云原生

目录 1.0 云平台 1.1.0 私有云、公有云、混合云 1.1.1 私有云 1.1.2 公有云 1.1.3 混合云 1.2 常见云管理平台 1.3 云管理的好处 1.3.1 多云的统一管理 1.3.2 跨云资源调度和编排需要 1.3.3 实现多云治理 1.3.4 多云的统一监控和运维 1.3.5 统一成本分析和优化 1.…

【CSS】MDN

一、CSS构建 1.1 CSS选择器 1.1.1 元素选择器 标签不区分大小写 示例&#xff1a; span {background-color: yellow; }1.1.2 通用选择器 选择文档中所有内容&#xff0c;重置样式表中使用较多 鉴于div:first-child&#xff08;代表所有的div元素&#xff0c;并且是第一个…