数码之家

 找回密码
 立即注册
搜索
查看: 7384|回复: 91

[STM] DIY个内阻测试仪-三线版V0.1

    [复制链接]
发表于 2023-5-10 13:36:57 | 显示全部楼层 |阅读模式
本帖最后由 飞向狙沙 于 2023-5-10 14:24 编辑

最近看大家都在玩LM317+555的内阻仪,电路简单,测量结果相对准确,但是要求有个万用表,对于一个diyer,这怎么可以忍受,必须要能独立使用啊,然后一直想做,之前就看到一乐“GandF”大神开源的M8内阻仪电路,无奈没看明白,后来经过坛里@qrut@邓穿石 两位大神的指点终于搞懂了,就开始折腾这版内阻仪,经过漫长的零星时间焊接调试,目前总算是凑合着可以使用了。


因为万用表之前小电流档有点问题,所以万用表标定的电流值可能有偏差,分压电阻也没买告警的,全是从元件盒顺手巴拉的,测量结果可能不是太好,但是对于内阻来说那不重要,10mΩ跟20mΩ有很大区别吗,只要相对准确可以用来做电池分组不就够了么


这是焊接的第一版,效果比较差,¥200出给了一个毕设的小弟弟,这才有了点经费买了个示波器,进而调整出来了当前这个能用的版本,纪念一下

上图不算数,原理图镇楼


相关参数
阻值测量范围:0-500mΩ(实际电路中设计了档位切换,理论上应该能到0-2Ω,软件方面暂时没有实现)
电压测量范围:0-20V(实际电路设计0-50V,焊接的元件都是使用的手里现成的,部分参数没达到设计值)

原理简介
单片机PA2脚产生1KHz的3.3V方波信号,通过LMV358(一定要LMV版,此版低压轨到轨,普通LM358不适用)产生10mA的交流恒流源,经过测试电池或电阻后根据欧姆定律产生一个压降,这个压降在经过LMV358进行250倍放大后进入PA1的ADC采样,然后经过电压换算,欧姆定律再计算出被测电阻的阻值。


被测电池的电压采样直接通过分压电阻分压后进入PA3 ADC采样,此处不知道正规电压采集应该怎么做,反正就这么实现了,结果应该会有点偏差,在公司调试,没有经过万用表校对,如果影响太大可以考虑关闭PWM后测量,还是那句话,相对值嘛,也没太大必要追求高精准,真想要准确数值万用表在测一下嘛


程序下载目前使用的JLINK,放了一片CH340E,可以通过串口下载,但是boot0没有加按键,放了跳线,需要短接下,typec使用了正反插,一面串口,一面USB,也考虑使用USB模拟U盘升级,但是空间好像不太够了,需要优化代码


单按键设计,开关机、功能设定,长按开机、关机,目前归零校准是先短接在三连击自动校准,但是校准值没有保存到flash,需要再研究研究库函数


程序使用的platformIO+arduino开发,好处就是各种功能随手就来,缺点就是后期确实难优化,占用内存也比较大


先上结果图吧,二楼再做具体的原理介绍
渲染图

实际焊接


长按开关机


进入短接校准

短接校准结果(目前校准结果当次开机有效,下次开机需要重新校准,写入flash功能还在研究)

测量南孚电池

测量锂电池,哪来的个渣渣电池我也忘了

测量50mΩ多圈康铜电阻

通过调整康铜电阻圈数模拟不同阻值





源码和PCB因为经常会有更新就暂时不传压缩包了,直接传gitee了
源码:NeiZuYi: 内阻仪
硬件:立创eda工程


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 17家元 +323 收起 理由
newnet1234 + 30 原創內容
t3486784401 + 30 優秀文章
慕名而来 + 20 優秀文章
zzy_85569381 + 30 謝謝分享
IlovePLC + 20 優秀文章
2545889167 + 20
aping365 + 20
aec + 20 謝謝分享
zto中通快递 + 18 “200出给了一个毕设的小弟弟” O(∩_∩)O.
亚历山大 + 20

查看全部打赏

 楼主| 发表于 2023-5-10 13:37:17 | 显示全部楼层
本帖最后由 飞向狙沙 于 2023-5-10 14:42 编辑

开关机电路使用了这个电路,按下开关Q1导通,上电开机,此时单片机完成初始化,需要给POWER_C一个高电平,Q2导通拉低Q1 G极保持开机状态,此时开关SW1可以作为普通开关正常使用,当需要关机时按下开关,单片机检测到按键按下按照设定规则(长按1s)判定关机时拉低POWER_C,此时Q2截止,但是开关还按下,所以Q1还是导通,直到开关松开,G极高电平实现物理关机,这个开关机电路可以实现关机0损耗,缺点就是关机后单片机断电,不能自我唤醒,不过这里自我唤醒也没啥意义

内阻采样电路部分,原理可参考运放恒流电路求解 - 电子学堂 数码之家 (mydigit.cn)@qrut@邓穿石 给出的讲解,U5.1、R31、R32、R34、R35、R36组成一个10mA(实测9mA左右)恒流源,R34为恒流源的采样电阻,具体恒流值计算方法可以参考下上边帖子的10楼,交流恒流经过C23、C24反接组成的无极电容隔直后对被测电阻放电,恒流值定为Io,被测电阻定位Ro,则按照欧姆定律在被测电阻上产生一个交流电压信号Uo=Io*Ro,C22隔直电容经过隔直通交把这个电压信号导入到U5.2的同相端进行同相放大,因为这个交流信号包含负压,单电源的运放处理不了,经过R24、R27叠加一个3.3/2=1.65V的偏置电压。由R20、R26组成放大(100k+400)/400=250倍放大,当Q3导通时R20、R21、R22并联成一个33.33k电阻,放大倍数变为(33.33k+400)/400=84.33倍放大。



这是短接时的adc波形,效果已经不太好了,不知道是不是运放的问题

这是200mΩ时的波形


关键元件
R34为恒流源采样电阻,需要高精度低温漂
R31/32/35/36设定恒流值
C23/24反向链接组成一个无极电容,耐压翻倍,容量减半,容量需要100uF以上,这里我使用了25V220uF电容,等效电容耐压50V,有点低了,测不了50V电池,我也用不到
C22为采样隔直电容,耐压需要50V或超过期望被测电压值,用MLCC实际应该不太合适,这里最好使用X7R或者CBB?这块不太了解,大佬给解释一下呗
R25/30作为被测电池电压分压电阻,分压比(200k+12k)/12k=17.67倍,最高测量3.3V*17.67=58V电压
R20/21/22/26为运放放大倍率设定电阻
电压测量范围由C22/23/24和R25/30共同决定

算法相关

使用了平均值滤波,三个点做一次平均,然后后移一位继续三点平均
  1. void ADC_avgfilter(uint16_t *arr)
  2. {
  3.     uint16_t temp = arr[0];
  4.     for (uint16_t i = 1; i < ADC_SAMPLES - 1; i++)
  5.     {
  6.         arr[i] = (temp + arr[i] + arr[i + 1]) / 3;
  7.         temp = arr[i];
  8.     }
  9. }
复制代码


阻值计算没太搞明白FFT,而且这里是用的方波,感觉也用不到FFT,直接从滤波之后的数据里取波峰波谷差值计算了
  1. // 获取阻值
  2. float ADC_getResistance()
  3. {
  4.     // 波峰波谷求和,求平均值
  5.     uint16_t peakCount = 0, troughCount = 0;
  6.     uint32_t peakSum = 0, troughSum = 0;
  7.     uint32_t avg = 0;
  8.     uint16_t adcs[ADC_SAMPLES];
  9.     // 数据采集
  10.     adc_read(RESISTANCE_ADC_PIN, adcs);
  11.     // 数据滤波
  12.     ADC_avgfilter(adcs);
  13.     // 求平均值,简单求波峰波谷
  14.     for (int i = 0; i < ADC_SAMPLES; i++)
  15.     {
  16.         avg += adcs[i];
  17.     }
  18.     avg /= ADC_SAMPLES;
  19.     // 开始位置是正半周还是负半周:正半周1,负半周-1
  20.     int8_t currentCycle = adcs[0] > avg ? 1 : -1;
  21.     // 当前周期的波峰波谷
  22.     int16_t currentPeak, currentTrough;
  23.     if (currentCycle > 0)
  24.         currentPeak = adcs[0];
  25.     else
  26.         currentTrough = adcs[0];
  27.     // 求波峰波谷
  28.     for (int i = 1; i < ADC_SAMPLES - 1; i++)
  29.     {
  30.         // 正半周切换负半周
  31.         if (currentCycle > 0 && adcs[i] < avg)
  32.         {
  33.             currentTrough = adcs[i];
  34.             currentCycle = -1;
  35.             peakSum += currentPeak;
  36.             peakCount++;
  37.         }
  38.         // 负半周切换正半周
  39.         else if (currentCycle < 0 && adcs[i] > avg)
  40.         {
  41.             currentPeak = adcs[i];
  42.             currentCycle = 1;
  43.             troughSum += currentTrough;
  44.             troughCount++;
  45.         }
  46.         // 正半周
  47.         else if (currentCycle > 0 && adcs[i] > avg && currentPeak < adcs[i])
  48.         {
  49.             currentPeak = adcs[i];
  50.         }
  51.         // 负半周
  52.         else if (currentCycle < 0 && adcs[i] < avg && currentTrough > adcs[i])
  53.         {
  54.             currentTrough = adcs[i];
  55.         }
  56.         //  Serial.printf("adc:%d\r\n", adcs[i]);
  57.     }
  58.     peakSum /= peakCount;
  59.     troughSum /= troughCount;
  60.     Serial.printf("peakSum:%d\r\n", peakSum);
  61.     Serial.printf("troughSum:%d\r\n", troughSum);
  62.     float r = 1.0 * (peakSum - troughSum) / 2;
  63.     Serial.print("r:");
  64.     Serial.print(r);
  65.     Serial.println();
  66.     r = r * ADC_getVcc() / ADC_RANGE / CONSTANT_CURRENT / MAGNIFICATION_RATE1;
  67.     Serial.print("R:");
  68.     Serial.print(r);
  69.     Serial.println();
  70.     return r;
  71. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
jf201006 + 20 原創內容

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-10 13:37:30 | 显示全部楼层
本帖最后由 飞向狙沙 于 2023-5-10 14:11 编辑

之前的开尔文夹一块送给小朋友了,只能短接后用两线测量,后边还规划了一版四线版,效果待测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
jf201006 + 20 認真發帖

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-10 13:47:15 | 显示全部楼层
体积居然可以这么小?
回复 支持 反对

使用道具 举报

发表于 2023-5-10 13:50:26 | 显示全部楼层
三楼占了,,挺精致的
回复 支持 反对

使用道具 举报

发表于 2023-5-10 13:54:28 | 显示全部楼层
量产   价格搞下来
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:03:19 | 显示全部楼层
量产,把价格搞下来
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:05:07 | 显示全部楼层
三楼是谁的?
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:08:15 | 显示全部楼层
不错不错这么快就出成品了,话说那个毫欧的字体“mO”很销魂,改成mr吧
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-10 14:09:49 | 显示全部楼层
不管啥时候来,都自备板凳和西瓜。
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:28:09 | 显示全部楼层
如果有商品内阻仪测量结果对比测试就好了。起码误差心里有数。
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:39:00 | 显示全部楼层
做的不错。成本看起来不会高,亲民,好评。
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:39:44 | 显示全部楼层
坐等成品出来,价格合理就买一个玩玩,最好19.9包邮的那种,呵呵!我只有几个简易容量测试仪,感觉不太准确,就想测一下内阻。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 14:45:00 | 显示全部楼层
qrut 发表于 2023-5-10 14:08
不错不错这么快就出成品了,话说那个毫欧的字体“mO”很销魂,改成mr吧 ...

还得感谢大佬的讲解,不然原理都搞不明白,u8g2默认字库里没有Ω,换字库又怕占更多空间,直接用O代替了

打赏

参与人数 1家元 +10 收起 理由
qrut + 10 别客气,用r代替就行了~

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 14:48:37 | 显示全部楼层
fangguo18 发表于 2023-5-10 13:54
量产   价格搞下来

不售,没精力,都开源了自己搞吧,这玩意成本说高也高说低也低,最值钱的也就是stm32f103c8t6淘宝红包两块多,oled之前拆机的,买新的也就是五六块钱吧,ch340e可以不要,LMV358好像一块左右,四线航空插淘宝红包后几分钱,其他容阻也永不几毛钱,在我这算成本也就是不到十块钱,不过要是全部采购的话成本会高,主要是容阻没人给配,不能零买,不过混论坛的手里不都有各种囤货嘛
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 14:51:56 | 显示全部楼层
dirtyacc 发表于 2023-5-10 14:28
如果有商品内阻仪测量结果对比测试就好了。起码误差心里有数。

大家玩可以标定下看看,我个人而言其实无所谓,拿来主要也就是做做电池匹配,只要相对稳定就像,偏差大点小点其实没什么,比如说实际内阻10毫欧,测量结果20毫欧,只要稳定,所有电池都是20毫欧,那就能配对,至于是不是10毫欧精准值也没啥影响嘛,又不是出去卖电池
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 14:56:08 | 显示全部楼层
majiwu1234 发表于 2023-5-10 14:39
坐等成品出来,价格合理就买一个玩玩,最好19.9包邮的那种,呵呵!我只有几个简易容量测试仪,感觉不太准确 ...

哈哈,不出成品,只开源
回复 支持 反对

使用道具 举报

发表于 2023-5-10 14:57:06 | 显示全部楼层
可以提供套件嘛   只要便宜  都搞起来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 15:07:28 | 显示全部楼层
fangguo18 发表于 2023-5-10 14:57
可以提供套件嘛   只要便宜  都搞起来

真要玩有没有库存元件的话可以出邮费送一些需要的容阻,mcu屏幕之类的自己淘宝采购
回复 支持 反对

使用道具 举报

发表于 2023-5-10 15:12:17 | 显示全部楼层
200块,楼主可以
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 01:10 , Processed in 0.093600 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表