📄 define data struct.c
字号:
//***************************
//TLC1543 A/D data
//计算结果
//预设值
/****************************
每天工作数据:
蓄电池电电压:1路(最高值和最低值)每天
放电电流:1路(最高值和安时数的积分值)每天
充电电流:6路(最高值和安时数的积分值)每天
温度:1路(最高值和最低值)每天
每天9路数据18个值
其中安时数的积分值先计算出当前值然后积分
参考值:
电流:0-100A(0-4V)充电,0-300A(0-4V)放电
电压:0-300V(0-4V)
温度:2.73V(0度)。
设定数据:
电流模块选择:
充电:(25A,50A,100A,150A)
放电:(50A,100A,200A,300A)
系统电压:(48V,220 V,110V,300V)
温度校正:实测值
比例系数:20,50,100,100(48,110,220,300)
浮充工作点温度补偿:
48V(-96mv/度)
110V(-220mv/度)
220V(-440mv/度)
300V(-600mv/度)每升高1度
端口定义:
A/D端口:1-6充电电流11,8空端口,9温度,10电压,7放电电流
4069端口:1-6开关,8欠压报警,7启动油机
******************************/
/**/
#include <absacc.h>
#include <stdlib.h>
#include <AT89X52.H>
#include <INTRINS.h>
#include "charger.h"
#include "lcdp.h"
//
//-----------------------------
//define data struct
//-----------------------------
//System flag,char of control;
//-----------------------------
static bit bdata boostflag=1;
static unsigned char idata switchchar=0x3f;
/*
//init_system_work_point , counter rate flow
*/
#define BENCHMARK 5
#define AMPLIFICATORY 10//predefine 0.1 proccess, amplificatory 10
#define ADMAX 1024
static unsigned char xdata str[0x1800];
void init_system_work_point(void)
{
unsigned char idata i;
link xdata head;
link xdata new;
link xdata pointer;
for(i=0;i<7;i++)
{
sys[i]=dtab[2][i];//default=2,system is 220V
}
for(i=0;i<5;i++)//i=7
{
sys[i+7]=stab[i][2];
}
sys[12]=0;//tested temperature
init_mempool(str,0x1800);//&XBYTE[0x4000]
head=(link)malloc(sizeof(daydata));
if(head==0){text(0x90,"Head Null");delay(1000);return;}
text(0x80,"malloc is ok!");
head->next=NULL;
head->up=NULL;
delay(1000);
pointer=head;
for(i=0;;i++)
{
new=(link)malloc(sizeof(daydata));
if(new==0)break;
new->next=NULL;
new->up=NULL;
pointer->next=new;
new->up=pointer;
pointer=new;
};
pointer->next=head;
head->up=pointer;
WC_LCD(0x90);
WD_LCD(i);
delay(2000);
//The moving header
today.next=head;
today.up=pointer; //is head->up;
init_rate();
}
static void init_rate(void)
{
unsigned int data i;
crate.temperature=100*BENCHMARK*AMPLIFICATORY/ADMAX;
i=sys[11];
crate.volatage=i*BENCHMARK*AMPLIFICATORY/ADMAX;
i=sys[8];
crate.discharge=i*BENCHMARK*AMPLIFICATORY/ADMAX;
i=sys[9];
crate.charge=i*BENCHMARK*AMPLIFICATORY/ADMAX;
}
/*
//intput data from tlc1543,changed and saved
*/
void getadin(void)
{
unsigned char data i;
for(i=0;i<6;i++)
{
adin[i]=tlc1543(i)*crate.charge;
}
adin[6]=tlc1543(6)*crate.discharge;
adin[7]=tlc1543(8)*crate.temperature;
adin[8]=tlc1543(9)*crate.volatage;//9way
}
/*
//count today working result
*/
void account(void)
{
if(tlong%60==0)
//count Ah, per 10s //count max & min per 10s
{char i;
for(i=0;i<9;i++)
{
if(i<7)
{ //save current integral value
today.work[i*2+1]+=(today.work[i*2+1]+adin[i])/(60*2);
}
else
{//save max & min value
if(adin[i]>today.work[i*2+1])today.work[i*2+1]=adin[i];
else if(adin[i]<today.work[2*i])today.work[i*2]=adin[i];
}
//only save max value
if(adin[i]>today.work[2*i])today.work[i*2]=adin[i];
}
}
}
/*
//output control,switch operation
*/
#define boostvolatage sys[0]
#define booststart sys[1]
#define floatvolatage sys[2]
#define floatrecover sys[3]
#define moterstart sys[4]
#define lowlevel sys[5]
//alarm overload
#define overload sys[6]
#define dischargecurrent 13
//-----------------------------
#pragma DISABLE
static void controlswitch (unsigned char i)
{
P2_7=1;
_nop_();
P0=i;
_nop_();
P2_7=0;
_nop_();
_nop_();
}
//-----------------------------
static void alarm_overload()
{
}
//-----------------------------
void control(void)
{
unsigned int data t,b;
t=today.work[dischargecurrent];
if(t>overload)alarm_overload();
t=adin[8];// volatage of storage battery
b=AMPLIFICATORY*boostvolatage;//boost charge volatage
if(t>b)
{
switchchar=0x0;
controlswitch(switchchar);//all close & wcharge=0
boostflag=0;
}
else
if(boostflag)
{
b=AMPLIFICATORY*booststart;//boost charge start
if(t>b);
else
{
switchchar=0x3f;
controlswitch(switchchar);//6 way start
boostflag=1;
b=AMPLIFICATORY*moterstart;
if(t>b);
else
{
switchchar=0x7f;
controlswitch(switchchar);//6 way start and motor start
b=AMPLIFICATORY*lowlevel;
if(t>b);
else {switchchar=0xff;controlswitch(switchchar);}//not enough volatage alarm,6 way start and motor start
}
}
}
else
{
b=AMPLIFICATORY*floatvolatage;
if(t>b)
{
switchchar &= 0x3f;
switchchar>>=1;
controlswitch(switchchar);
}//close 1 way ,stop motor
else
{
b=AMPLIFICATORY*floatrecover;
if(t>b);
else {switchchar=0x3f;controlswitch(switchchar);}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -