📄 msp430f135pro.txt
字号:
if(fredata_a!=1)sum_a=sum_a+t;
if(fredata_a>=51) //1000ms计算频率
{
sum_a=sum_a/50;
f=100000000/sum_a; //用uint型计算只能精确到个位,用ulong型计算能够精确到小数点后一位
//f=f-20;
f=(FRE_A+f)>>1;
FRE_A=(uint)f;
sum_a=0;
fredata_a=0;
prea_time=cura_time=0;
}
}
}
else if((P1IFG&0x04)==0x04)
{
P1IFG=P1IFG&0xFB;
/*
if(B_W<2000)//原来为小于100V,改为小于20V频率上传为0
{
FRE_B=0;
return;
}
*/
curb_time=TBR; //中断后读取T0时间为当前时间
if(curb_time>preb_time)t=curb_time-preb_time; //如果没有溢出,当前时间-上次时间=周期
else t=65535-preb_time+curb_time; //如果溢出,65536-上次时间+当前时间=周期
//if((t>=30000)||(t<=15000))t=20000;
preb_time=curb_time;
if((t<=30000)&&(t>=15000))
{
fredata_b++;
if(fredata_b!=1)sum_b=sum_b+t;
if(fredata_b>=51) //1000ms计算频率
{
sum_b=sum_b/50;
f=100000000/sum_b; //用uint型计算只能精确到个位,用ulong型计算能够精确到小数点后一位
//f=f-20;
f=(FRE_B+f)>>1;
FRE_B=(uint)f;
sum_b=0;
fredata_b=0;
preb_time=curb_time=0;
}
}
}
else
{
P1IFG=0x00;
}
}
void main_init(void)
{
_DINT();
BCSCTL1 |=XTS;
BCSCTL2 |=SELM1+SELM0;
U0CTL&=~SWRST;
com_flag=bittest(P3IN,6);
U0CTL |= MM+CHAR; // Address Mode on ; 8-bits ; 1-SP ; 1-ST
U0TCTL |=SSEL0; // System clock ACLK
U0RCTL |=URXWIE; //set URXWIE=1, RX Wake up interrupt enable with adddress
UBR00 =0xA0; // 19200=8000000/(416+m),UBR=416
UBR10 =0x01;
UMCTL0 |=0x57; // m=(m7+m6+m5+m4+m3+m2+m1+m0)/8=0.625
P6SEL |= 0x3F; // P6.0-P6.5 ADC option select Enable A/D channel inputs
//P6SEL |= 0xFF; // P6.0-P6.7 ADC option select Enable A/D channel inputs
ADC12CTL0 |= ADC12ON+MSC+REFON+SHT0_4; // Set sampling time, turn on ADC12
ADC12CTL1 |= SHP+CONSEQ_1; // Use sampling timer
ADC12MCTL0|=SREF_0+INCH_0; // ref+=AVCC, channel = A0
ADC12MCTL1|=SREF_0+INCH_1; // ref+=AVCC, channel = A1
ADC12MCTL2|=SREF_0+INCH_2; // ref+=AVCC, channel = A2
ADC12MCTL3|=SREF_0+INCH_3; // ref+=AVCC, channel = A3
ADC12MCTL4|=SREF_0+INCH_4; // ref+=AVCC, channel = A4
ADC12MCTL5|=EOS+SREF_0+INCH_5; // ref+=AVCC, channel = A5
//ADC12MCTL6|=SREF_0+INCH_6; // ref+=AVCC, channel = A6
//ADC12MCTL7|=EOS+SREF_0+INCH_7; // ref+=AVCC, channel = A7
//ADC12IE |=BIT7; //Enable ADC12IFG.7
ADC12IE |=BIT5; //Enable ADC12IFG.5
ADC12CTL0 |=ENC+ADC12SC; //Enable conversions+Start conversion
TACTL|=TASSEL0+MC1+TAIE;
TAR=1328; //166us
TBCTL|=TBSSEL0+MC1+ID0+ID1;
P5DIR |= 0xF8; // Set P5.3-P5.7 to output direction
P3SEL |=BIT5+BIT4;
P5OUT=0x08;
ME1 |= URXIE0; // Enable WDT/RXD interrupt
IE1 |= URXE0+UTXE0;
P1IE |= 0x06; // Set P1.1-P1.2 Interrupt Enable,rising edge
load_info();
_EINT();
DIS_485;
}
void clear_watchdog() /*清看门狗子程序*/
{
uint t;
t=(WDTCTL)&0x00ff;
WDTCTL =t+WDTPW +WDTCNTCL;
}
void ad_convert(void)
{
float a0,a1,b1,sum;
uchar i;
int w,w0[6];
for(a0=0,i=0;i<=MAX_AD_COUNT;i++)
{ xx[i]=xx[i]-2048;
a0=a0+xx[i];
}
a0=a0/MAX_AD_COUNT;
for(a1=0,b1=0,sum=0,i=0;i<=MAX_AD_COUNT;i++)
{
w=i*3;
sum=xx[i];
if(w<=90)sum=sum*SINBOM[w/3];
else if((w>90)&&(w<=180))sum=sum*SINBOM[(180-w)/3];
else if((w>180)&&(w<=270)){sum=sum*SINBOM[(w-180)/3];sum=0-sum;}
else if((w>270)&&(w<=360)){sum=sum*SINBOM[(360-w)/3];sum=0-sum;}
sum=sum/65535;
a1=a1+sum;
sum=xx[i];
if(w<=90)sum=sum*SINBOM[(90-w)/3];
else if((w>90)&&(w<=180)){sum=sum*SINBOM[(90-(180-w))/3];sum=0-sum;}
else if((w>180)&&(w<=270)){sum=sum*SINBOM[(90-(w-180))/3];sum=0-sum;}
else if((w>270)&&(w<=360))sum=sum*SINBOM[(90-(360-w))/3];
sum=sum/65535;
b1=b1+sum;
}
a1=a1*2/(MAX_AD_COUNT);
b1=b1*2/(MAX_AD_COUNT);
sum=sqrt(a0*a0+a1*a1+b1*b1);
if(b1!=0x00)
w0[adc_step]=atan(a1/b1)*180.0/__PI;
*(adsum+adc_step)+=sum;
adc_step=(++adc_step)%9;
if(adcount==0x01)
{
pha=0;
w=w0[0]-w0[1];
if((fabs(w))<60)pha=1;
w=w0[1]-w0[2];
if((fabs(w))<60)pha=1;
w=w0[0]-w0[2];
if((fabs(w))<60)pha=1;
phb=0;
w=w0[3]-w0[4];
if((fabs(w))<60)phb=1;
w=w0[4]-w0[5];
if((fabs(w))<60)phb=1;
w=w0[3]-w0[5];
if((fabs(w))<60)phb=1;
for(i=0;i<9;i++)
{
if(*(adresult+i)!=0x00)*(adresult+i)=(*(adresult+i)+(*(adsum+i)>>1))/2;
else *(adresult+i)=*(adsum+i)>>1;
*(adsum+i)=0;
}
ad_end=1;
}
if(adc_step==0x08)adcount=(++adcount)%2;
if(adc_step<=0x02)P5OUT=P5OUT&0x1F;
else P5OUT=P5OUT|0xEF;
adc_count=0;
ad_begin=0;
}
void ad_process50(void)
{
ulong t;
uchar i,l;
for(i=0;i<6;i++)
{
t=*(adresult+i); //通信协议规定0-FFFFH表示0-655.36,因此数据应乘以100
*(adv_result+i)=(t*707*100/2048); //测量最大值为707V对应2048
if((*(adv_result+i)>50000)||(*(adv_result+i)<2000)) //电压超过500V上传0,小于20V上传0
*(adv_result+i)=0;
*(adv_result+i)=*(adv_result+i)+(int)adjust[i]*100;
}
A_U=*(adv_result);
A_V=*(adv_result+1);
A_W=*(adv_result+2);
B_U=*(adv_result+3);
B_V=*(adv_result+4);
B_W=*(adv_result+5);
if((k_data&0x20)==0x20)
{
l=hgq_i[hgq_adr]; //根据不同的互感器规格,系数有所变化
for(i=0;i<3;i++)
{
t=*(adresult+6+i);
*(adi_result+i)=(t*141*100*2*l/2048); //系统最大电流600A*48V/220V=130A,100A作为电流上限可以满足
if((*(adi_result+i)>(10000*l))||(*(adi_result+i)<(200*l))) //电流超过100A上传0,小于2A上传0
*(adi_result+i)=0;
*(adi_result+i)=*(adi_result+i)+(int)adjust[i+6]*100;
}
I_U=*(adi_result);
I_V=*(adi_result+1);
I_W=*(adi_result+2);
}
else
{
I_U=0;
I_V=0;
I_W=0;
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
main_init();
//WDTCTL = WDT_ARST_1000; // WDT 8ms, ACLK, interval timer
while(1)
{
clear_watchdog();
k_data=read_k(); //拨码设置
if((k_data|0x3F)==0xFF)txd_adr=0x01; //交流检测板地址
if((k_data|0x3F)==0x7F)txd_adr=0x02;
if((k_data|0x3F)==0xBF)txd_adr=0x03;
if((k_data|0x3F)==0x3F)txd_adr=0x04;
if((k_data|0xDF)==0xFF)
{
hgq_adr=k_data&0x0E;
hgq_adr>>=1;
}
if((k_data&0x10)!=0x10)
{
P1IE=0x00;
FRE_A=FRE_B=5000;
}
if(fl_count<100)
{
if(fl_data!=read_fl())
{
fl_count=0;
fl_data=read_fl();
}
else fl_count++;
}
else
{
fl_count=0;
fig_1=fl_data;
}
if(zh_count<100)
{
if(zh_data!=read_z())
{
zh_count=0;
zh_data=read_z();
}
else zh_count++;
}
else
{
zh_count=0;
fig_2=zh_data;
}
if(ad_begin)
{
ad_convert();
}
if(ad_end)
{
ad_end=0;
ad_process50();
}
if(save==0xaa)
{
save=0;
save_info();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -