电量测量。第1部分。电压和电流测量

图片

介绍


大家好!在传感器的周期结束后,有人提出了不同的计划来测量家用而非非常电器的消耗参数。谁消耗了多少,如何连接要测量的东西,发生了什么细微变化等等。现在是时候揭示该区域中的所有卡片。
在本系列文章中,我们将考虑测量电参数的主题。这些参数实际上是一个非常大的数字,我将尝试以小系列逐步介绍。
到目前为止,该计划是三个系列:
  • 电量测量。
  • 电力质量。
  • 用于测量电参数的设备。

在分析过程中,我们将解决微控制器上的某些实际问题,直到获得结果为止。当然,此周期的大部分时间将用于测量AC电压,并且对所有风扇控制其智能家居的电气设备很有用。
根据整个周期的结果,我们将制造一种具有互联网访问权限的智能电表。非常臭名昭著的风扇可以控制其智能家居的电气设备,例如在MajorDomo的基础上,可以为通信部分的实施提供所有可能的帮助。可以这么说,让我们使OpenSource成为一个更好的智能家居。
在本系列的两部分中,我们将讨论以下问题:
  • DC设备以及单相和三相AC电路中的电流和电压传感器的连接;
  • 测量电流和电压的电流值;
  • 功率因数测量;
  • 满功率,有功功率和无功功率;
  • 能量消耗;

通过解决,您将找到此列表中前两个问题的答案。我故意不涉及测量指标准确性的问题,从本系列中,我仅对使用正负韧皮鞋的准确性所获得的结果感到满意。我肯定会在第三系列中专门针对此问题撰写文章。

1.传感器连接



在上一个有关电压和电流传感器的系列文章中,我讨论了传感器的类型,但没有讨论如何使用它们以及将它们放置在何处。是时候修复它了
连接直流传感器

显然,整个周期将专门用于交流系统,但我们还将快速介绍一下直流电路,因为这对于我们开发直流电源非常有用。以一个经典的PWM

降压转换器为例图1. PWM降压转换器
我们的目标是提供稳定的输出电压。另外,基于来自电流传感器的信息,可以控制电感器L1的操作模式,防止其饱和,并且还可以实现转换器的电流保护。坦率地说,安装传感器没有特别的选择。
电阻分压器R1-R2形式的电压传感器安装在转换器的输出处,这是唯一能够使用直流电的传感器。通常,专用的转换器微电路具有反馈输入,并会尽一切努力确保在此输入(3)上有微电路文档中规定的特定电压电平。例如1.25V。如果我们的输出电压与此水平相符-一切都很好-我们直接将输出电压施加到此输入。如果不是,则设置分频器。如果我们需要提供5V的输出电压,则分压器必须提供4的分压系数,即R1 = 30k,R2 = 10k。
通常将电流传感器安装在电源和转换器之间以及芯片上。根据点1和点2之间的电势差以及已知的电阻,电阻器Rs可以确定电感器电流的电流值。在电源和负载之间安装电流传感器不是一个好主意,因为滤波电容器将被电阻器从脉冲电流消耗器处切断。在公共线的间隙中安装电阻器也无济于事-会有两个接地层,仍然很有趣。
使用非接触式电流传感器(例如霍尔传感器)可以避免电压降的问题:

图2.非接触式电流传感器
但是,有一种更棘手的方法来测量电流。毕竟,晶体管上的电压也会下降,并且与之流过的电感相同的电流。因此,通过其两端的压降,您还可以确定电流的电流值。老实说,如果您查看转换器电路的内部结构(例如从Texas Instruments获得),则发现这种方法的频率与以前的方法相同。这种方法的准确性当然不是最高的,但这足以使当前的截止频率起作用。

图3.晶体管作为电流传感器我们
在类似转换器的其他电路(升压或反相)中也做同样的事情
但是,有必要分别提及变压器线性和反激式转换器。

图4.反激式转换器中电流传感器的连接
它们也可以使用外部电阻或晶体管。
这样,我们将传感器连接到DC / DC转换器。如果您对其他选项有建议,我会很乐意为他们添加文章。
1.2将传感器连接到单相交流电路

在交流电路中,我们有更多可能的传感器选择。让我们考虑几个选项。
最简单的方法是使用电阻分压器和电流分流器。

图5.电阻传感器的连接
但是,她有两个明显的缺点:
首先,我们将提供来自电流分流器的信号的大幅值,在其上分配大量功率,或者我们将对信号的小幅值感到满意,然后对其进行放大。其次,电阻器会在网络中性点和设备中性点之间产生电势差。如果该设备是隔离的,则没有关系,如果该设备具有接地端子,则由于没有连接电流传感器的信号,我们会冒着将其短路的风险。也许您应该尝试使用其他原理的传感器。
例如,我们使用电流和电压互感器,或者使用霍尔效应电流传感器和电压互感器。在这里,由于中性线没有损耗,因此有更多使用设备的机会,而且最重要的是-在两种情况下,测量设备的电气隔离都非常有用。但是,必须牢记,变压器电流和电压传感器的频率响应有限,如果我们要测量失真的谐波成分,那么就无法解决这一问题。

图6.变压器与非接触式电流和电压传感器的连接
1.3将传感器连接到多相交流电路

在多相网络中,我们连接电流传感器的能力稍差一些。这是因为根本无法使用电流分流器,因为分流器之间的电位差会在数百伏特内波动,而且我不知道任何通用控制器的模拟输入都能承受这种嘲笑。
当然,有一种使用电流分流器的方法-对于每个通道,必须进行电流隔离的模拟输入。但是使用其他传感器更容易,更可靠。
在我的质量分析仪中,我使用电阻分压器和远程霍尔效应电流传感器。

图7三相网络中的电流传感器
从图中可以看出,我们使用四线连接。当然,可以使用电流互感器或Rogowski回路代替霍尔效应上的电流传感器。
代替电阻分压器,可以将变压器用于四线和三线系统。
在后一种情况下,变压器的初级绕组由三角形连接,而次级由星形连接,星形的公共点是测量电路的公共点。

图8.在三相网络中使用电压互感器

2电压电流值



现在是解决测量信号问题的时候了。对我们来说,实际意义主要是电流和电压的电流值。
让我提醒您传感器周期中的物料。定期使用微控制器的ADC,我们将固定瞬时电压值。因此,在测量期间,我们将获得一个瞬时电压值水平的数据数组(对于电流,一切都相似)。

图9.一系列瞬时电压值
我们的任务是计算有效值。首先,我们使用积分公式:
(1)
在数字系统中,我们必须将自己限制在某个时间范围内,因此我们求和:
(2)信号的采样周期
在哪里?-测量期间的样本数。在这里的某个地方,我通过视频开始摩擦有关区域平等的游戏。那天我不得不睡觉。 =)
在单相水银电表中使用的MSP430FE4252微控制器中,在1、2或4秒的测量周期内可获得4096个读数。在T = 1s和N = 4096时,我们将进一步依靠。此外,按照GOST的要求,每秒4096个点将使我们能够使用快速傅立叶变换算法来确定最多40个谐波的谐波频谱。但是在下一个系列中会更多地介绍这一点。
我们为程序概述了算法。我们需要确保每1/8192秒ADC稳定启动一次,因为我们有两个通道,并且将交替测量此数据。为此,请配置定时器,然后中断信号将自动重启ADC。所有ADC都这样做。
我们将在arduino上编写未来的程序,因为许多程序都在手。到目前为止,我们仅具有学术兴趣。
系统石英频率为16 MHz,并且具有8位定时器(这样看来生活就不那么美好了),我们需要确保任何定时器中断的工作频率为8192 Hz。
我们为16 MHz未按需进行完全分频并且计时器的最终频率为8198 Hz感到遗憾。我们闭上眼睛,看到0.04%的误差,并且仍然每个通道读取4096个样本。
我们很遗憾,arduino中的溢出中断正在忙于计算时间(它负责毫秒和延迟,因此它将停止正常工作),因此我们在比较中使用了该中断。
然后我们突然意识到信号是双极性的,而msp430fe4252可以完美应对。我们对单极性ADC感到满意,因此,我们将一个双极性信号的简单转换器组装到运算放大器上的单极性ADC:

图10.将双极性信号转换为单极性的转换器
此外,我们的任务是确保正弦波相对于参考电压的一半进行振荡-然后我们将减去一半的范围或激活ADC设置中的选项并获得符号值。
Arduino有一个10位ADC,因此我们从0-1023的无符号结果中减去一半,得到-512-511。我们
检查在LTSpiceIV中组装的模型,并确保一切正常。在视频资料中,我们另外进行了实验验证。

图11.仿真结果。绿色是原始信号,蓝色是输出
适用于一个通道的Arduino草图
void setup()
{
  autoadcsetup();
  DDRD |=(1<<PD2)|(1<<PD3);
  Serial.begin(38400);
}


double urms = 0;
double utemp = 0;
int umoment = 0;
int N = 0;
int flag = 0;
void loop()
{
  if (flag){
    flag = 0;
    Serial.println(urms);
  }
}
int i = 255;

void autoadcsetup(){
  //set up TIMER0 to  4096Hz
  //TIMER0_OVF will be the trigger for ADC
  /*normal mode, prescaler 16
   16MHz / 64 / 61 = 4098 Hz 0.04% to 4096Hz*/
  TCCR0B = (1 << CS01)|(1 << CS00);//timer frequency = clk/64
  OCR0A = 60;//61-1
  TIMSK0 = (1<<OCIE0A);
  //set ADC.
  ADMUX =  (1 << REFS0);//8-bit mode, ADC0 channel, AVVCC as ref
  ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2);//TUrn ADC On, trigger enable, Interrupt enable, sysclk/16=1MHz_ADC_clk=76kHz conv freq(13ticks per conversion)
  ADCSRB = (1<< ADTS1) | (1<<ADTS0) | (1<<MUX5);//Auto trigger source
}

ISR(TIMER0_COMPA_vect){
  if (PIND & (1<<PD2)){
    PORTD &= ~(1<<PD2);
  }
  else{
    PORTD |=(1<<PD2);
  }
  TCNT0 = 0;

}


ISR(ADC_vect){

  if( ( UCSR0A & (1<<UDRE0)) ){
    umoment = ADCL;//copy result.
    umoment += (ADCH<<8);
    umoment = umoment - 512;
    utemp = utemp + pow((double)(umoment),2)/4096;
    N++;
    if (N == 4095){
      urms = sqrt(utemp)/102;
      N = 0;
      utemp = 0;
      flag = 1;
      if (PIND & (1<<PD3)){
        PORTD &= ~(1<<PD3);
      }
      else{
        PORTD |=(1<<PD3);
      }
    }
  }
}



该程序是在Arduino IDE中为ATmega1280微控制器编写的。在我的调试板上,前8个通道是为满足板的内部需求而布线的,因此使用ADC8通道。可以将此草图用于带有ATmega168的电路板,但是,必须选择正确的通道。
在中断内部,我们抽动了几个服务引脚以直观地看到工作的数字化频率。
关于系数102的来源,首先要从发生器提供各种幅度的信号,从示波器读取有效电压值的指示,然后从控制台获取以ADC绝对单位表示的计算值。
最大功率蠕虫已计算
32.08212
2,51.73176
21.38141
1,51,03106
1个0.68471
0.50,35836
0.250.179十九

将第三列的值除以第二列的值,得出的平均值为102。这就是我们的“校准”系数。但是,可以注意到,当电压降低时,精度会急剧下降。这是由于我们的ADC的灵敏度较低。实际上,用于精确计算的10次放电非常小,如果可以用这种方法测量插座中的电压,那么放置10位ADC来测量负载消耗的电流将是一种违法计量。

至此,我们将停止。在下一部分中,我们将考虑本系列中的其他三个问题,并将平稳地进行设备本身的创建。

展示的固件以及该系列的其他固件(由于我拍摄视频的速度比准备文章要快),您可以在GitHub的存储库中找到:github.com/radiolok/arduino_rms_count
关于电表的开发,将以TI SimpleLink WiFi CC3200的参考作为基础SmartPlug,前几天的新闻飞到了我的邮件中。我非常喜欢CC3200微控制器,因此我们将为现有的便当盒开发一个增强器包,并实现我们感兴趣的所有功能。不要忘记使它在其他微控制器上如此出色地工作。

邀请评论 progchip666,对材料的评论和补充,以及 smart_alex 如之前对使用Arduino测量电流和电压感兴趣的那样。

Source: https://habr.com/ru/post/zh-CN384597/


All Articles