当前位置: 首页 > news >正文

江科大/江协科技 STM32学习笔记P21

文章目录

  • ADC模数转换器
    • ADC简介
    • 逐次逼近型ADC
    • STM32的ADC
    • ADC基本结构
    • 输入通道
    • 转换模式
      • 单次转换,非扫描模式
      • 连续转换,非扫描模式
      • 单次转换,扫描模式
      • 连续转换,扫描模式
    • 触发控制
    • 数据对齐
    • 转换时间
    • 校准
    • 硬件电路
      • 电位器产生可调电压的电路
      • 传感器输出电压的电路
      • 电压转换电路


ADC模数转换器

ADC简介

在这里插入图片描述
有ADC也有DAC数字模拟转换器,使用DAC可以将数字变量转化为模拟电压,与PWM相比较,PWM也有DAC的功能,同时PWM只有完全导通和完全断开两种状态,没有功率损耗,在直流电机调速这种大功率的应用场景使用PWM来等效模拟量比DAC更好。DAC的应用主要在波形生成,比如信号发生器、音频解码芯片等。
AD转换需要花一小段时间,1us表示从AD转换开始到产生结果需要1us,对应AD转换的频率就是1MHz,是STM32ADC的最快转换频率。
两个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测CPU温度,内部参考电压是1.2V左右的基准电压,不随外部供电电压变化而变化,如果芯片的供电不是标准3.3V,测量外部引脚的电压可能不对,这时可以读基准电压进行校准。
普通的AD转换流程是启动一次转换读一次值,再启动再读值,但STM32的ADC可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,一个用于常规使用的规则组,一个用于突发事件的注入组。
ADC一般可以用于测量光线强度、温度这些值,并且经常有需求,如果高于某个阈值或低于某个阈值执行一些操作,判断高于或低于可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当高于或低于它设定的阈值时申请中断,就可以在中断函数里执行相应的操作,这样就不用不断手动读值再if判断了。

逐次逼近型ADC

在这里插入图片描述

地址锁存和译码的作用是,想选中哪一路就把通道号放在ADDA、ADDB、ADDC这三个脚上,然后给一个锁存信号,上面对应的通路开关就自动拨好了。
之后看电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,两个输入端,一个是待测电压,另一个是DAC的电压输出端,DAC内部是使用加权电阻网络来实现的转换,当输入一个未知编码的电压,和一个DAC输出的已知编码的电压,两个同时输出到电压比较器进行大小判断,如果DAC输出的电压比较小,就增大DAC数据,直到DAC输出的电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了。电压调节的过程就是逐次逼近SAR来完成的,通常用二分法进行寻找电压,比如这里八位DAC,编码0-255,第一次比较给255的一半128,如果DAC电压大了,第二次比较给128的一半64…,对于8位ADC,依次判断8次就能找到未知电压的编码,对于12位的ADC判断12次。这就是逐次逼近的过程。
EOC是End of Convert转换结束信号,START是开始转换,给一个输入脉冲开始转换CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,需要时钟进行推动,VREF+和VREF-s是DAC的参考电压,DAC的参考电压也决定了ADC的输入范围,所以也是ADC参考电压

STM32的ADC

在这里插入图片描述
规则通道组最多选16个通道,但是规则通道取出结果时前15个数据会被覆盖掉,依次只能留一个数据,需要配合DMA进行数据转运。注入通道最多选4个通道,而且有四个数据寄存器,不用担心数据覆盖
在这里插入图片描述

左下角是触发转换的部分,也就是START信号开始转换。对于STM32的ADC,触发转换的信号有两种,一种是软件触发,在程序中手动调用一条代码启动转换,另一种是硬件触发,就是左下角这些触发源,主要来自于定时器,有定时器的各个通道还有TRGO定时器主模式的输出,定时器可以通向ADC、DAC这些外设用于触发转换,因为ADC经常需要过一个固定时间段转换一次,比如每隔1ms转换一次,如果正常用定时器每隔1ms申请一次中断会频繁进中断对程序有影响,像这种需要频繁进中断,并且在中断只完成了简单工作的情况,用硬件进行支持,比如这里给TIM3定1ms时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC选择开始触发信号为TIM3的TRGO(‌Trigger Output)‌,这样TIM3的更新事件就能通过硬件自动触发ADC转换,这就是定时器触发的作用。
在这里插入图片描述
V R E F + V_{REF+} VREF+ V R E F − V_{REF-} VREF是ADC的参考电压,决定了ADC输入电压的范围,下面VDDA和VSSA是ADC的供电引脚,一般情况下 V R E F + V_{REF+} VREF+接VDDA,但我们学的这款芯片没有,在内部已经和VDDA连接在一起了,VDDA接3.3V 、VSSA接GND,所以ADC的输入电压范围就是0-3.3V。
右边的ADCCLK是ADC的时钟,也就是上面的CLOCK,用于驱动内部逐次比较的时钟,来源于以ADC预分频器,来源与APB2时钟。
在这里插入图片描述

模拟看门狗里面可以存一个阈值高限和阈值低限,如果启动了模拟看门狗,并且指定了看门的通道,那这个看门狗就会关注它看门的通道,一旦超过阈值范围就是申请看门狗的中断,最后通向NVIC。对于规则组和注入组而言,转换完成后,也会有一个EOC转换完成的信号,EOC是规则组的完成信号,JEOC是注入组完成的信号,这两个信号会在状态寄存器里置一个标志位,读取标志位就能知道是不是转换结束了,同时这两个标志位也可以去NVIC申请中断,如果开启了NVIC对应的通道,它们就会触发中断

ADC基本结构

在这里插入图片描述

输入通道

在这里插入图片描述
在这里插入图片描述

ADC12_IN0的意思是ADC1和ADC2和IN0都是在PA0上,下面全是ADC12说明ADC1和ADC2的引脚全都是相同的,作用是双ADC模式,ADC1和ADC2一起工作,他俩可以配合组成同步模式、交叉模式等,交叉模式就是ADC1和ADC2交叉对一个通道进行采样,进一步提高采样率,ADC1和ADC2也可以分开使用,分别对不同的引脚进行采样

转换模式

单次转换,非扫描模式

在这里插入图片描述

非扫描模式下只有序列一的通道有效,触发转换ADC就会对通道2进行模数转换,过一小段时间转换完成,结构放在数据寄存器,同时给EOC标志位置置1,判断EOC标志位来决定什么时候读数据寄存器。如果想要再一次转换,就需要再触发一次,如果想换一个通道转换,转换之前把第一个位置的通道2改成其他通道,然后再启动转换

连续转换,非扫描模式

在这里插入图片描述

非扫描模式还是只用序列1,但连续转换,转换结束后不会停止,而是立刻开启下一轮转换,一直持续下去,这样只需要一开始触发一次,之后就可以一直转换了。这个模式的好处是开始转换之后不需要等待一段时间,因为一直在转换,想要读AD值的时候直接从数据寄存器读就是了。

单次转换,扫描模式

在这里插入图片描述

单次转换,没触发一次,转换结束后停下来。扫描模式会用到“菜单列表”,可以在菜单里点菜,第一个菜是通道2,第二个菜是通道5…初始化结构体力多了一个通道数目参数,告诉主机用到了几个序列,比如指定通道数目为7,就只看前7个位置,每次触发后依次对前7个位置进行AD转换,转换结果都放在数据寄存器里,为了防止数据被覆盖需要用DMA及时将数据挪走。7个通道转换完成之后产生EOC信号转换结束,然后再触发下次,开始新一轮转换。

连续转换,扫描模式

一次转换后立刻开始下一次的转换。另外注意扫描模式的情况下还有一种模式是间断模式,它的作用是在扫描的过程中每隔几个转换就暂停一次,需要再次触发才能继续

触发控制

在这里插入图片描述

具体是引脚还是定时器,需要用AFIO重映射来确定。软件控制位是我们之前说的软件触发,这些触发信号可以通过设置右边寄存器来选择

数据对齐

在这里插入图片描述

数据右对齐,高位补0,数据左对齐,低位补0。一般用数据右对齐,因为右对齐直接读出寄存器的值就是转换结果,如果选择左对齐,直接读得到的数据会比实际的大,因为数据左对齐实际上是把数据左移了四次,相当于把结果乘以16。左对齐的作用是如果不想要很高的分辨率,可以选择左对齐,再把数据的高8位取出,这样就舍去了后四位的精度,12位的ADC退化为8位ADC。

转换时间

在这里插入图片描述

为什么需要采样和保持?
AD转换就是后面的量化编码,需要一小段时间,如果这一小段时间里输入的电压还在不断变化,就无法定位输入电压到底在哪,所以在量化编码之前设置一个采样开关,先打开采样开关收集外部的电压,比如可以用一个小容量的电容存储一下电压,存储好之后断开采样开关再进行后面的AD转换。这样在量化编码的期间,电压始终保持不变,这样才能精确定位未知电压的位置,这就是采样保持电路,采样保持的过程中需要闭合采样开关,过一段时间再断开。
采样时间是采样保持花费的时间,可以在程序中配置,采样时间越大越能避免毛刺信号的干扰,不过转换时间也会相应延长,12.5个ADC周期是量化编码花费的时间,因为是12位ADC,所以花费12个周期,ADC周期就是从RCC分频过来的ADCCLK,最大是14MHz,下面是最快1us时间计算来源。

校准

在这里插入图片描述
校准过程是固定的,只需要在ADC初始化的最后加几条代码就行了。

硬件电路

在这里插入图片描述

电位器产生可调电压的电路

电位器产生一个可调的电压,电位器两个固定端一个接3.3V一个接GND,中间滑动端电压在这之间,一般接KΩ级的电阻,比如这里10k的电阻,这就是电位器产生可调电压的电路。

传感器输出电压的电路

中间是传感器输出电压的电路,一般像光敏电阻、热敏电阻、红外接收器、麦克风等,都可等效为一个可变电阻,电阻阻值没法直接测量,通过和一个固定电阻串联分压来得到一个反应电阻值电压的电路,传感器阻值变小,下拉作用变强,输出端电压就下降…固定电阻一般选和传感器阻值相近的电阻,这样可以得到一个位于中间电压区域比较好的输出。

电压转换电路

使用电阻进行分压,上面阻值17K,下面33K,加一起50K,根据分压公式,中间电压是VIN/50K*33K,最后得到的电压范围就是0-3.3V,就可以进入ADC转换了,如果电压再高不建议使用这个电路,高电压采集最好使用专门的采集芯片,比如隔离放大器等等,做好高低电压的隔离,保证电路安全

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 加密案例分享:电子设备制造行业
  • 鸿蒙(API 12 Beta2版)媒体开发【Audio Kit简介】音频服务
  • python实战:数据分析基础知识
  • MySQL——索引(三)删除索引
  • 【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign
  • flink1.18 编译遇到的问题
  • AI入门指南(二):算法、训练、模型、大模型是什么?
  • 【Linux】Ubuntu20.04系统中能在命令行ping通百度等网站,而在浏览器中不能上网的问题解决方法
  • OracleDatabaseException:sequence is not exist
  • 2.类和对象(上)
  • 009 | 上证50ETF基金数据分析及预测
  • Golang编译-如何忽略某些文件去编译
  • Redis 缓存击穿、穿透、雪崩
  • 8月6日Spring Boot学习笔记
  • 三体系认证:企业发展的战略必选项
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • CSS 提示工具(Tooltip)
  • mysql 5.6 原生Online DDL解析
  • Redux 中间件分析
  • Vue--数据传输
  • 关于Flux,Vuex,Redux的思考
  • 离散点最小(凸)包围边界查找
  • 如何编写一个可升级的智能合约
  • 我是如何设计 Upload 上传组件的
  • 一个SAP顾问在美国的这些年
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 阿里云移动端播放器高级功能介绍
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​ArcGIS Pro 如何批量删除字段
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #QT项目实战(天气预报)
  • (3)(3.5) 遥测无线电区域条例
  • (javascript)再说document.body.scrollTop的使用问题
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .axf 转化 .bin文件 的方法
  • .bashrc在哪里,alias妙用
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET C# 操作Neo4j图数据库
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET性能优化(文摘)
  • .net专家(高海东的专栏)
  • /3GB和/USERVA开关
  • /usr/bin/env: node: No such file or directory
  • @Autowired和@Resource装配
  • @Bean注解详解
  • [20171106]配置客户端连接注意.txt
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [AIGC] Java 和 Kotlin 的区别
  • [AIGC] Spring Interceptor 拦截器详解