?? 7022b.c
字號:
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/delay.h>
#include <7022b.h>
// #define uchar unsigned char
// #define uint unsigned int
// #define ulong unsigned long
#define CS_0 PORTB&=~_BV(PB0)
#define CS_1 PORTB|=_BV(PB0)
#define SCLK_0 PORTB&=~_BV(PB1)
#define SCLK_1 PORTB|=_BV(PB1)
#define DIN_0 PORTB&=~_BV(PB2)
#define DIN_1 PORTB|=_BV(PB2)
// #define DOUT_0 PORTB&=~_BV(PB3)
// #define DOUT_1 PORTB|=_BV(PB3)
char buffer[150]={};
char ave_buffer[150]={};
void jisuan(char num);
int Power_signal(long P_data) //單項功率計算
{ return((int)(P_data>>8)); }
long Power_more(long P_data) //多項功率計算
{ return(P_data>>6); }
int effec_VI(long VI_data) //電壓電流有效值計算
{ return((int)(VI_data>>13));}
char Power_factor(long PF_data) //功率因數(shù)計算
{ return((char)(PF_data>>23));}
int wire_freq(long WF_data) //線頻率計算
{ return((int)(WF_data>>13));}
char Tem_T(long T_data) //溫度計算
{ return((char)(T_data&0x0000ff));}
char P_D(long D_data) //功率方向,Bit0-3對應(yīng)有功功率方向,
{ return((char)(D_data&0x0000ff));} //Bit4-7對應(yīng)無功功率方向,0表示正,1表示負(fù)
char Phase_V(long PV_data) //電壓相序,1為次箜,0為正確
{ if((PV_data>>3)&0x000001) return(0x0f); //錯誤
else return(0x00); } //正確
char Phase_I(long PI_data) //電流相序,1為錯,0為正確
{ if((PI_data>>4)&0x000001) return(0xf0); //錯誤
else return(0x00); } //正確
long ReadSpi(char Com1) //SPI讀操作
{ char Y_N0,n1,m1;
long Data1;
CS_1;
SCLK_0;
CS_0;
for(n1=8;n1>0;n1--)
{
SCLK_1;
Y_N0=Com1&0x01;
Com1=Com1>>1;
if(Y_N0)
DIN_1;
else
DIN_0;
SCLK_0;
}
_delay_us(3);
for(m1=24,Data1=0;m1>0;m1--)
{
SCLK_1;
if(PORTB&0X08)
Data1=Data1|0x800000;
else
Data1=Data1&0x7fffff;
Data1=Data1>>1;
SCLK_0;
}
CS_1;
return(Data1);
}
void WriteSpi(char Com2,long Data2) //SPI寫操作
{ char Y_N1,n2,m2;
long Y_N2;
CS_1;
SCLK_0;
CS_0;
for(n2=8;n2>0;n2--)
{
SCLK_1;
Y_N1=Com2&0x01;
Com2=Com2>>1;
if(Y_N1)
DIN_1;
else
DIN_0;
SCLK_0;
}
for(m2=24;m2>0;m2--)
{
SCLK_1;
Y_N2=Data2&0x000001;
Data2=Data2>>1;
if(Y_N2)
DIN_1;
else
DIN_0;
SCLK_0;
}
CS_1;
}
void main(void)
{
char i;
DDRB=0xFB; //11111011
for(i=0;i<=2;i++)
{
switch(i)
{
case 0:
WriteSpi(0x2F,0x000000);
jisuan(0);
break;
case 1:
WriteSpi(0x2F,0x001228);
WriteSpi(0x2D,0x007812); //基波選擇
WriteSpi(0x3C,0x0055AA);
jisuan(1);
break;
case 2:
WriteSpi(0x2F,0x001228);
WriteSpi(0x2D,0x007812); //諧波選擇
WriteSpi(0x3C,0x000000);
jisuan(2);
break;
default: ;
}
}
}
void jisuan(char num)
{ int a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,c1,c2,c3,c4,c5,d;
long t1,t2,t3;
char v1,i1;
a1=Power_signal(ReadSpi(r_Pa)); //把A相有功功率值放入buffer中,第八位在前,高八位在后
buffer[0+num*50]=(char)(a1&0x00ff);
buffer[1+num*50]=(char)((a1&0xff00)>>8);
b1=Power_signal(ReadSpi(r_Pb));
buffer[2+num*50]=(char)(b1&0x00ff);
buffer[3+num*50]=(char)((b1&0xff00)>>8);
c1=Power_signal(ReadSpi(r_Pc));
buffer[4+num*50]=(char)(c1&0x00ff);
buffer[5+num*50]=(char)((c1&0xff00)>>8);
t1=Power_more(ReadSpi(r_Pt));
buffer[6+num*50]=(char)(t1&0x0000ff);
buffer[7+num*50]=(char)((t1&0x00ff00)>>8);
buffer[8+num*50]=(char)(((t1&0xff0000)>>8)>>8);
a2=Power_signal(ReadSpi(r_Qa)); //把A相無功功率值放入buffer中,第八位在前,高八位在后
buffer[9+num*50]=(char)(a2&0x00ff);
buffer[10+num*50]=(char)((a2&0xff00)>>8);
b2=Power_signal(ReadSpi(r_Qb));
buffer[11+num*50]=(char)(b2&0x00ff);
buffer[12+num*50]=(char)((b2&0xff00)>>8);
c2=Power_signal(ReadSpi(r_Qc));
buffer[13+num*50]=(char)(c2&0x00ff);
buffer[14+num*50]=(char)((c2&0xff00)>>8);
t2=Power_more(ReadSpi(r_Qt));
buffer[15+num*50]=(char)(t2&0x0000ff);
buffer[16+num*50]=(char)((t2&0x00ff00)>>8);
buffer[17+num*50]=(char)(((t2&0xff0000)>>8)>>8);
a3=Power_signal(ReadSpi(r_Sa)); //把A相視在功率值放入buffer中,第八位在前,高八位在后
buffer[18+num*50]=(char)(a3&0x00ff);
buffer[19+num*50]=(char)((a3&0xff00)>>8);
b3=Power_signal(ReadSpi(r_Sb));
buffer[20+num*50]=(char)(b3&0x00ff);
buffer[21+num*50]=(char)((b3&0xff00)>>8);
c3=Power_signal(ReadSpi(r_Sc));
buffer[22+num*50]=(char)(c3&0x00ff);
buffer[23+num*50]=(char)((c3&0xff00)>>8);
t3=Power_more(ReadSpi(r_St));
buffer[24+num*50]=(char)(t3&0x0000ff);
buffer[25+num*50]=(char)((t3&0x00ff00)>>8);
buffer[26+num*50]=(char)(((t3&0xff0000)>>8)>>8);
a4=effec_VI(ReadSpi(r_URmsa)); //把A相電壓有效值送入buffer
buffer[27+num*50]=(char)(a4&0x00ff);
buffer[28+num*50]=(char)((a4&0xff00)>>8);
b4=effec_VI(ReadSpi(r_URmsb));
buffer[29+num*50]=(char)(b4&0x00ff);
buffer[30+num*50]=(char)((b4&0xff00)>>8);
c4=effec_VI(ReadSpi(r_URmsc));
buffer[31+num*50]=(char)(c4&0x00ff);
buffer[32+num*50]=(char)((c4&0xff00)>>8);
a5=effec_VI(ReadSpi(r_IRmsa)); //把A相電流有效值送入buffer
buffer[33+num*50]=(char)(a5&0x00ff);
buffer[34+num*50]=(char)((a5&0xff00)>>8);
b5=effec_VI(ReadSpi(r_IRmsb));
buffer[35+num*50]=(char)(b5&0x00ff);
buffer[36+num*50]=(char)((b5&0xff00)>>8);
c5=effec_VI(ReadSpi(r_IRmsc));
buffer[37+num*50]=(char)(c5&0x00ff);
buffer[38+num*50]=(char)((c5&0xff00)>>8);
buffer[39+num*50]=Power_factor(ReadSpi(r_Pfa)); //把A相功率因數(shù)送入buffer
buffer[40+num*50]=Power_factor(ReadSpi(r_Pfb));
buffer[41+num*50]=Power_factor(ReadSpi(r_Pfc));
buffer[42+num*50]=Power_factor(ReadSpi(r_Pft));
d=wire_freq(ReadSpi(r_Freq)); //把線頻率送入buffer
buffer[43+num*50]=(char)(d&0x00ff);
buffer[44+num*50]=(char)((d&0xff00)>>8);
buffer[45+num*50]=Tem_T(ReadSpi(r_TempD)); //把溫度值送入buffer
buffer[46+num*50]=P_D(ReadSpi(r_PFlag)); //把功率方向送入buffer
v1=Phase_V(ReadSpi(r_SFlag)); //0x0f表示錯誤,0x00表示正確
i1=Phase_I(ReadSpi(r_SFlag)); //0xf0表示錯誤,0x00表示正確
buffer[47+num*50]=v1|i1; //高四位為電流,第四位為電壓,
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -