用單片機(jī)系統(tǒng)實(shí)現(xiàn)故障診斷
4.軟件實(shí)現(xiàn)
用Franklin C51[4]編制BP程序關(guān)鍵部分如下:
uchar data i,j;
float xdata show[17]; //故障征兆
float xdata fault[11]; //故障類型
float xdata weight[10][17]; //輸入層與隱含層間的權(quán)重
float xdata vweight[11][10]; //隱含層與輸出層間的權(quán)重
//這兩種權(quán)重已在PC機(jī)中訓(xùn)練好,燒錄在EPROM中。
float xdata Inet[10];
…… //初始化,從采集濾波保存的信號中讀取show[17]
for(i=0; i10; i++)
for(j=0; j17; j++)
Inet[i] += weight[i][j]*show[j];
for(i=0; i11; i++)
for(j=0; j10; j++)
fault[i] += vweight[i][j] / (1.0 + exp(-Inet[j]));
for(i=0; i11; i++)
{ if(fault[i] > 0.1)
…… // 顯示出故障并調(diào)用通信程序上位機(jī)
// 進(jìn)行通信告知故障
}
實(shí)現(xiàn)通信功能的主要程序如下:
//這里略去了中斷服務(wù)程序的初始化
uchar idata transmit_buf[8] = fault1;
uchar idata receive_buf[8];
void transmit_data(void)
{ uchar p, i;
transmit_ready = 0;
do{ p = 0; //清校驗(yàn)和
for(i=0; i8; i++)
{ SBUF = transmit_buf[i];//發(fā)送一數(shù)據(jù)
p += transmit_buf;
while(TI != 1);
TI = 0;
}
SBUF = p; //發(fā)送校驗(yàn)和
while(TI == 0); TI = 0;
while(RI == 0); RI = 0;
}while (SBUF != 0)//接收不正確,重新發(fā)送
SM2 = 1; //設(shè)置監(jiān)聽狀態(tài)
ES = 1; //開串行口中斷
}
void receive_data(void)
{
uchar p, i;
receive_ready = 0;
while(1)
{
p=0; //清校驗(yàn)和
for(i=0; i8; i++)
{
while(RI != 1); RI = 0;
receive_buf[i] = SBUF; //接收一數(shù)據(jù)
p += receive_buf[i];
}
while(RI != 1); RI = 0;
if(SBUF==p) {SBUF=0x00; break;}
//校驗(yàn)和相同,發(fā)00
else{
SBUF=0xff; //校驗(yàn)和不同,發(fā)0FF
while(TI == 0); TI = 0;}
}
SM2 = 1;
ES = 1;
}
評論