M430F147实现三相交流智能数显仪表.docx
- 文档编号:6462609
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:23
- 大小:2.70MB
M430F147实现三相交流智能数显仪表.docx
《M430F147实现三相交流智能数显仪表.docx》由会员分享,可在线阅读,更多相关《M430F147实现三相交流智能数显仪表.docx(23页珍藏版)》请在冰豆网上搜索。
M430F147实现三相交流智能数显仪表
M430F147实现三相交流智能数显仪表
三相交流智能数显仪表,广泛适用于各行业供配电场所、能源管理、自动化以及智能化网络监控系统等。
此款仪表适用于220/380V低压系统,产品提供电压、电流、有功功率、无功功率、功率因数、频率、有功电度、无功电度等电参数的组合测量,扩展两路外部有源开关量输入与控制开关动作的两路继电器报警输出功能,通过RS485/MODBUS总线通讯,对仪表进行组网管理,实现自动控制。
下表为参数以及相关电磁参数:
参数
指标
精度等级
电压、电流0.2级,功率0.5级,有功电度1级,无功电度2级
适用网络
三相四线
显示数据
电流四位,根据数值大小切换小数点位,单位安培。
电压显示相/线电压,单位伏特。
有功功率四位,根据数值大小切换小数点位。
为正时,无符号,四位有效数字;为负时,有符号,三位有效数字。
单位为千瓦。
无功功率四位,根据数值大小切换小数点位。
为正时,无符号,四位有效数字;为负时,有符号,三位有效数字。
单位为千乏。
功率因数为正时,无符号,四位有效数字,三位小数。
为负时,有符号,三位有效数字,两位小数。
频率四位,两位小数点,单位赫兹。
有功电度最大可以到达9位,一位小数点,分行显示,数码管第三行显示千位以下的数,第二行显示千位以上的数,第一行显示最高位,有功电度单位千瓦时,无功电度单位千乏时。
无功电度
输入
额定电流AC5A
额定电压AC220V
过载持续电流1.2倍,瞬间电流10倍/1秒,电压2倍/1秒
频率50Hz
开关量220Vac±25%,220Vdc±25%
继电器输出
220VAC/5A,30VDC/5A
工作电源
宽压型交流85V~265V;直流80V~300V
功耗小于10VA
通讯
波特率支持4800bps和9600bps两种波特率
协议标准Modbus-RTU协议
绝缘强度
2KV(测试电压为交流有效值)
绝缘电阻
≥50MΩ
MTBF
≥50000h
工作条件
工作温度:
-10℃~+55℃
极限工作温度:
-25℃~+55℃
存储温度:
-25℃~+70℃
相对湿度:
5%~95%,无凝露
电磁特性
静电抗扰性试验:
IEC61000-4-2,Level4
辐射抗扰性试验:
IEC61000-4-3,Level3
快速瞬变脉冲群抗扰性试验:
IEC61000-4-4,Level4
浪涌抗扰性试验:
IEC61000-4-5,Level4
传导射频干扰试验:
EN55022,ClassB
辐射射频干扰试验:
EN55022,ClassB
硬件部分
本楼为硬件楼层
首先是MCU部分整体
MCU局部放大
MCU主板
电流测量部分
电流PCB
电压测量
模拟量,开关量
继电器部分
485部分,其中485是用公司现有模块,所以没有电路图
程序部分,限于保密需要,只有部分:
ad.h文件,relay.c部分,main.c文件
ad.h文件
#ifndefAD_H
#defineAD_H
//定义硬件通道对应cpu的采样通道
#defineVA_CHINCH_4
#defineVB_CHINCH_5
#defineVC_CHINCH_6
#defineVN_CHINCH_7
#defineIC_CHINCH_3
#defineIB_CHINCH_2
#defineIA_CHINCH_1
//定义电度的宏定义
//内部电度保存提供一个小数点
#defineENERGY_BASE3600000
#defineENERGY_MAX999999999
typedefstruct{
unsignedintVa;//四线星形为相电压
unsignedintVb;//三相三线为线电压
unsignedintVc;
unsignedintVab;
unsignedintVbc;
unsignedintVca;
unsignedintIa;
unsignedintIb;
unsignedintIc;
longPavg;//三相总有功功率
longQavg;//三相总无功功率
intPF;//总的功率因数
intPa;//a相有功功率
intPb;//b相有功功率
intPc;//c相有功功率
intQa;//a相无功功率
intQb;//b相无功功率
intQc;//c相无功功率
intPFa;//a相功率因数
intPFb;//b相功率因数
intPFc;//c相功率因数
unsignedintHz;//频率
unsignedintKVAa;//a相视在功率
unsignedintKVAb;//b相视在功率
unsignedintKVAc;//c相视在功率
unsignedlongImpKwH;
unsignedlongExpKwH;
unsignedlongImpKvarH;
unsignedlongExpKvarH;
unsignedlongImpKwHLeft;
unsignedlongExpKwHLeft;
unsignedlongImpKvarHLeft;
unsignedlongExpKvarhLeft;
intPa2,Pb2,Pc2;//功率修正
intQa2,Qb2,Qc2;
unsignedcharIoStatus;
}POWERMETER;
//硬件乘法无符号16乘16位060214
#defineUMul16_16(a,b)_DINT();_NOP();_NOP();MPY=a;OP2=b;_NOP();_NOP();_EINT();//060214
//硬件乘法有符号16乘16位060223
#defineMul16_16(a,b)_DINT();_NOP();_NOP();MPYS=a;OP2=b;_NOP();_NOP();_EINT();//060223
externPOWERMETERPowerMeter;
externunsignedcharAdFlag;
externunsignedcharVoltMode;
externunsignedintI0_Value;
externvoidInitAdc(void);
externvoidAdCal(void);
externvoidInitEnergy(void);
#endif
relay.c部分
#include"flash.h"
#include"relay.h"
#include"port.h"
#include"ad.h"
#include"mymath.h"
externCONFIG_DEVICEConfig_Device;
externCONFIG_SYSTEMConfig_System;
externunConfigConfig_Function;
StrRelaystrRelay[2];//定义一个继电器结构体数组
unsignedintRelaytime[2];
//初始化继电器部分程序
//在系统初始化过程调用
voidInitRelay(void);
//继电器闭合函数
voidCloseRelay(unsignedcharNum);
//继电器断开函数
voidOpenRelay(unsignedcharNum);
//继电器越限判断函数
//函数在主程序循环中调用
//一秒钟AD数值计算完毕后执行
voidRelayLimit(unsignedcharNum);
//继电器动作判断函数
//函数在10毫秒定时器中进行调用
voidRelayOperate(unsignedcharNum);
//060222该函数用于继电器参数被修改之后重新调入参数
voidReInitRelay(void);
//初始化继电器部分程序
//初始化端口
//初始化设置数据
//初始化定时器
//初始化继电器状态
//初始化相关标志
voidInitRelay(void)
{
unsignedintiTemp;
//程序调用前必须判断是否已经激活了继电器功能
//如果没有的话,则不可以初始化端口和获取设置数值
//但相应变量仍然需要得到初始化
if(Config_Function.Info.bRelay==1)
{
//初始化端口
OpenRelay1;
OpenRelay2;
//初始化设置数值
strRelay[0].Mode=Config_System.Relay1_Mode;
strRelay[0].Object=Config_System.Relay1_Object;
strRelay[0].HILimit=Config_System.Relay1_HILimit;
strRelay[0].LOWLimit=Config_System.Relay1_LOWLimit;
strRelay[0].DelayTime=Config_System.Relay1_DelayTime;
strRelay[1].Mode=Config_System.Relay2_Mode;
strRelay[1].Object=Config_System.Relay2_Object;
strRelay[1].HILimit=Config_System.Relay2_HILimit;
strRelay[1].LOWLimit=Config_System.Relay2_LOWLimit;
strRelay[1].DelayTime=Config_System.Relay2_DelayTime;
iTemp=strRelay[0].DelayTime;
UMul16_16(50,iTemp);
Relaytime[0]=RESLO;
iTemp=strRelay[1].DelayTime;
UMul16_16(50,iTemp);
Relaytime[1]=RESLO;
}
else
{
//没有继电器功能,则应当都清零
strRelay[0].Mode=0;
strRelay[0].Object=0;
strRelay[0].HILimit=0;
strRelay[0].LOWLimit=0;
strRelay[0].DelayTime=0;
strRelay[1].Mode=0;
strRelay[1].Object=0;
strRelay[1].HILimit=0;
strRelay[1].LOWLimit=0;
strRelay[1].DelayTime=0;
}
//初始化状态
strRelay[0].Status=0;
strRelay[1].Status=0;
//初始化定时器
strRelay[0].Counter=0;
strRelay[1].Counter=0;
//初始化标志
strRelay[0].Flag=0;
strRelay[1].Flag=0;
}
//060222该函数用于继电器参数被修改之后重新调入参数
voidReInitRelay(void)
{
unsignedintiTemp;
if(Config_Function.Info.bRelay==1)
{
//初始化设置数值
strRelay[0].Mode=Config_System.Relay1_Mode;
strRelay[0].Object=Config_System.Relay1_Object;
strRelay[0].HILimit=Config_System.Relay1_HILimit;
strRelay[0].LOWLimit=Config_System.Relay1_LOWLimit;
strRelay[0].DelayTime=Config_System.Relay1_DelayTime;
strRelay[1].Mode=Config_System.Relay2_Mode;
strRelay[1].Object=Config_System.Relay2_Object;
strRelay[1].HILimit=Config_System.Relay2_HILimit;
strRelay[1].LOWLimit=Config_System.Relay2_LOWLimit;
strRelay[1].DelayTime=Config_System.Relay2_DelayTime;
iTemp=strRelay[0].DelayTime;
UMul16_16(50,iTemp);
Relaytime[0]=RESLO;
iTemp=strRelay[1].DelayTime;
UMul16_16(50,iTemp);
Relaytime[1]=RESLO;
}
else
{
//没有继电器功能,则应当都清零
strRelay[0].Mode=0;
strRelay[0].Object=0;
strRelay[0].HILimit=0;
strRelay[0].LOWLimit=0;
strRelay[0].DelayTime=0;
strRelay[1].Mode=0;
strRelay[1].Object=0;
strRelay[1].HILimit=0;
strRelay[1].LOWLimit=0;
strRelay[1].DelayTime=0;
}
}
//继电器闭合函数
//传入参数为继电器通道号
voidCloseRelay(unsignedcharNum)
{
//闭合相应通道继电器
//修改状态
//清除时间计数器
if(Num==0)
{
if(strRelay[0].Status==0)
{
CloseRelay1;
strRelay[0].Status=RELAY_CLOSE;
strRelay[0].Counter=0;
}
}
else
{
if(strRelay[1].Status==0)
{
CloseRelay2;
strRelay[1].Status=RELAY_CLOSE;
strRelay[1].Counter=0;
}
}
}
//继电器断开函数
//传入参数为继电器通道号
voidOpenRelay(unsignedcharNum)
{
//断开相应通道继电器
//修改状态
//清除时间计数器
if(Num==0)
{
if(strRelay[0].Status==1)
{
OpenRelay1;
strRelay[0].Status=RELAY_OPEN;
strRelay[0].Counter=0;
}
}
else
{
if(strRelay[1].Status==1)
{
OpenRelay2;
strRelay[1].Status=RELAY_OPEN;
strRelay[1].Counter=0;
}
}
}
//继电器越限判断函数
//传入参数为继电器通道号
voidRelayLimit(unsignedcharNum)
{
unsignedintTempValue;
//判断继电器功能是否被激活
//未被激活则不执行操作
if(Config_Function.Info.bRelay==0)
return;
//越限判断主体
//控制模式判断
if(strRelay[Num].Mode==RELAY_LOCAL_MODE)
{
//继电器对象是否有效
if(strRelay[Num].Object!
=RELAY_OBJECT_NULL)
{
//根据继电器对象确定有效参数百分比
//除需要确定对象外还需要确定额定测量参数
if(strRelay[Num].Object<=RELAY_OBJECT_VC)
{
//电压对象
if(Config_Function.Info.bRate>=2)
{
//高压网络采用线电压
TempValue=*((unsignedint*)&
owerMeter.Vab+strRelay[Num].Object-1);
TempValue/=100;
}
else
{
//低压网络采用相电压
TempValue=*((unsignedint*)&
owerMeter.Va+strRelay[Num].Object-1);
TempValue/=220;
}
}
elseif(strRelay[Num].Object<=RELAY_OBJECT_IC)
{
//电流对象
TempValue=*((unsignedint*)&
owerMeter.Ia+strRelay[Num].Object-4);
if(Config_Function.Info.bRate&0x01)
{
//1A电流额定
TempValue/=10;
}
else
{
//5A电流额定
TempValue/=50;
}
}
else
{
//零序电流
TempValue=I0_Value;
if(Config_Function.Info.bRate&0x01)
{
//1A电流额定
TempValue/=10;
}
else
{
//5A电流额定
TempValue/=50;
}
}
//上下限值判断//临界值应该不动作
if((TempValue<=strRelay[Num].HILimit)&&(TempValue>=strRelay[Num].LOWLimit))
{
strRelay[Num].Flag=0;
}
else
{
//发生参数越限//060330_yjg
if(TempValue>strRelay[Num].HILimit)//越上限
{
if(strRelay[Num].Flag!
=1)
{
strRelay[Num].Flag=1;
strRelay[Num].Counter=0;
}
}
else//越下限
{
if(strRelay[Num].Flag!
=2)
{
strRelay[Num].Flag=2;
strRelay[Num].Counter=0;
}
}
}
}
else
{
strRelay[Num].Flag=0;
}
}
else
{
strRelay[Num].Flag=0;
}
}
//继电器动作判断函数
//传入参数为继电器通道号
voidRelayOperate(unsignedcharNum)
{
//判断继电器功能是否被激活
//未被激活则不执行操作
if(Config_Function.Info.bRelay==0)
return;
//继电器模式判断
if(strRelay[Num].Mode==RELAY_LOCAL_MODE)
{
//本地控制模式
if(strRelay[Num].Flag)
{
//如果继电器已经闭合,则不需要判断时间
if(strRelay[Num].Status==RELAY_OPEN)
{
strRelay[Num].Counter++;
//延时要求满足判断
//这里的时间判断需要依赖函数调用的周期
if(strRelay[Num].Counter>=Relaytime[Num])
CloseRelay(Num);
}
}
else
{
OpenRelay(Num);
}
}
else
{
//远程控制模式
//只有在继电器闭合状态下判断是否返回
if(strRelay[Num].Status==RELAY_CLOSE)
{
//只有设定了延时复归时间才进行判断
//这里的时间判断需要依赖函数调用的周期
if(strRelay[Num].DelayTime!
=0)
{
strRelay[Num].Counter++;
if(strRelay[Num].Counter>=Relaytime[Num])
OpenRelay(Num);
}
}
}
}
main.c部分
#include
#include"port.h"
#include"timer.h"
#include"ad.h"
#include"adint.h"
#include"comm.h"
#include"mymath.h"
#include"watchdog.h"
#include"display.h"
#include"flash.h"
#include"relay.h"
#include"analog.h"
externvoidWriteDD_NVROM(void);
externvoidInitDisp(void);//060223初始化显示
voidInitClock(void);
voidInitSystem(void);
voidscanLED(void);
voidInitClock(void)
{
unsignedinti;
DCOCTL=0x60;
BCSCTL1=0;
for(i=0;i<8000;i++)
{
_NOP();
}
BCSCTL2=SELM_2|DIVM_0|DIVS_0|SELS;
while(IFG1&OFIFG)
{
IFG1=0;
BCSCTL2=SELM_2|DIVM_0|DIVS_0|SELS;
}
}
voidInitSystem(void)
{
InitClock();
InitFlash();
InitPort();
InitTimerA();
InitTimerB();
InitRelay();
//初始化模拟量输出
//addcodehere
InitAnalog();//060228
InitAdc();
InitUart0();
//060223初始化显示
InitDisp();
}
voidmain(void)
{
unsignedintEnergyTimer=0;
un
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- M430F147 实现 三相 交流 智能 仪表