搜索
bottom↓
回复: 62

玩了一把LCR,软件解调,效果超出预期

  [复制链接]

出0入362汤圆

发表于 2021-5-25 16:30:18 | 显示全部楼层 |阅读模式
本帖最后由 tomzbj 于 2021-5-25 22:01 编辑

学习了之前amobbs上N款LCR,基本都是用模拟开关鉴相, ADC用ICL7135.
感觉可以简单点,V和I输出直接进STM32的ADC,模拟开关之类都去掉,解调什么的,全部用软件来做。
激励源用DAC查表产生10kHz正弦波。
STM32F303的ADC能工作到5M,这次只用到1M。
估计效果不会太好,12位adc的动态太差,随便试试。

两通道同步采样,解调算法如下:
  1. #include "misc.h"
  2. #include "platform.h"
  3. #include <math.h>

  4. typedef struct {
  5.     unsigned short i, v;
  6. } sample_t;        // 单个采样点,32位的高16位和低16位分别是两个通道

  7. static void sample(void)  
  8. {
  9.     __disable_irq();
  10.     DMA_Cmd(DMA1_Channel1, ENABLE);
  11.     while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);
  12.     __enable_irq();
  13.     DMA_Cmd(DMA1_Channel1, DISABLE);
  14.     DMA_ClearFlag(DMA1_FLAG_TC1);
  15. }

  16. void LCR_DoMeasure(void)
  17. {
  18.     DataConfig_t* pdc = DC_Get();
  19.     sample_t* pbuf = (sample_t*)pdc->data.adc_buf;

  20.     float mean_v = 0, mean_i = 0, prod_i = 0, prod_q = 0, phase;
  21.     float abs_v = 0, abs_i = 0, z, x, r;

  22.     sample();     // 执行一次采样

  23.     int buf_size = sizeof(pdc->data.adc_buf) / sizeof(pdc->data.adc_buf[0]);
  24.     for(int i = 0; i < buf_size; i++) {
  25.         mean_v += pbuf[i].v;
  26.         mean_i += pbuf[i].i;
  27.     }
  28.     mean_v /= buf_size;
  29.     mean_i /= buf_size;         // 求平均值, 用于直流平衡

  30.     for(int i = 50; i < buf_size - 50; i++) {
  31.         prod_i += -(pbuf[i].v - mean_v) * (pbuf[i].i - mean_i);          // v和i做直流平衡后相乘, 累加得到同相分量
  32.         prod_q += (pbuf[i + 25].v - mean_v) * (pbuf[i].i - mean_i);    // 激励频率10k, 采样率1M, 每周期100个点, 因此移动25个点再平衡, 相乘, 累加就是正交分量了
  33.         abs_v += fabs(pbuf[i].v - mean_v);            // 绝对值求和
  34.         abs_i += fabs(pbuf[i].i - mean_i);
  35.     }
  36.     prod_i /= buf_size;
  37.     prod_q /= buf_size;
  38.     phase = atan2(prod_q, prod_i);              // 同相分量和正交分量, atan2即得到相位差
  39.     z = abs_v / abs_i;                                  // v和i绝对值相除得到阻抗绝对值, 再分别乘以相位差的cos和sin即得阻抗实部和虚部
  40.     r = 100 * z * cos(phase);
  41.     x = 100 * z * sin(phase);

  42.     printf("%f\n", phase * 180 / 3.141593);
  43.     if(phase >= 0)
  44.         printf("%f R + %.4e H\n", r, x / 2.0 / 3.141593 / 10e3);              // 相位差>0, 感抗, 否则为容抗
  45.     else
  46.         printf("%f R + %.4e F\n", r, -1 / x / 2.0 / 3.141593 / 10e3);
  47. }
复制代码

实测: 100pF, 68p, 47p, 12p电容:
951866.375000 R + 1.0172e-10 F
1414790.375000 R + 6.5711e-11 F
1966322.625000 R + 4.7291e-11 F
7668320.000000 R + 1.1785e-11 F
47uF电容误差比较大了
0.761227 R + 3.7138e-05 F

4.7uH, 68uH, 220uH电感:
0.036692 R + 4.5969e-06 H
4.750703 R + 6.7916e-05 H
5.105072 R + 2.4425e-04 H

比想象的强多了,如果用STM32H750的3.6M 16位ADC,应该还能改进不少。

原理图大体是参考许剑伟老师的, 要飞条线, 把ADC1改接到12脚, 因为F303只能ADC1和2, 或者3和4同步采样.

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2021-5-25 17:13:18 | 显示全部楼层
能不能把整个工程代码放上来学习学习?

出0入4汤圆

发表于 2021-5-25 17:19:06 | 显示全部楼层
赞!学习了,多谢

出0入362汤圆

 楼主| 发表于 2021-5-25 17:27:15 | 显示全部楼层
hunyuanqi00 发表于 2021-5-25 17:13
能不能把整个工程代码放上来学习学习?

除了我贴的那段真的没啥特别的了,就是各个外设配置,照官方例子就行了。

出0入42汤圆

发表于 2021-5-25 17:51:25 | 显示全部楼层
  1. for(int i = 50; i < buf_size - 50; i++) {
  2.         prod_i += -(pbuf[i].v - mean_v) * (pbuf[i].i - mean_i);
  3.         prod_q += (pbuf[i + 25].v - mean_v) * (pbuf[i].i - mean_i);
  4.         abs_v += fabs(pbuf[i].v - mean_v);
  5.         abs_i += fabs(pbuf[i].i - mean_i);
  6.     }
  7.     prod_i /= buf_size;
  8.     prod_q /= buf_size;
  9.     phase = atan2(prod_q, prod_i);
复制代码


这段代码是自相关求相位差?效果看起来不错啊

出0入0汤圆

发表于 2021-5-25 18:46:46 | 显示全部楼层
谢谢,好东西,学习了

出0入1209汤圆

发表于 2021-5-25 19:42:46 | 显示全部楼层
硬件可以用毛子的哪款,精度出来很不错的

出0入0汤圆

发表于 2021-5-25 20:40:19 | 显示全部楼层
不错不错,学习了

出0入0汤圆

发表于 2021-5-25 20:49:27 | 显示全部楼层
STM32H750的 16位ADC做出来的效果,并不比F303的好。老毛子做过对比测试。
另外做LCR类的设计,核心算法比如DFT等只占编程工作量的不足20%,其余的分档位校准,LCD界面显示菜单等工作量超过8成

出0入0汤圆

发表于 2021-5-25 20:54:05 | 显示全部楼层
求教
pbuf[i].v
这个.是什么用法,二维数组?结构体?

出0入8汤圆

发表于 2021-5-25 21:12:40 | 显示全部楼层

看不大懂,如果有些文字说明就更好了。

出0入362汤圆

 楼主| 发表于 2021-5-25 21:54:27 | 显示全部楼层
albert_w 发表于 2021-5-25 17:51
这段代码是自相关求相位差?效果看起来不错啊

关键是采样率除以激励频率, 得是4的倍数... 所以ADC不能自由运行, 得用一个timer来触发.

出0入362汤圆

 楼主| 发表于 2021-5-25 21:55:21 | 显示全部楼层
TINXPST 发表于 2021-5-25 20:49
STM32H750的 16位ADC做出来的效果,并不比F303的好。老毛子做过对比测试。
另外做LCR类的设计,核心算法比 ...

是啊, 有GUI就得在GUI上花80%的时间. 做着玩玩, 以后再考虑要不要做成成品吧~

出50入58汤圆

发表于 2021-5-25 22:55:17 来自手机 | 显示全部楼层
ilawp 发表于 2021-5-25 20:54
求教
pbuf.v
这个.是什么用法,二维数组?结构体?

结构体数组
引用某个数组元素的成员变量

出100入101汤圆

发表于 2021-5-26 08:12:44 来自手机 | 显示全部楼层
不错,学习

出10入284汤圆

发表于 2021-5-26 08:43:51 来自手机 | 显示全部楼层
LCR电桥几百块钱的就行,不贵

出0入362汤圆

 楼主| 发表于 2021-5-26 09:04:50 | 显示全部楼层
brother_yan 发表于 2021-5-26 08:43
LCR电桥几百块钱的就行,不贵

我有个VC4091C,就是做着玩玩的~

出0入0汤圆

发表于 2021-5-26 09:34:47 | 显示全部楼层
如果能把LCR的原理讲清楚最好了。我看了很多版本的LCR,一直都没有搞清楚鉴相器的工作原理,信号实部和虚部是怎么分开的?
如果大神不忙的话,还请讲讲,谢谢!

出0入0汤圆

发表于 2021-5-26 09:38:50 | 显示全部楼层
鲜衣怒马 发表于 2021-5-25 22:55
结构体数组
引用某个数组元素的成员变量

  1. for(int i = 50; i < buf_size - 50; i++) {
  2.         prod_i += -(pbuf[i].v - mean_v) * (pbuf[i].i - mean_i);          // v和i做直流平衡后相乘, 累加得到同相分量
  3.         prod_q += (pbuf[i + 25].v - mean_v) * (pbuf[i].i - mean_i);    // 激励频率10k, 采样率1M, 每周期100个点, 因此移动25个点再平衡, 相乘, 累加就是正交分量了
  4.         abs_v += fabs(pbuf[i].v - mean_v);            // 绝对值求和
  5.         abs_i += fabs(pbuf[i].i - mean_i);
  6.     }
复制代码


我复制错了,是想问 pbuf . i ,这里i是整数,不是变量名

出0入42汤圆

发表于 2021-5-26 10:06:23 | 显示全部楼层
tomzbj 发表于 2021-5-25 21:54
关键是采样率除以激励频率, 得是4的倍数... 所以ADC不能自由运行, 得用一个timer来触发. ...

这里好像是有个90度正交在里面

出0入362汤圆

 楼主| 发表于 2021-5-26 10:10:02 | 显示全部楼层
润持 发表于 2021-5-26 09:34
如果能把LCR的原理讲清楚最好了。我看了很多版本的LCR,一直都没有搞清楚鉴相器的工作原理,信号实部和虚部 ...

就是做了个乘法,和电压信号同相就是实部,正交就是虚部呗~

可以先在excel里试验一下,两个同频同相位的正弦波相乘(记得先直流平衡),然后求平均值,结果不为零,如果相位相差90度,最后的平均数就接近零了

出50入58汤圆

发表于 2021-5-26 10:14:25 | 显示全部楼层
ilawp 发表于 2021-5-26 09:38
我复制错了,是想问 pbuf . i ,这里i是整数,不是变量名
  1. pbuf[i].i
复制代码

第一个i是数组下标
值就是for循环的那个i值

第二个i是结构体成员
见结构体的声明
  1. typedef struct {
  2.     unsigned short i, v;
  3. } sample_t;   
复制代码


整体就是取第i个数组元素中结构体成员i的值
不知道是不是我没理解你的问题

出0入0汤圆

发表于 2021-5-26 10:23:43 | 显示全部楼层
润持 发表于 2021-5-26 09:34
如果能把LCR的原理讲清楚最好了。我看了很多版本的LCR,一直都没有搞清楚鉴相器的工作原理,信号实部和虚部 ...

“每周期100个点, 移动25个点再平衡, 相乘, 累加”。就相当于移相90度,相乘,累加。这就是数字相敏检波。

出0入0汤圆

发表于 2021-5-26 10:36:30 | 显示全部楼层
鲜衣怒马 发表于 2021-5-26 10:14
第一个i是数组下标
值就是for循环的那个i值

哦,我好像明白了。两个i不是一个意思
多谢多谢。这样写感觉不是很严谨吧

出0入362汤圆

 楼主| 发表于 2021-5-26 11:41:28 | 显示全部楼层
ilawp 发表于 2021-5-26 10:36
哦,我好像明白了。两个i不是一个意思
多谢多谢。这样写感觉不是很严谨吧 ...

确实, 这里有三个i, 一个是循环变量i, 一个是iq的i,一个是vi的i

后两个没办法了,前面这个可以改个名

出105入79汤圆

发表于 2021-5-26 12:40:08 | 显示全部楼层
求出套件 , 让大家用起来

出0入0汤圆

发表于 2021-5-26 23:11:27 | 显示全部楼层
电路简洁很多。

出0入8汤圆

发表于 2021-5-27 08:32:21 | 显示全部楼层
建议楼主也做个开源项目

出0入362汤圆

 楼主| 发表于 2021-5-27 09:37:35 | 显示全部楼层
ywd518 发表于 2021-5-27 08:32
建议楼主也做个开源项目

我的VIP 6月10日就过期了,过期我就不来了

出0入0汤圆

发表于 2021-5-27 11:16:33 来自手机 | 显示全部楼层
求出套件 , 让大家用起来

出0入8汤圆

发表于 2021-5-27 11:52:19 | 显示全部楼层
tomzbj 发表于 2021-5-27 09:37
我的VIP 6月10日就过期了,过期我就不来了

你可以申请开源项目,论坛会支持你的

出1325入193汤圆

发表于 2021-5-27 12:40:16 | 显示全部楼层
tomzbj 发表于 2021-5-27 09:37
我的VIP 6月10日就过期了,过期我就不来了

不来了?   可惜! 你也是位技术大牛

出0入0汤圆

发表于 2021-5-27 13:38:35 来自手机 | 显示全部楼层
建议楼主弄个套件

出0入0汤圆

发表于 2021-5-28 10:53:57 | 显示全部楼层
tomzbj 发表于 2021-5-27 09:37
我的VIP 6月10日就过期了,过期我就不来了

看过楼主的几个帖子和分享的代码链接:

-- 与毛子的MCU高手有类似的编程风格。编译一律是make,基本上没见过用keil的工程,其本人是高手或者正接近高手。
-- 乐于分享,自己的git上的代码很早就将链接发到坛子里了。很多帖子也都是心得体会。
-- 对F303系列的片子可以说是情有独钟,估计是多个5M的ADC可以支持更高阶的应用这点具有吸引力。
-- 基本上100%都是技术贴。

如果楼主决定离开确实有些遗憾。

出0入362汤圆

 楼主| 发表于 2021-5-28 13:09:25 | 显示全部楼层
TINXPST 发表于 2021-5-28 10:53
看过楼主的几个帖子和分享的代码链接:

-- 与毛子的MCU高手有类似的编程风格。编译一律是make,基本上没 ...

我水平和大牛们差远了...
倒是有好几个大牛朋友, 他们登不上来就不来了. 我到时候看吧, 能上就上, 登不上就算了, 交钱买VIP我是不干的.

出0入0汤圆

发表于 2021-5-28 13:16:55 | 显示全部楼层
谢谢楼主分享

出10入0汤圆

发表于 2021-5-28 18:21:23 | 显示全部楼层
tomzbj 发表于 2021-5-28 13:09
我水平和大牛们差远了...
倒是有好几个大牛朋友, 他们登不上来就不来了. 我到时候看吧, 能上就上, 登不 ...


这个号我用了10多年。所以弄个VIP养着吧。至于别的我也没兴趣。确实很多人见不着了!

出20入12汤圆

发表于 2021-5-31 10:02:22 | 显示全部楼层
做µGUI时加中文,参考过楼主的帖子,收益很多,多谢

出0入0汤圆

发表于 2021-6-1 00:31:31 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2021-6-1 07:57:05 | 显示全部楼层
是不是可以这样理解prod_i是有功功率,prod_q是无功功率。

出0入0汤圆

发表于 2021-6-1 08:00:24 | 显示全部楼层
z = abs_v / abs_i;  这个公式是否正确?用v和i的绝对值来求阻抗对吗?应该用v 和i的有效值,即均方根来求阻抗,即v的有效值除以i的有效值。

出5入14汤圆

发表于 2021-6-1 09:18:42 | 显示全部楼层
tomzbj 发表于 2021-5-27 09:37
我的VIP 6月10日就过期了,过期我就不来了

楼主常混哪里,到时候跟着去啊

出0入0汤圆

发表于 2021-6-1 22:17:29 来自手机 | 显示全部楼层
tomzbj 发表于 2021-5-27 09:37
我的VIP 6月10日就过期了,过期我就不来了

我的vip也是提示7天后到期,倒计时啦

出0入8汤圆

发表于 2021-6-2 13:46:29 | 显示全部楼层
tomzbj 发表于 2021-5-28 13:09
我水平和大牛们差远了...
倒是有好几个大牛朋友, 他们登不上来就不来了. 我到时候看吧, 能上就上, 登不 ...

莫总赠送一年vip++,以后常来哦

出0入362汤圆

 楼主| 发表于 2021-6-2 15:54:11 | 显示全部楼层
rube 发表于 2021-6-2 13:46
莫总赠送一年vip++,以后常来哦

惭愧惭愧,感谢大家的支持~

出0入362汤圆

 楼主| 发表于 2021-6-9 17:13:18 | 显示全部楼层
完整源程序我传到github了
链接: https://github.com/tomzbj/diy/tree/master/lcr

出0入0汤圆

发表于 2021-6-9 21:01:01 | 显示全部楼层
技术大牛,请回答这个问题,z = abs_v / abs_i;  这个公式是否正确?用v和i的绝对值来求阻抗对吗?应该用v 和i的有效值,即均方根来求阻抗,即v的有效值除以i的有效值。

出0入362汤圆

 楼主| 发表于 2021-6-10 09:59:23 | 显示全部楼层
hunyuanqi00 发表于 2021-6-9 21:01
技术大牛,请回答这个问题,z = abs_v / abs_i;  这个公式是否正确?用v和i的绝对值来求阻抗对吗?应该用v  ...

啊,这里可能是有问题。不过原pcb我已经拆了...
有空模拟计算一下

出250入17汤圆

发表于 2021-6-15 10:48:52 来自手机 | 显示全部楼层
这个adc采样的结果缓冲区,应该有好几个周期的数据吧?

出0入362汤圆

 楼主| 发表于 2021-6-15 11:28:14 | 显示全部楼层
peteryzm 发表于 2021-6-15 10:48
这个adc采样的结果缓冲区,应该有好几个周期的数据吧?

嗯,采了4000个点,一个周期100个点,总共有40周期。
mcu ram够大的话还可以再多采点

出0入0汤圆

发表于 2021-6-18 09:20:53 | 显示全部楼层
看起来很不错

出0入0汤圆

发表于 2021-7-27 21:30:51 | 显示全部楼层
求问一下,电路里面-5V电压是怎么生成的?L79L05这个芯片应该是负压转负压的吧,输入的负压没看明白怎么产生的,求指导

本帖子中包含更多资源

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

x

出0入362汤圆

 楼主| 发表于 2021-7-27 22:22:30 | 显示全部楼层
C232和DN200组成负倍压整流呀, 挺常见的用法吧

出10入0汤圆

发表于 2021-7-27 22:53:59 来自手机 | 显示全部楼层
本帖最后由 mainbp 于 2021-7-27 22:55 编辑

请教,
1:原理图上r233 0r不是把204短路了吗?
2:c1a c1b接一起吗?

出0入362汤圆

 楼主| 发表于 2021-7-27 23:14:08 | 显示全部楼层
mainbp 发表于 2021-7-27 22:53
请教,
1:原理图上r233 0r不是把204短路了吗?
2:c1a c1b接一起吗?

1. 那个0R是我抄俄版还是哪个原理图, 抄错位置了...
2. 接一起, 开尔文接法么.

严格地说, 应该是DG409的C1A和C1B两个管脚分别引线出来, 在左边R225的右端接一起, 而不能从R225走线到C1A再接C1B. 不过在这个场合倒是无所谓.

出0入0汤圆

发表于 2021-7-30 21:17:58 | 显示全部楼层
tomzbj 发表于 2021-7-27 23:14
1. 那个0R是我抄俄版还是哪个原理图, 抄错位置了...
2. 接一起, 开尔文接法么.

再请教一下,您这里用的是双刀联动的模拟开关,这里用单刀多选一的模拟开关就可以吧?我看到论坛上几个设计和您这个类似,都是用双刀联动的模拟开关,请问这样用有什么好处吗?谢谢

本帖子中包含更多资源

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

x

出10入0汤圆

发表于 2021-7-30 21:42:00 来自手机 | 显示全部楼层
maomao190190 发表于 2021-7-30 21:17
再请教一下,您这里用的是双刀联动的模拟开关,这里用单刀多选一的模拟开关就可以吧?我看到论坛上几个设 ...

按照我的理解这样类似于4线制测量类似,减少线阻引入的误差。

出0入0汤圆

发表于 2021-7-30 22:10:56 | 显示全部楼层
mainbp 发表于 2021-7-30 21:42
按照我的理解这样类似于4线制测量类似,减少线阻引入的误差。

好像看明白了,应该是这样接模拟开关的内阻就不引入到I/V转换里面了,消除了模拟开关内阻的影响,谢谢

出0入362汤圆

 楼主| 发表于 2021-7-30 22:18:55 | 显示全部楼层
maomao190190 发表于 2021-7-30 21:17
再请教一下,您这里用的是双刀联动的模拟开关,这里用单刀多选一的模拟开关就可以吧?我看到论坛上几个设 ...

开尔文接法, 类似四线法测电阻, 可以消除开关内阻造成的误差.

出0入0汤圆

发表于 2021-7-30 22:31:48 | 显示全部楼层
tomzbj 发表于 2021-7-30 22:18
开尔文接法, 类似四线法测电阻, 可以消除开关内阻造成的误差.

明白了,谢谢

出0入0汤圆

发表于 2021-8-1 23:16:04 | 显示全部楼层
mark一下

出100入0汤圆

发表于 2021-12-15 14:32:50 | 显示全部楼层
tomzbj 发表于 2021-7-30 22:18
开尔文接法, 类似四线法测电阻, 可以消除开关内阻造成的误差.

老师,你好,我私信你了,方便请教你几个问题吗?谢谢

出0入0汤圆

发表于 2021-12-17 20:15:52 | 显示全部楼层
楼主你好,这个有多余板子吗。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 05:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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