梁工
发表于 2025-5-31 12:01:02
qepuemc 发表于 2025-5-31 08:22
贴子看到了。文章中有些是ADC采样的讨论。基本上这些已经掌握。
还有采集电流电压的还有交流和直流。为测 ...
你说的“互感器厂家让在互感器后面并100欧姆电阻。不是82或更低。”
可能你对互感器不是很了解。
互感器是电流源输出的,其参数主要有额定输入电流和变比,比如30A,1000:1(或30A:30mA),这是什么意思?就是额定输入电流为I=30A,输出电流为i = I/1000,即输入1A,输出1mA,最大输出30mA。
那么,采样电阻要多大呢?
最理想的是用运放将电流转为电压,此时对于互感器的采样电阻(负载电阻)就是0,线性最好,电压大小由运放的反馈电阻决定。
当转换的电压比较小时(满量程时不超过1V RMS),可以不用运放,直接电阻采样,此时线性和精度不会明显劣化,这是我们直接采样的依据。采样电阻的大小取决于最大输出电流和ADC的量程。本设计ADC量程峰值为2.5/2=1.25V,有效值 = 0.8839V。
假设有3个互感器,额定电流都是30A,但变比不同,按额定电流为最大量程设计:
1、30A,1000:1(或30A:30mA),则采样电阻 Rs = 0.8839 / 0.03 = 29.46欧姆,取标准值27欧姆,实际量程=0.8839/27*1000=32.7A。
2、30A,2000:1(或30A:15mA),则采样电阻 Rs = 0.8839 / 0.015= 58.93欧姆,取标准值56欧姆,实际量程=0.8839/56*2000=31.6A。
3、30A,3000:1(或30A:10mA),则采样电阻 Rs = 0.8839 / 0.01 = 88.39欧姆,取标准值82欧姆,实际量程=0.8839/82*3000=32.3A。
可见,相同的额定电流,由于变比不同,采样电阻会有很大差异。
如果使用整流桥再接采样电阻,由于互感器输出并非理想电流源,所以在小电流时非线性误差会很大,用于对小电流要求不高的场合,比如30A的互感器,5~30A的精度满足要求即符合工程要求即可。但对于精度叫高的仪表,基本没有用整流桥的。
以上解释,明白了吗?
qepuemc
发表于 2025-5-31 14:06:48
梁工 发表于 2025-5-31 12:01
你说的“互感器厂家让在互感器后面并100欧姆电阻。不是82或更低。”
可能你对互感器不是很了解。
精度叫高的仪表,基本没有用整流桥的。 基本只看懂这一行。
现在我只能通过对比法标定。下面是数据
DC(V) AC220(A) 比值关系(约)
0.463 6 12.96
0.036 0.41 11.39
0.06 0.7 11.67
0.076 0.87 11.44
0.146 1.78 12.19
整流桥出 标定电流 比值(基本在11.40-12.19)之前
下面就是加入AD中粗劣计算。
现在我看到的难点就是要标定。标定是最复杂的
晓飛飛
发表于 2025-5-31 20:16:15
互感器电路不能用整流桥的,本身就是小信号,连桥都过不去,需要直接采集交流信号,或者使用RMS-DC电路转为单片机可以采集的直流信号。
qepuemc
发表于 2025-6-1 07:57:01
晓飛飛 发表于 2025-5-31 20:16
互感器电路不能用整流桥的,本身就是小信号,连桥都过不去,需要直接采集交流信号,或者使用RMS-DC电路转 ...
互感器厂家让这么搞的。现在问题就是桥过去了。运放这边不成线性。标定困难。
LTC1966太贵了。
梁工
发表于 2025-6-1 11:16:48
qepuemc 发表于 2025-6-1 07:57
互感器厂家让这么搞的。现在问题就是桥过去了。运放这边不成线性。标定困难。
LTC1966太贵了。
...
还是建议参考我给的例子吧,直接采样,计算RMS。
qepuemc
发表于 6 天前
qepuemc 发表于 2025-5-31 08:22
贴子看到了。文章中有些是ADC采样的讨论。基本上这些已经掌握。
还有采集电流电压的还有交流和直流。为测 ...
目前测试了 12-开天斧3.1-P1.6交直流兼容采样计算有效值-串口1(P3.1)返回虚拟数码管显示的这个例子。
用的是我自己画的板。程序我以为成了ADC30电流的时候显示的是0.19通5A电流显示的是20.00以上。互感 器是5A/5MA 的。
这个是电路立创标准版代码
现在可以看出电路是可以的。
只是程序看不出怎么标定和移槙。
还有我通常是这么标定ADC的
//0.036575 0.41A
if (adc_average>=539000 && adc_average<636000) //更新到这里了0
{
wendu=(adc_average-539000)/236.59;
}
//0.06 599 0.70A
else if(adc_average>=636000 && adc_average<703000)
{
wendu=600+(adc_average-636000)/231;
}
//0.076615 0.87A
else if(adc_average>=703000 && adc_average<742500)
{
wendu=700+(adc_average-703000)/232.35;
}
//0.146 685 1.78A
else if(adc_average>=742500 && adc_average<924500)
{
wendu=870+(adc_average-742500)/202.22;
}
//0.463 1002 6.00A
else if(adc_average>=924500 && adc_average<1620000)
{
wendu=1780+(adc_average-924500)/115.9;
}
下面的显示数码管的方法:
//(STC直接驱动数码管模块)
if(B_1ms) //1ms到
{
B_1ms = 0;
if(++msecond >= 2 ) //1秒到
{
msecond = 0;
//displayled();
//显示数码管更新内容
LED8=xsbl % 10;
LED8=xsbl % 100/10;
LED8=xsbl % 1000/100;
LED8=xsbl % 10000/1000;
LED8=LED8+0x20;//显示小数点1位
}
}
//(STC直接驱动数码管模块)
这里的 if(B_1ms) //1ms到这个在主程序的WHILE中 我不理解为什么可做到不需要等待主程序中的其它执行时间可以总是执行! (我通常认为WHILE需要快速执行或主WHILE中的其它程序要在1MS内执行完,最少不可以等100ms 不然数码管没法正常显示。)可实际没有问题。
下面的我没做好的程序
下面这个是上面的反例也是我觉得正常的过程
//初始化
while (1)
{ delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);
if(B_ADC_OK) //标志已计算完成一次平方和 累加和
{
B_ADC_OK = 0;
UART1_PrintString("."); //7段数码管命令头
avr_tmp = adc_sum/8; //FIFO, 8个, 平均值用于计算0点
rms_tmp = RMS_Sum/8; //FIFO, 8个
res_cnt++;
res_cnt &= 7;
//清零功能去掉
这里用了四个延时250MS 可以把程序输出调慢。并不会因为B_ADC_OK 的结果1秒可以算3次左右而多次显示
接收←.7SEGS...00.01.
接收←.
接收←.
接收←.
接收←.
接收←.
接收←.
接收←.
接收←.7SEGS...00.01.
接收←.
这觉得这样的执行效果才是对的。
qepuemc
发表于 6 天前
梁工 发表于 2025-6-1 11:16
还是建议参考我给的例子吧,直接采样,计算RMS。
qepuemc 发表于 2025-5-31 08:22
贴子看到了。文章中有些是ADC采样的讨论。基本上这些已经掌握。
还有采集电流电压的还有交流和直流。为测 ...
目前测试了 12-开天斧3.1-P1.6交直流兼容采样计算有效值-串口1(P3.1)返回虚拟数码管显示的这个例子。
用的是我自己画的板。程序我以为成了ADC30电流的时候显示的是0.19通5A电流显示的是20.00以上。互感 器是5A/5MA 的。
这个是电路立创标准版代码
现在可以看出电路是可以的。
只是程序看不出怎么标定和移槙。
还有我通常是这么标定ADC的
//0.036575 0.41A
if (adc_average>=539000 && adc_average<636000) //更新到这里了0
{
wendu=(adc_average-539000)/236.59;
}
//0.06 599 0.70A
else if(adc_average>=636000 && adc_average<703000)
{
wendu=600+(adc_average-636000)/231;
}
//0.076615 0.87A
else if(adc_average>=703000 && adc_average<742500)
{
wendu=700+(adc_average-703000)/232.35;
}
//0.146 685 1.78A
else if(adc_average>=742500 && adc_average<924500)
{
wendu=870+(adc_average-742500)/202.22;
}
//0.463 1002 6.00A
else if(adc_average>=924500 && adc_average<1620000)
{
wendu=1780+(adc_average-924500)/115.9;
}
下面的显示数码管的方法:
//(STC直接驱动数码管模块)
if(B_1ms) //1ms到
{
B_1ms = 0;
if(++msecond >= 2 ) //1秒到
{
msecond = 0;
//displayled();
//显示数码管更新内容
LED8=xsbl % 10;
LED8=xsbl % 100/10;
LED8=xsbl % 1000/100;
LED8=xsbl % 10000/1000;
LED8=LED8+0x20;//显示小数点1位
}
}
//(STC直接驱动数码管模块)
这里的 if(B_1ms) //1ms到这个在主程序的WHILE中 我不理解为什么可做到不需要等待主程序中的其它执行时间可以总是执行! (我通常认为WHILE需要快速执行或主WHILE中的其它程序要在1MS内执行完,最少不可以等100ms 不然数码管没法正常显示。)可实际没有问题。
下面的我没做好的程序
梁工
发表于 6 天前
qepuemc 发表于 2025-6-24 11:44
qepuemc 发表于 2025-5-31 08:22
贴子看到了。文章中有些是ADC采样的讨论。基本上这些已经掌握。
还有采 ...
贴个电路图片出来看看。
主程序中
if(B_1ms) //1ms到
{
B_1ms = 0;
//其余程序
}
这是1ms时隙,只要执行总时间不超过1ms就可以。
数码管扫描显示是在定时器中断里处理的,跟主程序没关系。这些都是最基础的程序逻辑,如果还搞不明白,就多想一想吧。
qepuemc
发表于 6 天前
梁工 发表于 2025-6-24 15:27
贴个电路图片出来看看
梁工
发表于 6 天前
qepuemc 发表于 2025-6-24 15:46
我要看原理图