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,可以通过滑动电阻调节电阻

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件输入/输出流(I/O)

文章目录 前言一、文件输入\输出流是什么?二、使用方法 1.FileInputStream与FileOutputStream类2.FileReader与FileWriter类总结 前言 对于文章I/O(输入/输出流的概述),有了下文。这篇文章将具体详细展述如何向磁盘文件中输入数据,或者读取磁…

【Android】apk安装报错:包含病毒: a.gray.BulimiaTGen.f

​ 有时候apk安装或者更新时,显示:[高风险]包含病毒: a.gray.BulimiaTGen.f这种bug; 原因:这是手机管家误报病毒。 处理方法:我看网上其他资料可以进行申诉,也可以进行apk加固,我这边尝试用360…

微信小程序制作圆形进度条

微信小程序制作圆形进度条 1. 建立文件夹 选择一个目录建立一个文件夹,比如 mycircle 吧,另外把对应 page 的相关文件都建立出来,包括 js,json,wxml 和 wxcc。 2. 开启元件属性 在 mycircle.json中开启 component 属…

数据结构与算法——字符串暴力匹配

一、字符串的组成 1.数据域,字符串的内容 2.字符串的长度 二、模式匹配-暴力匹配原理 1.两个字符串一个主串一个模式串用两个指针对其进行匹配 2、两个指针所对应的值相同时继续匹配下一个 3、当出现不匹配的情况时,回溯主串的指针到刚开始起点的下一个位…

大气负氧离子自动监测系统

TH-FZ4随着旅游旺季的到来,越来越多的人选择走出家门,感受大自然的魅力。然而,在享受美丽风景的同时,我们是否也关注到了身边空气质量的变化?今天,就让我们一起了解一种神奇的监测系统——大气负氧离子自动…

【STL】list的模拟实现

目录 前言 list概述 list的节点 list的迭代器 list的结构 构造与析构 拷贝构造与赋值 list的元素操作 insert() push_back() push_front() erase() pop_back() pop_front() clear() swap() size() 完整代码链接 前言 如果你对链表还不熟悉或者忘了的话…

手机银行客户端框架之mPaaS介绍

移动开发平台(Mobile PaaS,简称 mPaaS)是源于支付宝 App 的移动开发平台,为移动开发、测试、运营及运维提供云到端的一站式解决方案,能有效降低技术门槛、减少研发成本、提升开发效率,协助企业快速搭建稳定…

Harmony鸿蒙南向驱动开发-SPI

SPI即串行外设接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。SPI是由Motorola公司开发,用于在主设备和从设备之间进行通信。 运作机制 在HDF框架中,SPI的接口适配模…

#5松桑前端后花园周刊-JavaScript引擎和JavaScript运行时之间的区别

行业动态 TC39 Signals 提案 一个早期提案:给 ECMAScript/JavaScript 带来一个新特性 signals,该提案从一系列流行的框架中引入了一些想法。提案解释 signals 是一种数据类型,它通过模拟状态单元和从其他状态/计算中派生的计算来实现单向数…

免费ssl证书能一直续签吗?如何获取SSL免费证书?

免费SSL证书是否可以一直续签。我们需要了解SSL证书的基本工作原理。当你访问一个使用HTTPS协议的网站时,该网站实际上在使用一个SSL证书。这个证书相当于一个数字身份证明,它验证了网站的真实性和安全性。而这个证明是由受信任的第三方机构——通常是证…

jvm中jdk常用的几个命令总结

1.jmap 此命令可以用来查询内存信息&#xff0c;实例个数及占用内存大小 1.1 查看堆内存概要信息&#xff08;内存分配统计&#xff09; jmap -histo[:live] <pid> .-histo&#xff1a;显示堆中对象的统计信息&#xff0c;包括每个类的实例数量、占用内存大小等 :live…

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区&#xff1a;开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区&#xff1a;开源数据库官方网站官方介绍贡献攻略开源技术…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day7

Day7 Regression Case study &#xff08;预测宝可梦的cp&#xff09; Regression 可以做什么&#xff1f; 股票预测 自动驾驶 推荐 预测宝可梦的cp&#xff08;能力类似这样的属性把&#xff09; 这里突然想到&#xff0c;是不是可以用洛克王国和赛尔号做事情哈哈 注意&#…

解决苹果iMac的M1芯片Node Sass does not yet support your current environment的问题

问题背景 如图所示&#xff0c;这是我的电脑&#xff0c;M1芯片 启动前端项目老是报错&#xff0c;说node Sass不支持我当前的环境&#xff0c;同事的macBook是intel芯片的&#xff0c;就能跑起项目来 很烦 但是不慌&#xff01;&#xff01;&#xff01; 咱有解决方法啦&a…

【C 数据结构】线性表

文章目录 【 1. 线性表 】【 2. 顺序存储结构、链式存储结构 】【 3. 前驱、后继 】 【 1. 线性表 】 线性表&#xff0c;全名为线性存储结构&#xff0c;线性表结构存储的数据往往是可以依次排列的&#xff08;不考虑数值大小顺序&#xff09;。 例如&#xff0c;存储类似 {1…

Visual Studio C++ 正确创建项目与更改文件名

1、创建项目 1&#xff09;打开Visual Studio&#xff0c;选择创建新项目。 2&#xff09;创建空项目 3&#xff09;配置新项目&#xff0c;注意不要勾选 " 将解决方案和项目放在同一目录中 " 。并将位置的文件夹设为与解决方案同名&#xff0c;方便管理。项目名称则…

客户关系CRM管理系统源码 企业crm管理系统

客户关系CRM管理系统源码 企业crm管理系统 系统功能介绍 1、 公海管理&#xff1a;公海类型、客户公海。 2、 线索管理&#xff1a;我的线索、线索列表、线索状态、线索来源。 3、 客户管理&#xff1a;我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、…

Docker Compose 一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

SOCKS代理是如何增强网络隐私?

在数字化时代&#x1f310;&#xff0c;网络隐私的重要性日益凸显。个人和组织都在寻找有效的方法来保护自己的网络活动不受侵犯。SOCKS代理作为一种流行的网络协议&#xff0c;提供了一种有效的手段来增强网络隐私。本文将详细介绍SOCKS代理是如何工作的&#xff0c;以及它是如…