|
本帖最后由 tomzbj 于 2021-5-25 22:01 编辑
学习了之前amobbs上N款LCR,基本都是用模拟开关鉴相, ADC用ICL7135.
感觉可以简单点,V和I输出直接进STM32的ADC,模拟开关之类都去掉,解调什么的,全部用软件来做。
激励源用DAC查表产生10kHz正弦波。
STM32F303的ADC能工作到5M,这次只用到1M。
估计效果不会太好,12位adc的动态太差,随便试试。
两通道同步采样,解调算法如下:
- #include "misc.h"
- #include "platform.h"
- #include <math.h>
- typedef struct {
- unsigned short i, v;
- } sample_t; // 单个采样点,32位的高16位和低16位分别是两个通道
- static void sample(void)
- {
- __disable_irq();
- DMA_Cmd(DMA1_Channel1, ENABLE);
- while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);
- __enable_irq();
- DMA_Cmd(DMA1_Channel1, DISABLE);
- DMA_ClearFlag(DMA1_FLAG_TC1);
- }
- void LCR_DoMeasure(void)
- {
- DataConfig_t* pdc = DC_Get();
- sample_t* pbuf = (sample_t*)pdc->data.adc_buf;
- float mean_v = 0, mean_i = 0, prod_i = 0, prod_q = 0, phase;
- float abs_v = 0, abs_i = 0, z, x, r;
- sample(); // 执行一次采样
- int buf_size = sizeof(pdc->data.adc_buf) / sizeof(pdc->data.adc_buf[0]);
- for(int i = 0; i < buf_size; i++) {
- mean_v += pbuf[i].v;
- mean_i += pbuf[i].i;
- }
- mean_v /= buf_size;
- mean_i /= buf_size; // 求平均值, 用于直流平衡
- for(int i = 50; i < buf_size - 50; i++) {
- prod_i += -(pbuf[i].v - mean_v) * (pbuf[i].i - mean_i); // v和i做直流平衡后相乘, 累加得到同相分量
- prod_q += (pbuf[i + 25].v - mean_v) * (pbuf[i].i - mean_i); // 激励频率10k, 采样率1M, 每周期100个点, 因此移动25个点再平衡, 相乘, 累加就是正交分量了
- abs_v += fabs(pbuf[i].v - mean_v); // 绝对值求和
- abs_i += fabs(pbuf[i].i - mean_i);
- }
- prod_i /= buf_size;
- prod_q /= buf_size;
- phase = atan2(prod_q, prod_i); // 同相分量和正交分量, atan2即得到相位差
- z = abs_v / abs_i; // v和i绝对值相除得到阻抗绝对值, 再分别乘以相位差的cos和sin即得阻抗实部和虚部
- r = 100 * z * cos(phase);
- x = 100 * z * sin(phase);
- printf("%f\n", phase * 180 / 3.141593);
- if(phase >= 0)
- printf("%f R + %.4e H\n", r, x / 2.0 / 3.141593 / 10e3); // 相位差>0, 感抗, 否则为容抗
- else
- printf("%f R + %.4e F\n", r, -1 / x / 2.0 / 3.141593 / 10e3);
- }
复制代码
实测: 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, 杜汶泽)
|