📄 mpr.c
字号:
///////////////////////////////////////
//MOTOR PROTECTION RALAY
/////////////////////////////////////
#include <c8051f300.h>
#include <stdio.h>
//---------------------全局变量-----------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define SYSCLK 24500000
bit AD4_end_flag =0;
bit duan_xiang_flag=0;
uchar IN0;
uchar IN1;
uchar IN2;
uchar max_IN0;
uchar max_IN1;
uchar max_IN2;
uint max_total=0;
uint QUAN;
uint IN3 ;
uint current_PTM; //电位器对应电流值
uint RATE; //三相最大值与电位器电流值的比值
uint count =0;
uint count_AD4 = 0;
uint total_AD4 = 0;
uint time_300 = 0;
ulong comp_55000 =0;
uint total_IN0=0,total_IN1=0,total_IN2=0,K= 3;
uint total_IN0_av,total_IN1_av,total_IN2_av;
uint count_IN0 =0;
uint count_IN1 =0;
uint count_IN2 =0;
sbit LED_green = P0^3; // 运行时的灯显示
sbit LED_yellow = P0^5; // 过载时的灯显示
sbit LED_red = P0^6; // 断相时的灯显示
sbit RY = P0^7; // 继电器
//====================函数清单=======================
void Port_IO_Init() ;
void Oscillator_Init() ;
void ADC_Init() ;
void Timer2_Init ();
void Timer2_ISR();
void ADC_ISR();
void delay10ms();
void delay500ms();
//**********************************************************
void Port_IO_Init()
{
P0MDIN = 0xE1;
P0MDOUT = 0xE0;
P0 |= 0x17;
XBR0 = 0x1E;
XBR2 = 0x40;
}
void Oscillator_Init()
{
OSCICN = 0x07; //采用系统时钟24.5MHZ
}
void ADC0_Init ()
{
ADC0CN = 0x90; // ADC0不使能,将T2启动ADC0转换
AMX0SL = 0xf4; // 选择电位器通道
ADC0CF = (SYSCLK/6000000) << 3; // ADC conversion clock <= 6MHz AD转化时间
ADC0CF |= 0x01; // PGA gain = 1
REF0CN = 0x00; // VREF = Vref, bias
}
void Timer2_Init ()
{
TMR2CN = 0x00; // STOP Timer2; Clear TF2H and TF2L;
// disable low-byte interrupt; disable
// split mode; select internal timebase
CKCON |= 0x20; // Timer2 uses SYSCLK as its timebase
TMR2RLH = 0xF9; // Init reload values (-counts,system 24.5/12)
TMR2RLL = 0x96;
TMR2H = 0xff; // set to reload immediately
TMR2L = 0xff;
ET2 = 1; // disable Timer2 interrupts
TR2 = 1; // start Timer2
}
//***************************主程序 *************************************
void main ()
{ EA=0;
PCA0MD &= ~0x40; //禁止看门狗
Port_IO_Init();
Oscillator_Init();
ADC0_Init ();
AD0EN= 1;
delay500ms();
do{
count_AD4++;
ADC0CN = 0x90; //ADC开始使能
delay10ms();
IN3 = ADC0;
AD0INT = 0;
total_AD4 = (total_AD4 + IN3);}
while (count_AD4 !=0x0A);
IN3 = total_AD4/0x0A;
Timer2_Init ();
TR2 = 1; //timer2开始计数
EA = 1;
LED_yellow = 1;
LED_red = 1;
LED_green = 1;
while(1){ //打开全局中断
}
}
//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
void Timer2_ISR(void) interrupt 5 using 3 {
TF2H =0 ;
ADC0CF = 23;
time_300 ++ ;
//------------------------------读三相ADC------------------------------------
count = count+1;
if (count ==1)
{ AMX0SL = 0xf1;
IN2 = ADC0; // 通道P0.3的数据
total_IN2=total_IN2+IN2;
if (ADC0!=0){ if (max_IN2< ADC0){max_IN2 = ADC0;}}
// if( IN2==0)
// { count_IN2++; }
AD0INT = 0;
ADC0CN = 0x90;
}
if(count ==2)
{ AMX0SL = 0xf2;
IN0 = ADC0; // 通道P0.1的数据
total_IN0=total_IN0+IN0;
if (ADC0!=0){ if (max_IN0< ADC0){max_IN0 = ADC0;}}
// if( IN0==0)
// { count_IN0++; }
AD0INT = 0;
ADC0CN = 0x90;
}
if(count ==3)
{ AMX0SL = 0xf3;
IN1 = ADC0; // 通道P0.2的数据
total_IN1=total_IN1+IN1;
if (ADC0!=0){ if (max_IN1< ADC0){max_IN1 = ADC0;}}
// if( IN1==0)
// { count_IN1++; }
AD0INT = 0;
ADC0CN = 0x90;
count = 0; }
// if (count_IN0==0x50||count_IN1==0x50||count_IN2 ==0x50)
// { duan_xiang_flag=1; }
//---------------------------------------------------------------------------------------
if (time_300==300) {
count_IN0 =0;
count_IN1 =0;
count_IN2 =0;
time_300=0;
total_IN0_av=(total_IN0-max_IN0)/50;
total_IN1_av=(total_IN1-max_IN1)/50;
total_IN2_av=(total_IN2-max_IN2)/50;
max_IN0=0;
max_IN1=0;
max_IN2=0;
if (total_IN0_av>total_IN1_av){ max_total = total_IN0_av;}
else {max_total = total_IN1_av;}
if (total_IN2_av> max_total)
{ max_total = total_IN2_av; }
if (total_IN0_av<0x03||total_IN1_av<0x03||total_IN2_av < 0x03)
{ duan_xiang_flag=1; }
total_IN0=0;
total_IN1=0;
total_IN2=0;
current_PTM = IN3/0x33;
RATE = max_total*100/current_PTM; //????
LED_yellow =1;
LED_red =1;
//------------------------------------------------------------------------------------------
if (max_total>IN3 & duan_xiang_flag==0) //过载
{
LED_yellow = 0;
LED_green = 1;
LED_red = 1;
if(RATE >0x78) {
if( 0x78<RATE & RATE<=0x96)
{ QUAN=0x64; } // 1.2<x<1.5
if( 0x96< RATE & RATE<=0xc8)
{ QUAN=0xb7; } // 1.5< x <=2
if( 0xc8<RATE & RATE<=0x012c)
{ QUAN=0xb7; } // 2 < x <=3
if( 0x012c<RATE&RATE<=0x0190)
{ QUAN=0x0157; } //3 <x <=4
if( 0x0190<RATE&RATE<=0x01F4)
{ QUAN=0x0226; } //4<x<5
if( 0x01F4<RATE &RATE<=0x02D0)
{ QUAN= 0x1130; } //5<x<=7.2
comp_55000=comp_55000+QUAN ; //权值
if(comp_55000>=550000)
{ comp_55000 = 0;
RY=0;} //继电器输出;
}
}
//------------------------------------------------------------------------------------------
if (duan_xiang_flag==1) //断相
{ LED_green = 1;
LED_yellow = 1;
LED_red = 0;
duan_xiang_flag=0;
if (max_total > IN3)
{ LED_yellow = 0;}
if(RATE >105) {
if( 115<RATE & RATE<=150) { QUAN=100; } // 1.15<x<1.5
if( 150< RATE & RATE<=200){ QUAN=220; } // 1.5< x <=2
if( 200 <RATE &RATE<=300){ QUAN=220; } // 2 < x <=3
if( 300 <RATE &RATE<=400) { QUAN=392; } //3 <x <=4
if( 400 <RATE&RATE<=500) { QUAN=733; } //4<x<5
if( 500< RATE &RATE<=720){ QUAN=5000; } //5<x<=7.2
comp_55000=comp_55000+QUAN ; //权值
if(comp_55000>=550000)
{ RY=0; } //继电器输出
}
}
}
}
//------------------------------------------------------------------------------
void delay10ms()
{ uint j;
j=7269; while(j--);
}
void delay500ms(){
uint i=500;
uint j;
while(i--){
j=600; while(j--); }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -