📄 main.c
字号:
#include "LF2407.H"
#include "public.h"
#include "main.H"
#include "math.h"
#include "string.h"
#include "stdlib.h"
void inline Disable(void)
{
asm(" setc INTM ");
}
void inline Enable(void)
{
asm(" clrc INTM ");
}
void interrupt nothing(void)
{
Enable();
return;
}
/*高优先级有ADC中断*/
void interrupt c_int1(void)
{
uint i;
if(*PIVR==0X04)
{
asm(" clrc SXM "); /*抑制符号扩展*/
Enable();
samp0[samp]=*RESULT0>>6;
samp1[samp]=*RESULT1>>6;
samp2[samp]=*RESULT2>>6;
samp3[samp]=*RESULT3>>6;
samp4[samp]=*RESULT4>>6;
samp5[samp]=*RESULT5>>6;
pin_count++; /*频率计数器*/
time_count++;
samp++;
if(samp>35)
{
samp=0;
memcpy(&samp6,&samp0,0x24);
memcpy(&samp7,&samp1,0x24);
memcpy(&samp8,&samp2,0x24);
memcpy(&samp9,&samp3,0x24);
memcpy(&samp10,&samp4,0x24);
memcpy(&samp11,&samp5,0x24);
for(i=0;i<4;i++)
{
if(tou_flag[i]==1)
{
tq_time[i]++;
if(tq_time[i]>SET_T*50)
{
dongzuo[i]=1;
tq_time[i]=0;
}
}
if(qie_flag[i]==1)
{
q_time[i]++;
if(q_time[i]>SET_T*50)
{
dzuo_q[i]=1;
q_time[i]=0;
}
}
}
if(led_flag==1)
led_count++;
if(led_count>1500)
{
led_count=0;
led_flag=0;
}
}
*ADCTRL2=*ADCTRL2|0x4200;
*ADCTRL2=*ADCTRL2&0X0BFFF;
}
*IFR=*IFR|0X001;
*EVAIFRB=*EVAIFRB|0X0FFFF;
Enable();
}i
/*中断2*/
void interrupt c_int2(void)
{
*EVAIFRA=*EVAIFRA|0X0FFFF;
*IFR=*IFR&0X002;
Enable();
return;
}
/*低优先级的外部中断1,用于测频模块*/
void interrupt c_int6(void)
{
if(*PIVR==0X01)
{
Enable();
if(pin_count>40)pin_count=0;
if(pin_count>30&&pin_count<40)
{
pin_lv1=pin_lv2;
pin_lv2=*T2CNT;
pin_lv=pin_count;
pin_count=0;
}
*XINT1CR=0X8007;
}
*IFR=*IFR&0X020;
}
/*低优先级的串口中断,*PIVR=6为串口接收,*PIVR=7为串口发送*/
void interrupt uarttr()
{
switch(*PIVR)
{
case 6:
receive[rece_count++]=*SCIRXBUF;
if(rece_count>999)rece_count=0;
rece_flag=1;
*IFR=0X10;
Enable();
break;
default:break;
}
}
//初始化模块
void Initial(void)
{
uint temp;
asm(" setc INTM ");
asm(" clrc OVM ");
asm(" clrc CNF ");
*SCSR1=0x80fe; /* clk=10M*4; cpuclk=40M */
*WDCR=0x0e8;
WSGR=0x6DB;
/********************************************************/
/* 定时器一,周期中断; */
/* 定时器556us周期中断 初始化 */
/* 中断2;中断向量为0x27; */
/* 每周波采样36点; 36*556us=20MS */
/********************************************************/
*EVAIFRA = 0xFFFF;
*EVAIFRB = 0xFFFF;
*EVAIMRA = 0x0000; /*T1周期中断使能*/
*EVAIMRB = 0x0001;
*GPTCONA=0X0400; /*周期中断标志来启动AD转换*/
*T2PER = 0x56C; /*20000us/36=555.55us中断一次;555.55*(40/16)=1388=0X56C;22222*25ns;*/
*T2CNT = 0;
*T2CON = 0x144c; /*定时器1连续增记数模式;时钟/16;*/
/*********************************************************/
/*测量频率 外中断一次;*/
/*********************************************************/
*XINT1CR=0X8007;
/********************************************************/
/*i/o口 初始化 */
/********************************************************/
*MCRA=*MCRA&0X0F0FF;
*PBDATDIR=*PBDATDIR&0X0F0F0; /*按键*/
/********************************************************/
/*时钟初始化;*/
/********************************************************/
// *MCRA=*MCRA&0x1fff;
// *PBDATDIR=*PBDATDIR|0x0e0c0; /* iopb6=clk; iopb7=i/o; scl sda=1;*/
*MCRA=*MCRA&0x0fff;
*PBDATDIR=*PBDATDIR|0x0f0c0; /* iopb6=clk; iopb7=i/o; scl sda=1;*/
/********************************************************/
/*电容出口初始化;*/
/********************************************************/
*MCRC=*MCRC&0x0f000;
*PEDATDIR=0X0ff00;
*PFDATDIR=0X0f00;
//*MCRC=*MCRC&0X0fffe;
//*PEDATDIR=*PEDATDIR|0X101;
/********************************************************/
/*ad中断初始化;*/
/********************************************************/
/********************************************************/
/* data flash 存储数据初始化; */
/********************************************************/
*SPICCR=0X0047;
*SPICTL=0X0006;
*SPIBRR=0X0009;
*MCRB=0X001C;
*PCDATDIR=*PCDATDIR|0X2020; /*IOPC5为输出方式;即SPISTE;*/
*SPICCR=*SPICCR|0X0080;
*SPIPRI=0x0030;
*SPITXBUF=0x5500;
while((*SPISTS&0x0040)==0);
temp=*SPIRXBUF;
/********************************************************/
/* 串行口初始化 */
/********************************************************/
*SCICCR=0x7; /* 8bit no even/odd */
*SCICTL1=0x13;
*SCICTL2=0X02;
*SCIHBAUD=0X2;
*SCILBAUD=0X08; /* 9600bps */
*SCICTL1=0X33;
*SCIPRI=0X60;
*MCRA|=0X03;
/********************************************************/
*IMR=0x31; /* 开中断2; 开中断1;*/
*IFR=0xffff;
/********************************************************/
}
//AD初始化函数
void Ad_Init(void)
{
/* *ADCTRL1=0x280; /*匹配阻抗为1K; 启动/停止模式;*/
*ADCTRL1=0X0;
*ADCTRL2=*ADCTRL2|0x500;
*MAXCONV=0x05;
*CHSELSEQ1=0x3210;
*CHSELSEQ2=0x54;
*CHSELSEQ3=0x0;
*CHSELSEQ4=0x0;
}
//变量初始化
void Soft_Init(void)
{
memset(&samp0,0,0x1b0);
memset(&u_abc,0,0x258);
memset(f_abc,5000,0x14);
memset(&up1_data.avr_u[0],0,19);
memset(&up2_data.avr_xb[0][0],0,102);
memset(&up3_data.set_shuju[0],0,19);
memset(&up4_data.tj_shuju[0],0,160);
rece_count=0;
serial_count=0;
rece_flag=0;
p_key=0;
p_mode=0;
p_screen=0X0FF;
enter_flag=0; /*修改参数确认键标志*/
screen_flag=0;
}
//计算频率函数
uint js_f(void)
{
ulong value1;
uint f,temp_per;
temp_per=*T2PER;
value1=0;
value1=(pin_lv-1)*400;
value1*=(temp_per+1);
value1+=(temp_per+pin_lv2+1-pin_lv1)*400;
value1/=1000;
f=100000000/value1;
return(f);
}
//计算电压电流
void Mea_Pq(int *addr1,int *addr2,uint abc)
{
float temp_ur,temp_ui,temp_ir,temp_ii;
float bianbi[6];
uint i;
temp_ur=0;
temp_ui=0;
temp_ir=0;
temp_ii=0;
for(i=0;i<6;i++)
{
if(bl_xishu[i]>1100||bl_xishu[i]<900)bl_xishu[i]=1000;
bianbi[i]=bl_xishu[i];
bianbi[i]/=1000;
}
for(i=0;i<36;i++)
{
temp_ur+=*(addr1+i)*cs0[i];
temp_ui+=*(addr1+i)*cs1[i];
}
temp_ur/=FOUR_D;
temp_ui/=FOUR_D;
temp_ur*=ui_xishu;
temp_ui*=ui_xishu;
temp_ur*=bianbi[abc];
temp_ui*=bianbi[abc];
u_abc[abc][mea_count]=sqrt(temp_ur*temp_ur+temp_ui*temp_ui);
for(i=0;i<36;i++)
{
temp_ir+=*(addr2+i)*cs0[i];
temp_ii+=*(addr2+i)*cs1[i];
}
temp_ir/=FOUR_D;
temp_ii/=FOUR_D;
temp_ir*=ci_xishu;
temp_ii*=ci_xishu;
temp_ir*=bianbi[abc+3];
temp_ii*=bianbi[abc+3];
// i_abc[abc][mea_count]=sqrt(temp_ir*temp_ir+temp_ii*temp_ii)*ct_array[SET_CT]/5;
i_abc[abc][mea_count]=sqrt(temp_ir*temp_ir+temp_ii*temp_ii);
//if(i_abc[abc][mea_count]<0.03)i_abc[abc][mea_count]=0; /*30MA*/
// else i_abc[abc][mea_count]=i_abc[abc][mea_count]*ct_array[SET_CT]/5;
p_abc[abc][mea_count]=(temp_ur*temp_ir+temp_ui*temp_ii)*ct_array[SET_CT]/500;
q_abc[abc][mea_count]=(temp_ui*temp_ir-temp_ur*temp_ii)*ct_array[SET_CT]/500;
c_abc[abc][mea_count]=p_abc[abc][mea_count]/sqrt((p_abc[abc][mea_count]*p_abc[abc][mea_count]+q_abc[abc][mea_count]*q_abc[abc][mea_count]));
}
//计算谐波FFT
float Xiebo_Fft(int * PP,uint i)
{
float Valr,Vali,Max,Min,Value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -