优化ADC 采样计算的简单思路

news2025/1/11 2:46:20

想法是尽量简化ADC 采样值换算到真实电压的过程,最好是不涉及浮点运算,整数乘除法成本比较低。

原理

对于使用了分压电阻采样输入电压的情形,电路大概是这样:

在这里插入图片描述

分压比例为:

K = R 1 + R 2 R 1 (1) K = \frac{R1 + R2}{R1} \tag{1} K=R1R1+R2(1)

ADC 换算出来的电压还要再乘 K K K 才是输入电压。设ADC 的参考电压是Vref,分辨率10 位,最大值1023,也就是把Vref 一共分成1023 份。那么从ADC 值计算输入电压就是这样:

V i n = V r e f 1023 × K × A D C (2) V_{in} = \frac{V_{ref}}{1023} × K × ADC \tag{2} Vin=1023Vref×K×ADC(2)

要简化计算,就是把ADC 值要乘的系数变成整数,也就是要令:

V r e f K 1023 (3) \frac{V_{ref} K}{1023} \tag{3} 1023VrefK(3)

这个结果是整数。要注意,整体除出来的结果是整数,并不代表里面每个因子都是整数。

选择参考电压

单片机供电电压5V,所以参考电压不能超过5V,最大值就定为4.8V 好了。分压比例K 不变时,参考电压越小,能测量的外部输入电压越小。另外,参考电压越小,那么ADC 每一级对应的电压也越小,理论上精度越高,但是对噪声也越敏感。所以参考电压不能太小,就随便把最小值定为3.3V。

参考电压通过TL431 产生:

在这里插入图片描述

参考电压的计算公式是:

A r e f = 2.5 V × R 1 + R 2 R 2 (4) A_{ref} = 2.5V × \frac{R1 + R2}{R2} \tag{4} Aref=2.5V×R2R1+R2(4)

限制一下组合的数量,规定只能用两个电阻设置TL431 的电压。那么按照E24 数系,R1 和R2 的值只能在这些数字里面选:

    e24 = [1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7,
           3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8,
           7.5, 8.2, 9.1]

限制条件是:最大电压4.8,最小3.3,写个脚本来搜索所有能拿两个电阻组合出来的电压:

# unit 是电压单位对应的放大倍数
def find_v(v_min, v_max, unit):
    print('v, r1, r2')
    v_list = []
    r_min = v_min / 2.5
    r_max = v_max / 2.5
    for r2 in e24:
        for r1 in e24:
            k = (r1 + r2) / r2
            if(k >= r_min and k <= r_max):
                v = 2.5 * k * unit
                print(f'{v}, {r1}, {r2}')
                v_list.append(v)
    return v_list

计算中,电压的单位选择微伏(μV),因为如果用V 做单位,除非参考电压达到了上千伏,不然除以1023 肯定都不是整数。所以unit 参数用1e6,运行:

vref = find_v(3.3, 4.8, 1e6)

输出的电压有几百种,用CSV 格式,大概是这样:

v, r1, r2
4772727.2727272725, 1.0, 1.1
4583333.333333334, 1.0, 1.2
4791666.666666666, 1.1, 1.2
4423076.923076922, 1.0, 1.3
4615384.615384616, 1.1, 1.3
4166666.666666667, 1.0, 1.5
4333333.333333334, 1.1, 1.5
4500000.0, 1.2, 1.5
4666666.666666666, 1.3, 1.5
4062500.0, 1.0, 1.6
4218750.0, 1.1, 1.6
4374999.999999999, 1.2, 1.6
4531250.000000001, 1.3, 1.6
3888888.8888888885, 1.0, 1.8
4027777.7777777775, 1.1, 1.8
4166666.666666666, 1.2, 1.8
4305555.555555555, 1.3, 1.8
4583333.333333333, 1.5, 1.8
4722222.222222222, 1.6, 1.8
3750000.0, 1.0, 2.0

...

里面可能有重复的,但是不影响,之后要综合分压比例K,从里面选一个。

选择分压电阻

分压电阻的选择也有限制,就是分压比例不能太大。很简单,太大的话输入到ADC 的电压太低,测量精度下降。预定输入电压最大30V 左右,所以分压比例定为6 倍以上,满足输入电压范围的前提下越小越好。

分压比例大于2,R2 肯定大于下拉电阻R1,R2 的值可以比R1 大一个数量级。比如,若K = 10,R1 = 1k,那么R2 是10k,所以R2 的取值范围要增加一倍。

bigger = e24 + [r * 10 for r in e24]

bigger 是R2 的取值范围。然后再写一段脚本,暴力搜索两个分压电阻和参考电压的组合,让式3 的结果是整数:

def find_k(vref_list):
    print('k, r1, r2, d, vref')
    for r2 in e24:
        for r1 in bigger:
            if(r1 < r2):
                continue

            k = (r1 + r2) / r2
            for v in vref_list:
                d = v * k / (2 ** 10 - 1)
                if(abs(int(d) - d) < 1e-8):
                    print(f'{k}, {r1}, {r2}, {int(d)}, {v}')

运行:

find_k(vref)

这下满足要求的结果就不太多了:

k, r2, r1, d, vref
6.6, 5.6, 1.0, 25000, 3875000.0
31.0, 30.0, 1.0, 125000, 4125000.0
31.0, 30.0, 1.0, 100000, 3300000.0000000005
31.0, 33.0, 1.1, 125000, 4125000.0
31.0, 33.0, 1.1, 100000, 3300000.0000000005
31.000000000000004, 36.0, 1.2, 125000, 4125000.0
31.000000000000004, 36.0, 1.2, 100000, 3300000.0000000005
30.999999999999996, 39.0, 1.3, 100000, 3300000.0000000005
46.5, 91.0, 2.0, 187500, 4125000.0
46.5, 91.0, 2.0, 150000, 3300000.0000000005
4.125, 7.5, 2.4, 15625, 3875000.0
6.2, 39.0, 7.5, 25000, 4125000.0
6.2, 39.0, 7.5, 20000, 3300000.0000000005

一共就上面这些。从第一列开始,k 是分压比例;r2 和r1 是对应的电阻取值;d 是ADC 要乘的系数,单位是微伏;vref 是选中的参考电压。运气不错,刚好有很接近6 的比值:

k, r2, r1, d, vref
6.6, 5.6, 1.0, 25000, 3875000.0
6.2, 39.0, 7.5, 25000, 4125000.0

第一组参考电压3.875V,分压比例6.6,ADC 系数是25mV,也就是ADC 每一级对应的输入电压是25mV。第二组参考电压4.125V,比例6.2,ADC 系数相同,不知道是单纯巧合,还是有什么数学原理。虽然第二组似乎更理想,比例更接近6,但是我选了第一组。有两点原因:

  1. 第二组两个电阻都是不太常用的值,第一组里的1k 很常用;
  2. 第二组里的39k 电阻感觉有点大了,可能会影响ADC 采样速度;

如果考虑上两个电阻串联、并联当一个电阻用的情况,组合的规模估计会增加好几个数量级,有可能过滤出全部由常用阻值构成的组合,但是我太懒了。顺便,对应3.875V,TL431 的两个电阻分别是1.1k 和2k。

缺点

这么整能成的前提是电阻和参考电压的精度都比较高,所以程序里可以直接用25mV 作为理想值来计算;或者测量精度要求不高,但也不那么低。如果用了外部基准电压来校准ADC 系数,这么整就完全白费力气。

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

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

相关文章

java 实现N次多项式回归

使用的类库 org.apache.commons.math3 maven <dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version> </dependency> 推荐工具 如果只是做学术研究用&…

摩托车外廓尺寸检测软件

本系统为摩托车外廓尺寸检测软件&#xff0c;该系统共涉及两种测量方法&#xff1a;自动测量和手动测量&#xff0c;旨在测量出每一台摩托车的外廓尺寸&#xff0c;包括但不限于摩托车的车长、车宽、车高、轮距、前悬、后悬、前伸距等需要测量的参数&#xff0c;可通过运行软件…

ATFX汇市:美元指数强势状态延续,市价逼近104关口

环球汇市行情摘要—— 昨日&#xff0c;美元指数上涨0.27%&#xff0c;收盘在103.61点&#xff0c; 欧元贬值0.48%&#xff0c;收盘价1.0846点&#xff1b; 日元贬值0.24%&#xff0c;收盘价145.87点&#xff1b; 英镑贬值0.19%&#xff0c;收盘价1.2733点&#xff1b; 瑞…

Vulnhub: bassamCTF: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.210 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.210 修改hosts文件 爆破出子域名welcome wfuzz -H HOST: FUZZ.bassam.ctf -u http://192.168.111.210 -w /usr/share/wor…

GB28181视频监控国标平台EasyGBS角色绑定设备通道的功能优化

GB28181视频监控国标平台EasyGBS是基于国标GB28181协议、支持多路设备同时接入的视频监控/视频云服务平台&#xff0c;支持对多平台、多终端分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。国标GB28181平台EasyGBS可提供视频直播监控、云端录像、云存储、检索回放、智能告警…

电子器件系列47:稳压二极管

C80857_稳压二极管_BZX84C15LT1G_规格书_ONSEMI(安森美)稳压二极管规格书 232-稳压二极管的串联使用&#xff0c;和普通二极管串联也能灵活稳压_哔哩哔哩_bilibili 基本释义    稳压二极管&#xff0c;英文名称Zener diode&#xff0c;又叫齐纳二极管。    利用pn结反向击穿…

IPv6 基础概念

IPv6 基础概念 组播地址 IPv6的组播与IPv4相同&#xff0c;用来标识一组接口&#xff0c;一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。例如组播地址FF02::1表示链路本地范围的所有节点&#xff0c;组播地址…

什么是3D智慧档案馆?智慧档案馆如何建设?

档案馆3D可视化解决方案 一、引言 随着科技的飞速发展和数字化转型的推进&#xff0c;档案馆作为文化遗产和重要信息的保管者&#xff0c;面临着新的挑战和机遇。为了更好地保护和管理档案资料&#xff0c;提高档案馆的管理效率和透明度&#xff0c;我们提出了一种档案馆3D可视…

代驾系统:革新出行体验的智能伙伴

在现代社会&#xff0c;出行方式正在经历着一场革命&#xff0c;而代驾系统正是这场革命中的一位智能伙伴。通过结合智能科技和出行需求&#xff0c;代驾系统为我们带来了便捷、安全、个性化的出行体验。本文将介绍代驾系统的工作原理&#xff0c;并通过Python代码演示其基本功…

ChatGLM-Med,HuaTuo,ChatDoctor

ChatGLM-Med&#xff1a;基于中文医学知识的ChatGLM模型微调 HuaTuo&#xff1a;基于中文医学知识的LLaMA微调模型 ChatDoctor&#xff1a;基于常见医疗数据微调的LLaMA 目录 ChatGLM-MedHuaTuoChatDoctor ChatGLM-Med 模型为ChatGLM-6B&#xff0c;微调数据集为&#xff1a;医…

uniapp使用uni.chooseLocation()打开地图选择位置

使用uni.chooseLocation()打开地址选择位置&#xff1a; 在Uniapp源码视图进行设置 添加这个属性&#xff1a;"requiredPrivateInfos":["chooseLocation"] ​ </template><view class"location_box"><view class"locatio…

repair taillights

自己修理汽车尾灯&#xff0c;可以根据型号去某宝买个回来自己安装&#xff1a;

【前端从0开始】JavaSript——js基础语法

1. JS基础语法 1.1. JS概念 JavaScript 是用于实现用户交互、动态控制文档的外观和内容, 动态控制浏览器操作、创建cookies等网页行为的跨平台、跨浏览器的由浏览器解释执行的客户端脚本语言。 js文档 1.2. 特点 是基于对象的弱类型语言 弱类型语言: 某一个变量被定义类型…

HDLBits-Verilog学习记录 | Verilog Language-Vectors(1)

文章目录 11.vectors | vector012.vectors in more detail | vector113.Vector part select | Vector214.Bitwise operators | Vectorgates15.Four-input gates | Gates416.Vector concatenation operator | Vector317.Vector reversal 1 | Vectorr18. Replication operator | …

石油和天然气行业如何实现数字化转型和工业4.0

石油和天然气行业的数字化转型正面临着前所未有的挑战和机遇。尽管过去相对滞后&#xff0c;这个复杂而庞大的行业正逐渐意识到数字化的紧迫性&#xff0c;以应对市场变化、降低运营成本、提高效率和确保可持续性。然而&#xff0c;数字化转型的进程并非一帆风顺&#xff0c;行…

字节跳动基于DataLeap的DataOps实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 本文根据 ArchSummit 全球架构师峰会&#xff08;深圳站&#xff09;来自抖音数据研发负责人王洋的现场分享实录整理而成&#xff08;有删减&#xff09;&#xff0…

高能预警!企业出海如何玩转数字营销?

现阶段&#xff0c;企业纷纷步入数字营销的浪潮。然而&#xff0c;数字营销并非一项易事。它需要企业在多个方面进行深入思考和全面规划。数字营销虽具有广阔的发展前景&#xff0c;但企业需投入大量精力和资源&#xff0c;才能实现可持续发展和成功。 其实&#xff0c;营销的…

Scikit-learn强化学习代码批注及相关练习

一、游戏介绍 木棒每保持平衡1个时间步&#xff0c;就得到1分。每一场游戏的最高得分为200分每一场游戏的结束条件为木棒倾斜角度大于41.8或者已经达到200分。最终获胜条件为最近100场游戏的平均得分高于195。代码中env.step&#xff08;&#xff09;&#xff0c;的返回值就分…

超全!年薪40w项目经理都在用的10个管理工具

大家好&#xff0c;我是老原。 今天的文章&#xff0c;当然还是干货为主。 这期给你安利一些免费、好用、高效、简洁的项目管理工具&#xff0c;这些工具都非常适合从事项目的打工人使用。 其实对于工作比较久的职场人来说&#xff0c;会有一个思维惯性&#xff0c;就是对免…

聚焦重要数据价值丨DolphinDB 降采样算法介绍

1. 绪论 在真实的业务场景中&#xff0c;时间序列数据具有以下特点&#xff1a; 采集频率&#xff08;秒级甚至毫秒级&#xff09;高&#xff0c;导致数据量非常庞大。数据价值密度低。 对数据进行合理的降采样不仅极大地可以降低系统压力、节约存储成本&#xff0c;同时也可…