
电压电流表
简介
本项目是基于立创·地文星-CW32F030C8T6开发板设计,适合新手上手单片机开发流程。
简介:本项目是基于立创·地文星-CW32F030C8T6开发板设计,适合新手上手单片机开发流程。开源协议
:GPL 3.0
描述
一、设计背景
ADC(Analog-to-Digital Converter,即模拟-数字转换器)是电子系统中不可或缺的关键组件,它将连续的模拟信号转换为数字信号,为数字处理和分析提供了可能。ADC在信号转换、测量与数据采集、控制系统输入以及通信与信号处理等方面发挥着重要作用,其广泛的应用促进了各行业电子设备的智能化和精确控制,是推动现代科技进步的关键因素之一。
数字电压电流表结合了ADC的技术与电路测量原理,能够精确地将模拟的电压电流信号转换为数字显示,便于电子工程师直观读取和分析。这种设备不仅提高了电路测量的准确性和效率,还帮助工程师更好地理解电路行为,是进行电子设计和故障排查的得力助手,对电子工程师的工作具有重要的辅助作用。在产品应用上,数字电压电流表确保了电路设计的准确性和安全性,同时也为产品的质量控制和后期维护提供了有力支持。
台式数字万用表(Agilent 34401A)

学习设计和制作一个数字电压电流表对于个人专业技能的提升是非常有益的。数字电压电流表项目涵盖了微控制器电路的设计与实现、信号采集与处理电路的设计、用户界面的开发与优化以及产品外观的设计等多个方面,融合了电子技术、微控制器编程、电路设计以及工业设计等多领域知识。考虑到初学者的学习进度与知识吸收能力,我们特别推出了这一入门级的数字电压电流表项目,非常适合电子技术的初学者以及想要深入学习微控制器应用的人群。该项目具备以下几个亮点:
- 采用核心板加扩展板设计理念,采用插件器件设计,让学习更能简单,让探索能更深入;
- 核心板选用国产武汉芯源半导体CW32为主控,同时兼容同类型其他款式开发板;但CW32更有优势。
- 项目综合程度高,实用性强,设计完成后可作为桌面日常仪表使用;
- 项目学习资料丰富,包括电路设计教学、PCB设计、代码编程的学习以及工程师调试能力的培养。
二、硬件设计
1.项目原理图
本项目电路图采用模块化绘制,在电路图中对不同模块使用线条进行了分区以便于读图,下面将分模块对电路图进行分析。

2.电路分析
1.供电电路

LDO(低压差线性稳压器)选型
本项目使用LDO作为电源,考虑到实际的电压表头产品多在24V或36V供电的工业场景中应用,本项目选择了最高输入
电压高达40V的SE8550K2作为电源。本项目没有使用DCDC降压电路来应对大压差的主要原因为避免设计过程中引入DCDC
的纹波干扰,次要原因为降低项目成本。

二极管防反接
考虑到高电压反接将会给模块带来不可逆的损坏,电压表头供电电路采用了串联二极管的方案进行防反接。
注:本项目使用串联二极管进行防反接考虑到了本设备供电电压通常高于5V的使用场景,二极管的0.7V压降将不会供
电造成影响。当供电电压较低时,由于项目的总体功耗较低,实测供电电流较低(20mA),由于肖特基二极管
D4(1N5819)独特的结构,相比于通用开关二极管等,VF更低,如下图可见,压降约为0.2V以内。


串联小电阻(10Ω)的作用
本项目额外使用了串联小电阻(10Ω)来进行分压操作,一方面减少在高电压情况下LDO由于较大的压差导致发热严重
的问题。另一方面,利用了串联的10欧姆小功率电阻过电流小的原理,充当低阻值保险丝,具有电路过流保护或者短路
保护作用。(电阻做保险丝这个点,因为电阻在过流状态,处于发热状态,99%都是开路,它基本不会短路。它的故障
分析就决定了它基本上以开路为主。也就是烧断掉,不会短在一起。)
串联的小电阻(10Ω)还可降低上电冲击的峰值,避免冲击过高损坏LDO。
如果没有使用电解电容,串联的小电阻(10Ω)也可避免热插拔的时候,导线电感和陶瓷电容形成谐振,因为陶瓷电容
具有非常小的ESR,导致LC网络中的阻尼很少,谐振点的增益会很高,加入外部电阻提供阻尼后就可以抑制谐振点的增
益。
2.MCU选型
本项目使用立创·地文星CW32F030C8T6开发板(核心板)作为主控,便于新人入手,可以根据CW32开发板资料进行学习。
章节资料下载链接
链接:https://pan.baidu.com/s/1erHWOS6Gej_82cJVNF_jdw?pwd=LCKF 提取码:LCKF
由于本项目是电流电压表,需要通过ADC进行采样,对其精度有一定要求,CW32在本项目中的重要优势
- 宽工作温度:-40~105℃的温度范围
- 宽工作电压:1.65V~5.5V (STM32仅支持3.3V系统)
- 超强抗干扰:HBM ESD 8KV 全部ESD可靠性达到国际标准最高等级(STM32 ESD2KV)
- 本项目重点-更好的ADC:12位高速ADC 可达到±1.0LSB INL 11.3ENOB 多种Vref参考电压(STM32仅支持VDD=Vref)
- 稳定可靠的eFLASH工艺。(Flash0等待)
CW32的ADC主要特性
本项目需重点关注 4路参考电压源。内容来自《CW32x030 用户手册》

3.电压采样电路
本项目采用分压电路实现高电压采集,设计可采集电压100V,当前配置采集电压为0-30V

本项目设计分压电阻为220K+10K,因此分压比例为22:1(ADC_IN11)
分压电阻选型
1. 设计测量电压的最大值,出于安全考虑,本项目为30V(实际最大可显示99.9V或100V);
2. ADC参考电压,本项目中为1.5V,该参考电压可以通过程序进行配置;
3. 为了降低采样电路的功耗,通常根据经验值将低侧电阻(R7)选择为10K;
随后便可以通过以上参数计算出分压电阻的高侧电阻:
1.计算所需的分压比例:即ADC参考电压:设计输入电压,通过已知参数可以计算出1.5V/30V=0.05
2.计算高侧电阻:即低侧电阻/分压比例,通过已知参数可以计算出10K/0.05=200K
3. 选择标准电阻:选择一颗略高于计算值的电阻,计算值为200K,通常我们选择E24系列电阻,因此本项目中选择大于200K且最接近的220K。
如果在实际使用中,需要测量的电压低于2/3的模块设计电压,即66V,则可以根据实际情况更换分压电阻并修改程序从而提升测量的精度,下面将进行案例说明:
1.假设被测电压不高于24V,其他参数不变
2.通过计算可以得到1.5V/24V=0.0625,10K/0.0625=160K,160K为标准E24电阻可以直接选用,或适当留出冗余量选择更高阻值的180K
如果在实际使用中,需要测量的电压若高于模块99V的设计电压,可以选择更换分压电阻或通过修改基准电压来实现更大量程的电压测量范围,下面将进行案例说明:
1.假设被测电压为160V,选择提升电压基准的方案扩大量程
2.已知选用电阻的分压比例为0.0145,通过公式反推,我们可以计算出160V*0.0145=2.32V,因此我们可以选择2.5V的电压基准来实现量程的提升(扩大量程将会降低精度)
考虑到被测电源可能存在波动,在电路设计时,在低侧分压电阻上并联了10nF的滤波电容提高测量稳定性

二极管钳位保证MCU安全
我在设计本项目的时候,额外在采样电路中增加了一个1N4148(D1等)作为钳位二极管。尽可能避免在学习和调试使用
中由于接入不正确的电压,导致芯片引脚损坏。 二极管钳位是一种重要的电子电路设计技术,它的主要作用是通过限
制电压的幅度来保护电路,避免信号过大或过小导致的损坏或故障。
钳位在电路中是指限制电压的意思,而二极管钳位特指利用二极管将电路中的某点电位进行限制的技术。
二极管钳位主要利用了二极管的单向导电性。当二极管的正极电压大于负极电压并且导通后,二极管两端的电压被限制
在其管压降上,通常硅管的管压降约为0.7V。
钳位过程:通过二极管的钳位作用,将被钳位的电位强制拉向参考端,从而实现电位的限制。钳位并不改变原信号的
波形,只是抬高或降低了信号的基准电位。
根据二极管连接方式的不同,钳位电路可分为正向钳位电路和负向钳位电路。本项目仅设计了正向钳位。
-正向钳位电路:当二极管的正极接地时,为正向钳位电路。在正半周时,二极管截止;在负半周时,二极管导通,
电容被充电至一定电压,使输出电压限制在一定范围内。
-负向钳位电路:当二极管的负极接地时,为负向钳位电路。工作原理与正向钳位电路相反。
用来模拟电压的测量、测量的标定、和测量校准辅助的电路

旁边标注为:T_V、T_GND的器件为开发板上的2mm香蕉座接口,用来连接万用表表笔。可插入万用表或高精度台式数字万用表的表笔探头验证开发板测量是否准确。也可插入2mm香蕉头的万用表表笔,代替CH1端口,进行手持式测量。
VP引脚为开发板供电引脚,在使用DC端口时,不接。在没有使用DC端口供电,且测量值大于5V小于30V时,可接入被测电源,也可由此独立供电。
使用多圈可调电位器(RP1)对开发板电源电压进行分压,通过开发板内部电路连接入+V网络。此时注意,需要短接JP1,使用跳线帽即可,推荐使用长柄跳线帽。不使用此功能,请勿短接JP1。
4.电流采样电路
本项目采用低侧电流采样电路进行电流检测,采样电路的低侧与开发板表头接口共地

设计分析:
本项目设计的采样电流为3A,选择的采样电阻(R0)为100mΩ
采样选型主要需要参考以下几个方面:
1.预设计测量电流的最大值,本项目中为3A
2.检流电阻带来的压差,一般不建议超过0.5V
3.检流电阻的功耗,应当根据该参数选择合适的封装,本项目考虑到大电流时的功耗(温度)问题,选择了1W封装的金属绕线电阻
4.检流电阻上电压的放大倍数:本项目中没有使用运放搭建放大电路,因此倍率为1
随后便可以通过以上参数计算出检流的阻值选择:
1.由于本项目没有使用放大电路,因此需要选择更大的采样电阻获得更高的被测电压以便于进行测量
2.考虑到更大的电阻会带来更大的压差、更高的功耗,因此也不能无限制的选择更大的电阻
3.本项目选用了1W封装的电阻,对应的温升功率为1W
综合以上数据,本项目选择了100mΩ的检流电阻,根据公式可以计算出3A*100mΩ=300mV,900mW
用来模拟电流的测量、测量的标定、和测量校准的辅助电路

使用此功能时,请不要焊接R0采样电阻。不使用此功能,请断开JP2。
电流采样的实质,是采集采样电阻流过电流时电阻两端的电压降,即采集电压值。该电路使用RP2提供了一个
在0~0.238V(5V÷210K*10K)范围内的电压值,经由I﹢网络,接入到芯片用于电流采样的引脚上。
在实际使用时,I﹢处的电压,模拟成了不焊的那个100mΩ采样电阻的电压降,此时,模拟测得的电流值I测=该电压值Vi+ ÷ 100mΩ
也正巧等于测得电压数值乘以10。即,提供了模拟出0~2.38A的电流测量。
将万用表或高精度台式数字万用表调至电压测量端口,量程3V以内。将其表笔探头,黑色负极插入电压测量端子旁
的T_GND接口,红色正极表笔插入电流测量的 TI+ 端口,即可测量I﹢的实际电压值。由此可见,该电路可以除了可以
完成上述设计任务,也可以直观通过测试体验到MCU的ADC外设的精度。可以自行编写程序进行验证。
5.数码管驱动电路
本项目采用了数码管作为显示单元。

在本项目中使用了两颗0.28寸的三位共阴数码管作为显示器件,相较于显示屏,数码管在复杂环境中拥有更好的识别度,可以根据实际使用环境的需求,改为更小的限流电阻实现更高的数码管亮度;在另一方面,数码管拥有较好的机械性能,不会像显示屏一样容易被外力损坏。在工业等有稳定可靠性应用中,多被采用。从开发版学习的角度来看,更易有目的的学习电子测量原理相关开发。
在本项目中,经过实际测试,数码管的限流电阻(R1~R6)被配置为300Ω,对应的亮度无论是红色还是蓝色数码管,均具有较好的识别度,且亮度柔和不刺眼。
严格来讲,限流电阻应该加在段上,加在位上,会影响显示效果。我们实际设计加在位上,省几个电阻,但对显示影响并不突出。所以还是加在位上,图个方便。
6.指示灯电路
本项目额外设计了一个电源指示灯和IO工作指示灯。

由于芯片I/O往往灌电流的能力大于拉电流的能力,所以,LED1设计为I/O低电平有效(亮)。出于减少LED对电流的消耗的考量,放弃部分LED亮度,减少器件参数类型,将LED的限流电阻选择为10K。
7.按键电路

按键控制电路有多种设计方式,得益于CW32的I/O口内部可以配置上下拉电阻,在芯片外围的按键控制电路则无需配置。按键一端接入MCU的I/O上,另一端接地。按键按下,I/O被拉低。
8.用于电压测量校准的TL431电路设计
本项目额外增加了一个TL431电路用来提供一个2.5V的基准电压,可用于给芯片一个用于校准AD的外部电压基准,从产品设计角度来讲,由于CW32本身的ADC性能优势,可以不需要此电路。在开发板上设计此电路,用于学习相关应用原理。

TL431算是一个比较“老”的器件了,很经典,应用很广泛,现在在很多电子产品中仍然有其身影。
可能很多新手初次接触此器件,我简单的讲讲此产品的原理,方便大家更好的应用TL431。
TI从名称上,将其定义为:精密可编程基准,我们在参考文献的第一页上,可以重点关注几个特性。
精密:精密,说明其输出电压非常准。我使用的为±0.5%精度的TL431,在室温下,板上实测2.495V。相较于常见的稳压二极管,精度天差地别。在应用电路图中,TL431内部以一个稳压管的符号做示意。
可调输出电压: 可调输出电压在Vref到36V之间,我们在项目中使用输出Vref电压。Vref电压约为2.5V。所以我们在描述中用2.5V,实际是约等于的。
灌电流能力: 也就是输出电压的引脚可以提供多少电流,这与在应用电路中的电阻(R13)的阻值有很大关系。不能低于1mA。如果没有灌电流的需求,则不要将电流设计过大,造成不必要的功耗影响。
详细选型资料请观看B站训练营视频
【手把手教你做电压电流表:6.1硬件-ADC测量校准的TL431电路设计-TL431相关知识及原理】https://www.bilibili.com/video/BV1fm421g7rG?vd_source=06cecaca23249686a7e70301a347232a
三、软件设计
1.实验一:LED灯驱动
图中的白灯,为本实验的控制指示灯,这是一个点亮LED的实验。
实验效果图

实验工程代码
链接:https://pan.baidu.com/s/1_Bp2aMDVo4oCAdDNNd18gw?pwd=LCKF 提取码:LCKF
2.实验二:按键测试
实验效果视频
见附件
实验工程代码
链接:https://pan.baidu.com/s/1yZTJBB3CLjEV1fUYAFA_nQ?pwd=LCKF 提取码:LCKF
3.实验三:数码管显示数字
实验效果图

实验工程代码
链接:https://pan.baidu.com/s/1y-mlOgOIGsEFkSR_bjhCfQ?pwd=LCKF 提取码:LCKF
4.实验四:数码管动态显示
实验效果图

实验工程代码
链接:https://pan.baidu.com/s/1qvaiHRyza_Pw9WhpBqSewQ?pwd=LCKF 提取码:LCKF
5.实验五:ADC采样
实验效果图
调节左侧电位器可以更改内部的采样电压值作为测试参考,最终的结果展示如下

实验工程代码
链接:https://pan.baidu.com/s/12eB_02H6dI1J7pwZ_0llhg?pwd=LCKF 提取码:LCKF
由于此时的电压电流表还未校准,由于系统误差等存在,所以显示的数据还存在一定的偏差,校准与标定的调试教程见后文。
6.实验六:均值滤波
1.常见的滤波算法
在嵌入式软件开发中,常用的软件滤波信号算法多种多样,每种算法都有其特定的应用场景和优缺点。以下是一些常见的软件滤波算法:
1.限幅滤波法(又称程序判断滤波法)
- 方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)。每次检测到新值时判断,如果本次值与上次值之差小于等于A,则本次值有效;如果大于A,则本次值无效,放弃本次值,用上次值代替本次值。
- 优点:能有效克服因偶然因素引起的脉冲干扰。
- 缺点:无法抑制周期性干扰,平滑度差。
2.中位值滤波法
- 方法:连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。
- 优点:能有效克服因偶然因素引起的波动干扰,对温度、液位等变化缓慢的被测参数有良好的滤波效果。
- 缺点:对流量、速度等快速变化的参数不宜
3.算术平均滤波法
- 方法:连续取N个采样值进行算术平均运算。N值较大时,信号平滑度较高但灵敏度较低;N值较小时,信号平滑度较低但灵敏度较高。
- 优点:适用于对一般具有随机干扰的信号进行滤波。
- 缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,且比较浪费RAM。
4.递推平均滤波法(又称滑动平均滤波法)
- 方法:把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,即可获得新的滤波结果。
- 优点:对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。
- 缺点:灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不适用于脉冲干扰比较严重的场合,且比较浪费RAM。
5.中位值平均滤波法(又称防脉冲干扰平均滤波法)
- 方法:相当于“中位值滤波法”+“算术平均滤波法”。连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。
- 优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
- 缺点:测量速度较慢,比较浪费RAM。
6.限幅平均滤波法
- 方法:相当于“限幅滤波法”+“递推平均滤波法”。每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理。
- 优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
- 缺点:比较浪费RAM。
7.一阶滞后滤波法
- 方法:取a=0~1,本次滤波结果=(1-a)本次采样值+a上次滤波结果。
- 优点:对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。
- 缺点:相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。
8.加权递推平均滤波法
- 方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权。通常是越接近现时刻的数据,权取得越大。
- 优点:适用于有较大纯滞后时间常数的对象和采样周期较短的系统。
- 缺点:对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号,不能迅速反应系统当前所受干扰的严重程度,滤波效果差。
9.消抖滤波法
- 方法:设置一个滤波计数器,将每次采样值与当前有效值比较。如果采样值等于当前有效值,则计数器清零;如果不等,则计数器加1,并判断计数器是否大于等于上限N(溢出)。如果计数器溢出,则将本次值替换当前有效值,并清计数器。
- 优点:对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。
- 缺点:对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。
- 通过修改十六进制的颜色制更改字体颜色
2.均值滤波
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m,m为该模板中包含当前像素在内的像素总个数。
这本是数字图像处理的一种方法,但也可以用在我们数字电压电流表的ADC采样数据上。我们选取二十次的ADC采样值存储在数组 Volt_Buffer 中,然后去除掉数组中的最大值和最小值后再取平均,得到的值作为结果显示在数码管上,这样可以较大程度获得准确的、不易波动的数据。
程序在实验五的基础上略作修改即可,首先是增加和修改变量:
uint16_t Volt_Buffer[ADC_SAMPLE_SIZE]; //存储ADC采样值
uint16_t Cal_Buffer = 0; //计算电压时的中间变量
uint32_t Led_Dis_Time; //运行函数的时间计数,300ms运行一次
接下来是 ADC 的采样函数,该函数在 BTIM1 的定时器中断服务程序中执行,该中断服务程序 1ms 执行一次,函数运行效果为 1ms 获得一次 ADC 的采样原始值储存进 Volt_Buffer[ADC_SAMPLE_SIZE] 数组中。
{
static uint8_t adc_cnt; //定义静态局部变量
ADC_GetSqr0Result(&Volt_Buffer[adc_cnt]); //取得 ADC 的原始采样值
adc_cnt++;
if(adc_cnt >= ADC_SAMPLE_SIZE) //采样 20 次后从 0 开始继续
{
adc_cnt = 0;
}
}
{
static uint32_t Cnt;
/* USER CODE BEGIN */
if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
{
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
Get_ADC_Value(); //运行采样函数
ADC_GetSqr0Result(&Volt_Buffer);
Cnt++;
if (Cnt > 2)
{
//3ms显示一个数码管
Cnt = 0;
Display_Refresh();//数码管扫描显示
}
}
/* USER CODE END */
}
接下来是均值滤波的主体函数:
{
uint32_t sum = 0;
uint16_t max = 0;
uint16_t min = 0xffff;
int i;
for(i = 0; i < size; i++) //遍历数组找到最大值和最小值
{
sum += value[i];
if(value[i] > max)
{
max = value[i];
}
if(value[i] < min)
{
min = value[i];
}
}
sum -= max + min; //减去最大和最小值后求平均
sum = sum / (size - 2);
return sum;
}
在主函数中重新计算采样和显示值,并且让该计算 300ms 运行一次,以防数码管频繁改变显示值使得人眼无法分辨其显示的数字。
{
RCC_Configuration(); //时钟初始化
Seg_Configuration(); //数码管初始化
Btim1_Configuration();//BTIM1初始化
ADC_Configuration(); //ADC初始化
while(1)
{
if(GetTick() >= (Led_Dis_Time + 300)) //300ms改变一次数码管显示值
{
Led_Dis_Time = GetTick();
Cal_Buffer = Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
Cal_Buffer = (Cal_Buffer * ADC_REF_VALUE >> 12) * (R2 + R1)/R1;
if(Cal_Buffer % 10 >= 5)Cal_Buffer = Cal_Buffer / 10 + 1; // 四舍五入
else Cal_Buffer = Cal_Buffer / 10; //此时的值为标准值的100倍
Dynamic_Display(Cal_Buffer);
}
}
}
需要注意的是,调用 GetTick() 得到系统计数值需要在时钟初始化处加上初始化函数,否则无法取得计数值。
最终的结果展示如下,与之前的结果相比,数码管显示的值更加稳定,滤除了干扰对 MCU 工作的影响。
实验效果图

实验工程代码
链接:https://pan.baidu.com/s/1EZYiXBcDvlZBYspcixOB2Q?pwd=LCKF 提取码:LCKF
7.实验七:六位数显的电流通道采集电压显示
实验目的
简单来说就是用两个数码管显示电压,这个电压是通过电流通道采集而来。
当我们需要检测MCU AD采样精度时,往往从MCU AD引脚上输入一个确定的可调电压,再通过编程对引脚电压进行采集计算,与实际进行比较,可以观察ADC转换的性能。 在开发板中,我们可以通过电流通道采集电压进行显示,来判断AD转换性能。
电流采样通过ADC_IN12通道完成。
我们可以使用PR2电位器调节模拟I+输入的电压值。该电压值的实际值,可使用万用表测试TI+端与GND端的电压值可以得到。数码管可以显示MCU测量计算的电压值。实际值与测理值做比较即分析Ad转换处理的配置或性能是否需要改进。
注意:该实验中,R0不焊。JP2跳线短接。
使用RP2提供的电压范围为:在0~0.238V(5V÷210K*10K)范围内的电压值(理想值,实际可能由电阻精度决定),经由I﹢网络,接入到芯片用于电流采样的引脚上。
> 工程代码文件如下:
>
> 链接:https://pan.baidu.com/s/1uKXCaQhElJfKU3FJsjP23Q?pwd=LCKF 提取码:LCKF

8.实验八:压流同采显示
工程代码文件如下:
链接:https://pan.baidu.com/s/1ExWP4fKwc6O8zjcyVymRVA?pwd=LCKF 提取码:LCKF
由于没有负载可测,只能测试模拟的电压,电流
实验效果图
显示数据表示进入电压被测端电压为4.72V,电流为0.54A

9.实验九:带有标定功能的数字电压电流表
1.标定的概念
标定是通过测量标准器的偏差来补偿仪器系统误差,从而改善仪器或系统准确度、精度的操作。为了提高电压电流表在测量时的测量精度和准确度,需要对电压电流进行标定校准。
常见的标定原理如下:
假设一个采样系统,AD部分可以得到数字量,对应的物理量为电压(或电流);
1.若在“零点”标定一个AD值点Xmin,在“最大处”标定一个AD值点Xmax,根据“两点成一条直线”的原理,可以得到一条由零点和最大点连起来的一条直线,这条直线的斜率k很容易求得,然后套如直线方程求解每一个点X(AD采样值),可以得到该AD值对应的物理量(电压值):

上图中的斜率k:
k =(Ymax-Ymin)/(Xmax-Xmin)
(因为第一点为“零点”,故上面的Ymin = 0)
2.上面的算法只是在“零点”和“最大点”之间做了标定,如果使用中间的AD采样值会带来很大的对应物理量的误差,解决的办法是多插入一些标定点。
如下图,分别插入了标定点(x1,y1)、(x2,y2)、(x3,y3)、(x4,y4) 四个点:

这样将获得不再是一条直线,而是一条“折现”(相当于分段处理),若欲求解落在x1和x2之间一点Xad值对应的电压值:
y = k×(Xad– X1)+ y1
由上看出,中间插入的“标定点”越多,得到物理值“精度”越高。
在电压电流表测量可以使用“电压电流标定板”“万用表”等配合适合,对采集的电压电流进行标定处理。标定点越多,测量越精确。
2.重要代码讲解
文档教程-实验九带有标定功能的数字电压电流表
链接:https://pan.baidu.com/s/142prhrZlC8EnbcKCTgXrOg?pwd=ag2z
提取码:ag2z
参考例程中,使用了3点标定。其中,电压标定点为0V、5V、15V。电流标定点为0A、0.5A、1.5A。
主程序代码如下:
{
RCC_Configuration(); //系统时钟64M
KEYGPIO_Init();
GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_RESET);
Seg_Init();
Btim1_Init();
ADC_init();
read_vol_cur_calibration();
ComputeK();
while(1)
{
if(BrushFlag==1)
{
DisplayBuff();
BrushFlag=0;
}
if(timecount>= 300) //300ms改变一次数码管显示值//
{
timecount=0;
Volt_Cal();
BrushFlag=1;
}
}
}
标定代码计算斜率函数如下:
{
K=(Y15-Y05);
K=K/(X15-X05);
KI=(IY15-IY05);
KI=KI/(IX15-IX05);
}
校准存储函数如下:
{
uint16_t da[5];
da[0]=0xaa;
da[1]=X05;
da[2]=X15;
da[3]=IX05;
da[4]=IX15;
flash_erase();
flash_write(0,da,5);
}
定时器BTIM1中处理按键检测及响应,代码如下:
{
static uint32_t keytime=0,keytime2=0,keytime3=0,ledcount=0;
/* USER CODE BEGIN */
if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
{
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
Get_ADC_Value();
ledcount++; //LED闪
if(ledcount>=1000)
{PC13_TOG();ledcount=0;}
timecount++;
Dis_Refresh();//数码管扫描显示
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_12)==GPIO_Pin_RESET)
{
keytime++;
if(keytime>=100 )
{
keytime=0; //切换模式
Mode++;
if(Mode>=5)Mode=0;
BrushFlag=1; //更新数码管
}
}
else keytime=0;
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==GPIO_Pin_RESET&&Mode!=0)
{
keytime2++;
if(keytime2>=100 )
{
keytime2=0; //切换模式
if(Mode==1)
{
X05=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
if(Mode==2)
{
X15=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
if(Mode==3)
{
IX05=Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
if(Mode==4)
{
IX15=Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
}
}
else keytime2=0;
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==GPIO_Pin_RESET)
{
keytime3++;
if(keytime3>=100 )
{
keytime3=0; //切换模式
Mode=0;
BrushFlag=1; //更新数码管
}
}
else keytime3=0;
}
}
3.本实验的标定操作方法
该例程使用按键操作来标定。具体操作方法如下:
定义5个工作模式,K1键用于切换显示模式。K2键设置对应模式下的参数值,并保存到FLASH。K3键返回到模式0。
模式0: 显示正常的电压电流值(上一排数码管显示电压值*.V或.*V自动切换,下一排显示电流值,_.**A)
模式1: 电压5V标定值设置。上一排数码管显示5.05. 。下一排显示当前电压值_.V或._V。在该模式下,应将万用表测量被测位,调到5.00V。 按下K2键后,将当前值标定为5V电压值。
模式2: 电压15V标定值设置。上一排数码管显示5.15. 。下一排显示当前电压值_.V或._V。在该模式下,应将万用表测量被测位,调到15.0V。 按下K2键后,将当前值标定为15V电压值。
模式3: 电流0.5A标定值设置。上一排数码管显示A.0.5 。下一排显示当前电流值_.**A。按下K2键后,将当前值标定为0.5A电流值。
模式4: 电流1.5A标定值设置。上一排数码管显示A.1.5 。下一排显示当前电流值*.**A。按下K2键后,将当前值标定为1.5A电流值。
功能演示视频
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。


评论