📄 mainproject.c
字号:
#include "regs2407.h"
#include "float.h"
#include "math.h"
//#include "HZTABLE.h"
#define pi 3.1415926
float cap[2]={0,0}; //用于保存cap4两次捕捉的数值
float ss=0;
unsigned int number=0; //T1PR的数值,计算频率后由number=30m/(fre*256)得出
float adcin1[256],adcin4[256],
adcin6[256],adcin7[256],sin_tab[256],cos_tab[256],adcin5[256],adcin2[256],adcin3[256]; //adc采样数据的7个存储区,分别保存1~7通道采样结果
//unsigned int *presult1,*presult2,*presult3,*presult4,*presult5,*presult6,*presult7; // 7个指针分别指向adc 1~7数据缓冲寄存器
int boxing1[256],boxing2[256];
int bbb[320]; //显示9个单元 16*9
int clear1[64],clear2[64];
float w[256],dataR[256],dataI[256],clear3[256],clear4[256];
int newconvert=0; //采样保存结果标志位
int adcount=0; //采样次数
int cursor_reg=0; //显示屏选择控制寄存
int flag_set=0; //XINT2中断,用于响应按键
float fre; //输入信号频率
//float sin_tab[256],cos_tab[256];
float Vmax=-5;
float Imax=-5;
float VITUREu=0;
float VITUREi=0;
float Spower=0;
float Ppower;
float Qpower=0;
float Qz; //功率因素角
int flag_show=0;
//void key_scane(void);
void shuju(int x);
int m=0;
extern unsigned int hzk168[];
void delay10ms(void)
{int i;for(i=4000;i>0;i--) i=i;}
void enable()
{
asm(" CLRC INTM ");
}
void disable()
{
asm(" setc INTM ");
}
//ADC初始化
void iniadc(void)
{
ADCCTRL1 =0X2fc0; //连续转换模式
// ADCCTRL1 =0X2000; //启动停止转换模式
MAXCONV =0X0002; //每次完成7个转换通道
// MAXCONV =0X0000;
// CHSELSEQ1 =0X0001;
CHSELSEQ1 =0X210; //转换顺序1~7
// CHSELSEQ2 =0X0763;
/* *presult1=RESULT1;
presult2=RESULT2;
presult3=RESULT3;
presult4=RESULT4;
presult5=RESULT5;
presult6=RESULT6;
presult7=RESULT7;
*/
EVAIMRA =0x0080; //使能T1PINT
// EVAIMRA |=0x0100;
EVAIFRA =0XFFFF;
T1CNT =0;
T1PR =number;
GPTCONA =0X2100;
// T1PR =1825;
// ADCCTRL2 =0x4700; //EVA事件启动转换,转换完成中断
ADCCTRL2 =0X2000; //向SOC位写1启动转换
T1CON =0X1140; // 连续增计数方式,启动计数器 2分频
// T1CON =0X1146;
}
//cap4初始化--测量频率
void inicap4(void)
{
CAPFIFOB=0X0000;
T3PR = 0xffff;
T3CNT=0; //每中断一次读一次计数器的值
WSGR=0X0000;
CAPCONB=0X0A240;
// T3CON=0X1e4c; //连续增计数,使能定时器操作,16分频,cpu时钟,计数器等于0或周期寄存器重载
T3CON=0X174c; //128分频
m=0;
cap[0]=0;
cap[1]=0;
}
void inixint2(void)
{
XINT2CR =0XFFF5;
}
//系统初始化
void initial()
{
asm(" setc SXM");
asm(" clrc OVM") ;
asm(" clrc CNF") ;
SCSR1 = 0x02ff; //CLOCK=40M
// SCSR1 = 0x12ff; //cpu进入LPM1模式、系统时钟频率2*fin、ADC,SCI,SPI,CAN,EVB,EVA模块时钟使能
SCSR2 = 0X000E;
// SCSR2 = 0X000a; //禁止引导ROM,SARAM映射到片内数据空间
WDCR = 0x6F; //不使能看门狗
WDKEY= 0x055;
WDKEY= 0x0AA;
EVBIMRA |=0X0080;
EVBIMRC |=0X0001;
EVBIFRA=0XFFFF;
EVBIFRC =0XFFFF;
IFR =0XFFFF;
PIRQR0=0;
PIRQR1=0;
PIRQR2=0;
PIACKR0=0;
PIACKR1=0;
PIACKR2=0;
IMR = 0x0B;
// IMR |= 0x01;
MCRB=0X0100; //IOPC4~IOPC7 XINT2
// MCRB = 0;
MCRC |=0x0880; //IOPE7配置为CAP4
PADATDIR = 0xf8ff; //IOPA3~7:output
PDDATDIR = 0x0000; //XINT2:input
PCDATDIR = 0x010f; //IOPC0:output,IOPC4~IOPC7:input
// PEDATDIR = 0x60ff; //IOPE5~6:output
PFDATDIR = 0x66db; //IOPF6,5,2,1:output
PEDATDIR &=0x7f00; //IOPE7配置为输入
GPTCONB = 0x48;
T4CON = 0x1046; //T4工作于连续增/计数模式,使用cpu时钟,计数器等于周期寄存器时重载
T4CNT = 0;
T4PR = 1000; //40KHz
T4CMPR=800;
}
void interrupt c_dummy1(void)
{ //EVBIFRA=0xFFFE;
asm(" CLRC INTM ");
// return;
}
void interrupt TPINT(void)
{
switch(PIVR)
{
case 0x002f: //T3周期中断
{
// ss++;
EVBIFRA |=0XFFFF;
break;
}
case 0x0027: //T1周期中断
{
newconvert=1; //设置保存标志;
EVAIFRA =0XFFFF;
break;
}
default:break;
}
asm(" CLRC INTM ");
return;
}
void interrupt CAP4(void)
{
switch(PIVR)
{
case 0x0036:
// T3CON |=0X0040;
cap[m]=CAP4FBOT;
// t[m]=ss;
m++;
EVBIFRC |=0x01;
// t3=0;
break;
default:break;
}
asm(" CLRC INTM ");
T3CNT=0;
return;
}
void interrupt XINT2(void)
{
switch(PIVR)
{
case 0x0011:
flag_set=1;
EVBIFRC |=0x01;
XINT2CR |=0x8000;
// key_scane();
break;
// case 0x0004:
// newconvert=1; //设置保存标志;
// ADCCTRL2 |=0X4200;
break;
default:break;
}
asm(" CLRC INTM ");
return;
}
//频率计算
void frequency(void)
{
// fre=(float)(18750/cap[1]);
fre=(float)(31250/cap[1]);
fre=fre*40;
number=(unsigned int)(78125/fre); //每个周期采样数为256
}
//采样结果保存
void adc(void)
{
unsigned int work;
if(newconvert==1)
{
newconvert=0;
work=RESULT1; //取通道1结果
work>>=6; //移位去掉低6位
adcin1[adcount]=(float)work*0.0032258-1.66; //保存结果,0.0032258为每点基准数
boxing1[adcount]=work;
work=RESULT2;
work>>=6;
adcin2[adcount]=(float)work*0.0032258-1.66;
boxing2[adcount]=work;
/*
work=RESULT3;
work>>=6;
adcin3[adcount]=(float)work*0.0032258;
work=RESULT4;
work>>=6;
adcin4[adcount]=(float)(work*0.0032258);
work=RESULT5;
work>>=6;
adcin5[adcount]=(float)work*0.0032258;
work=RESULT6;
work>>=6;
adcin6[adcount]=(float)work*0.0032258;
work=RESULT7;
work>>=6;
adcin7[adcount]=(float)work*0.0032258;
*/
adcount++;
}
}
void show(int a[],int clear[])
{
int i,j,k,xxx,dd,fu,x,y,aaa,cc,b[64];
/* for(i=1;i<14;i++)
{
for(j=90;j<131;j++)
{
for(k=0;k<8;k++)
{
Clear_boxing(i,j,k);
}
}
} */
for(i=0;i<64;i++)
{
b[i]=a[i*4];
}
for(i=1;i<=13;i++) //显示横坐标
{
for(j=0;j<8;j++)
{
boxing_show(i,110,j);
}
}
for(i=90;i<=130;i++) //显示纵坐标
{
boxing_show(1,i,7);
}
for(i=0;i<64;i++)
{
j=(int)(i/8);
fu=-1;
xxx=b[i]-511;
if(xxx<0)
{
xxx=-xxx;
fu=1;
}
dd=xxx;
y=(int)(dd/16); //纵坐标
x=i-j*8; //横坐标
aaa=7-x;
cc=110+fu*y;
if(cc!=clear[i]) Clear_boxing(j+1,clear[i],aaa); //如果和上次采样值不同,则把上次显示清出
boxing_show(j+1,cc,aaa);
clear[i]=cc;
}
}
void v_i(int x)
{
float vcompare,icompare;
int i,y,Nv,Ni,zzz;
float *p,*r,pow=0;
y=x+1;
switch(x)
{
case 0x001:
{
p=adcin1;
break;
}
case 0x002:
{
p=adcin2;
break;
}
case 0x003:
{
p=adcin3;
break;
}
default:break;
}
switch(y)
{
case 0x002:
{
r=adcin2;
break;
}
case 0x003:
{
r=adcin3;
break;
}
case 0x006:
{
r=adcin6;
break;
}
default:break;
}
for(i=0;i<256;i++) //电压、电流最大值计算
{
vcompare=*(p+i);
icompare=*(r+i);
if(Vmax<vcompare) Vmax=vcompare;
if(Imax<icompare) Imax=icompare;
}
for(i=0;i<256;i++) //电压、电流有效值计算
{
VITUREu=VITUREu+(*(p+i))*(*(p+i));
VITUREi=VITUREi+(*(r+i))*(*(r+i));
}
VITUREu=(float)sqrt(VITUREu/256);
VITUREi=(float)sqrt(VITUREi/256);
for(i=0;i<256;i++) //有功功率
{
Spower=Spower+(*(p+i))*(*(r+i));
}
Spower=Spower/256;
Ppower=VITUREu*VITUREi; //电压、电流视在功率计算
Qpower=(float)sqrt(Ppower*Ppower-Spower*Spower); //电压、电流无功功率计算
Qz=Spower/Ppower; //功率因数COSλ计算
}
void sin_cos(void)
{
int i;
/********** 以下为256点三角函数存储表 ************/
float pi1[]={
1.000000000,0.999698819,0.998795456,0.997290457,
0.995184727,0.992479535,0.98917651, 0.985277642,
0.98078528, 0.97570213, 0.970031253,0.963776066,
0.956940336,0.949528181,0.941544065,0.932992799,
0.923879533,0.914209756,0.903989293,0.893224301,
0.881921264,0.870086991,0.85772861, 0.844853565,
0.831469612,0.817584813,0.803207531,0.788346428,
0.773010453,0.757208847,0.740951125,0.724247083,
0.707106781,0.689540545,0.671558955,0.653172843,
0.634393284,0.615231591,0.595699304,0.575808191,
0.555570233,0.53499762, 0.514102744,0.492898192,
0.471396737,0.44961133, 0.427555093,0.405241314,
0.382683432,0.359895037,0.336889853,0.31368174,
0.290284677,0.266712757,0.24298018, 0.21910124,
0.195090322,0.170961889,0.146730474,0.122410675,
0.09801714, 0.073564564,0.049067674,0.024541229,
},
pi2[]={
0.00000000, 0.024541229, 0.049067674, 0.073564564, 0.09801714,
0.122410675, 0.146730474, 0.170961889, 0.195090322,
0.21910124, 0.24298018, 0.266712757, 0.290284677,
0.31368174, 0.336889853, 0.359895037, 0.382683432,
0.405241314, 0.427555093, 0.44961133, 0.471396737,
0.492898192, 0.514102744, 0.53499762, 0.555570233,
0.575808191, 0.595699304, 0.615231591, 0.634393284,
0.653172843, 0.671558955, 0.689540545, 0.707106781,
0.724247083, 0.740951125, 0.757208847, 0.773010453,
0.788346428, 0.803207531, 0.817584813, 0.831469612,
0.844853565, 0.85772861, 0.870086991, 0.881921264,
0.893224301, 0.903989293, 0.914209756, 0.923879533,
0.932992799, 0.941544065, 0.949528181, 0.956940336,
0.963776066, 0.970031253, 0.97570213, 0.98078528,
0.985277642, 0.98917651, 0.992479535, 0.995184727,
0.997290457, 0.998795456, 0.999698819,
};
for(i=0;i<64;i++)
{
sin_tab[i]=pi2[i];
sin_tab[i+64]=pi1[i];
sin_tab[i+128]=-pi2[i];
sin_tab[i+192]=-pi1[i];
cos_tab[i]=pi1[i];
cos_tab[i+64]=-pi2[i];
cos_tab[i+128]=-pi1[i];
cos_tab[i+192]=pi2[i];
}
}
//电压显示
void show_voltage(int x)
{
flag_show=1;
ClearScreen();
//----------以下为液晶屏左边,显示电压数据-----------
ShowHZ1616(5,1,4); //电
ShowHZ1616(7,1,5); //压
ShowHZ168(9,1,x); //1,2,3
ShowHZ1616(1,20,24); //最
ShowHZ1616(3,20,25); //大
ShowHZ1616(5,20,26); //值
ShowHZ168(7,20,14); //:
ShowHZ168(9,20,15); //.
ShowHZ1616(1,37,27); //有
ShowHZ1616(3,37,28); //效
ShowHZ1616(5,37,26); //值
ShowHZ168(7,37,14); //:
ShowHZ168(9,37,15); //.
ShowHZ1616(20,1,4); //电
ShowHZ1616(22,1,6); //流
ShowHZ168(24,1,x+3); //1,2,3
ShowHZ1616(16,20,24); //最
ShowHZ1616(18,20,25); //大
ShowHZ1616(20,20,26); //值
ShowHZ168(22,20,14); //:
ShowHZ168(24,20,15); //.
ShowHZ1616(16,37,27); //有
ShowHZ1616(18,37,28); //效
ShowHZ1616(20,37,26); //值
ShowHZ168(22,37,14); //:
ShowHZ168(24,37,15); //.
ShowHZ1616(1,54,27); //有
ShowHZ1616(3,54,31); //功
ShowHZ1616(5,54,31); //功
ShowHZ1616(7,54,8); //率
ShowHZ168(9,54,14); //:
ShowHZ168(11,54,15); //.
ShowHZ1616(16,54,30); //无
ShowHZ1616(18,54,31); //功
ShowHZ1616(20,54,31); //功
ShowHZ1616(22,54,8); //率
ShowHZ168(24,54,14); //:
ShowHZ168(26,54,15); //.
ShowHZ1616(1,71,31); //功
ShowHZ1616(3,71,8); //率
ShowHZ1616(5,71,32); //因
ShowHZ1616(7,71,10); //数
ShowHZ168(9,71,14); //:
ShowHZ168(11,71,15); //.
ShowHZ1616(16,71,7); //频
ShowHZ1616(18,71,8); //率
ShowHZ168(20,71,14); //:
ShowHZ168(24,71,15); //.
shuju(x);
}
void shuju(int x)
{
float max,viture,powe,qpowe,ppp;
int i,j,k,l,o;
v_i(x);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -