使用Arduino&x2B的三相电压监测器/相序;EmonLib
我正在尝试学习/构建一个基于Arduino Mega的三相系统监控装置,该装置将允许用户通过相序检测监控220V/50Hz三相系统电压和电流,以确定正确的接线顺序(L1、l2、l3) 我从开始就关注这个项目,并在硬件部分(上面链接中的原理图和电路)取得了良好的效果。使用Arduino&x2B的三相电压监测器/相序;EmonLib,arduino,embedded,microcontroller,Arduino,Embedded,Microcontroller,我正在尝试学习/构建一个基于Arduino Mega的三相系统监控装置,该装置将允许用户通过相序检测监控220V/50Hz三相系统电压和电流,以确定正确的接线顺序(L1、l2、l3) 我从开始就关注这个项目,并在硬件部分(上面链接中的原理图和电路)取得了良好的效果。 对于软件,我使用EmonLib进行电压和电流测量。我从Arduino那里得到了正确的读数,我想我不理解在代码中添加定时器循环的相关部分 这是我修改过的代码: #包含“EmonLib.h”//include Emon库 能量监视器em
对于软件,我使用EmonLib进行电压和电流测量。我从Arduino那里得到了正确的读数,我想我不理解在代码中添加定时器循环的相关部分 这是我修改过的代码:
#包含“EmonLib.h”//include Emon库
能量监视器emon0;//L1实例
能量监测器emon1;//二级实例
能量监测器emon2;//L3实例
int s1=模拟读数(A3);
int s2=模拟读数(A4);
int s3=模拟读数(A5);
无符号整数g=0;
int i;//For For循环
无符号整数a22;
无效设置(){
Serial.begin(9600);
串行打印LN(“三相电压”);
延迟(1000);
emon0.电压(0,225.5,1.7);//电压:输入引脚,校准,相移
emon1.电压(1225.5,1.7);//电压:输入引脚,校准,相移
emon2.电压(2225.5,1.7);//电压:输入引脚,校准,相移
emon0.电流(6111.1);//电流:输入引脚,校准。
emon1.电流(7111.1);//电流:输入引脚,校准。
emon2.电流(8111.1);//电流:输入引脚,校准。
}
//代码开始
//用于角度计算的函数
整数计算(){
无符号整数k=0;
//完成计数的次数
g=g+1;
//转换成秒
浮动pf=(浮动)g/1000000;
//把秒转换成度
pf=pf*50*360;//此处频率=50hz
k=pf;
返回k;
}
void tloop1(){
而(1){
如果(s2!=0){
TCNT1=0;
TCCR1B=0x01;//Fcpu/1处的启动计时器1
打破
}否则{
持续
}
}
而(1){
如果(s3!=0){
TCCR1B=0x00;//停止计时器1
g=TCNT1;//获取计数数
打破
}否则{
持续
}
}
}
void tloop2(){
而(1){
如果(s3!=0){
TCNT1=0;
TCCR1B=0x01;//Fcpu/1处的启动计时器1
打破
}否则{
持续
}
}
而(1){
如果(s1!=0){
TCCR1B=0x00;//停止计时器1
g=TCNT1;//获取计数数
打破
}否则{
持续
}
}
}
浮动fmap(浮动x、浮动最小值、浮动最大值、浮动最小值、浮动最大值){
返回(x-输入最小值)*(输出最大值-输出最小值)/(输入最大值-输入最小值)+输出最小值;
}
无效阶段1(){
无符号整数a1=0;
无符号整数v1=0;
emon0.calcVI(202000);//计算所有波长数,超时
float L1supplyVoltage=emon0.Vrms;//将Vrms提取到变量中
float Irms0=emon0.Irms;//将Irms提取到变量中
浮子校准I0=0;
Serial.print(“阶段1:V=”);Serial.println(L1supplyVoltage);//打印出所有变量
cablibratedi0=fmap(Irms0,0.0,1024.0,0.0,200.0);
Serial.print(“阶段1:A=”);Serial.println(cablibratedi0);//打印出所有变量
a1=计算();
Serial.print(“阶段1:D=”);Serial.println(a1);
Serial.print(“行到下一行的电压:”);Serial.println(l1电源电压*1.732);
}
无效阶段2(){
tloop1();
无符号整数a2=0;
无符号整数v2=0;
延迟(20);
emon1.calcVI(202000);//计算所有波长数,超时
浮点L2supplyVoltage=emon1.Vrms;//将Vrms提取到变量中
float Irms1=emon1.Irms;//将Irms提取到变量中
浮子校准I1=0;
Serial.print(“第2阶段:V=”);Serial.println(L2supplyVoltage);//打印出所有变量
cablibratedi1=fmap(Irms1,0.0,1024.0,0.0,200.0);
Serial.print(“阶段2:A=”);Serial.println(cablibratedi1);//打印出所有变量
a2=计算();
a22=a2;
Serial.print(“阶段2:D=”);Serial.println(a2);
Serial.print(“行到下一行的电压:”);Serial.println(L2supplyVoltage*1.732);
延迟(700);
}
无效阶段3(){
tloop2();
无符号整数a3=0;
无符号整数v3=0;
延迟(20);
emon2.calcVI(202000);//计算所有波长数,超时
float L3supplyVoltage=emon2.Vrms;//将Vrms提取到变量中
float Irms2=emon2.Irms;//将Irms提取到变量中
浮子校准I2=0;
Serial.print(“阶段3:V=”);Serial.println(L3supplyVoltage);//打印出所有变量
cablibratedi2=fmap(Irms2,0.0,1024.0,0.0,200.0);
Serial.print(“阶段3:A=”);Serial.println(cablibratedi2);//打印出所有变量
a3=计算();
a3=a22+a3;
Serial.print(“第3阶段:D=”);Serial.println(a3);
Serial.print(“行到下一行的电压:”);Serial.println(L3supplyVoltage*1.732);
}
void循环(){
第1阶段();
阶段2();
阶段3();
延迟(1000);
}
代码编译时没有错误,但当我仅从Arduino IDE打开串行监视器时phase1()代码>运行并显示一次
int s1 = analogRead(A3);
int s2 = analogRead(A4);
int s3 = analogRead(A5);
不要试图读取函数之外的管脚。这行不通。变量将被初始化为0。这意味着您的代码将陷入while循环
您需要做的是:
int s1;
int s2;
int s3;
[...]
void setup() {
s1 = analogRead(A3);
s2 = analogRead(A4);
s3 = analogRead(A5);
代码正在运行,下面是它的副本:
int m; float n;
int m1; float n1;
int m2; float n2;
void setup()
{
pinMode(A0,INPUT); // L1
pinMode(A1,INPUT); // L2
pinMode(A2,INPUT); // L3
pinMode(A3,INPUT); // A
pinMode(A4,INPUT); // B
pinMode(A5,INPUT); // C
Serial.begin(9600);
}
void loop()
{
m=analogRead(A0);// read analog values from pin A0 across capacitor
n=(m* .304177);// converts analog value(x) into input ac supply value using this formula ( explained in woeking section)
Serial.print("1 analaog input " ) ; // specify name to the corresponding value to be printed
Serial.print(m) ; // print input analog value on serial monitor
Serial.print(" ac voltage ") ; // specify name to the corresponding value to be printed
Serial.print(n) ; // prints the ac value on Serial monitor
Serial.println();
delay(1000);
m1=analogRead(A1);// read analog values from pin A0 across capacitor
n1=(m1* .304177);// converts analog value(x) into input ac supply value using this formula ( explained in woeking section)
Serial.print("2 analaog input " ) ; // specify name to the corresponding value to be printed
Serial.print(m1) ; // print input analog value on serial monitor
Serial.print(" ac voltage ") ; // specify name to the corresponding value to be printed
Serial.print(n1) ; // prints the ac value on Serial monitor
Serial.println();
delay(1000);
m2=analogRead(A2);// read analog values from pin A0 across capacitor
n2=(m2* .304177);// converts analog value(x) into input ac supply value using this formula ( explained in woeking section)
Serial.print("3 analaog input " ) ; // specify name to the corresponding value to be printed
Serial.print(m2) ; // print input analog value on serial monitor
Serial.print(" ac voltage ") ; // specify name to the corresponding value to be printed
Serial.print(n2) ; // prints the ac value on Serial monitor
Serial.println();
delay(1000);
}