📄 system.c
字号:
#include "system.h"
#include <can0h.h>
extern void uart3_turn_off (void);
extern void uart3_turn_on (void);
unsigned long Qout_temp;
unsigned int Qout_H;
unsigned int Qout_L;
unsigned char Qtemp[4];
unsigned char Qout_temp_flg;
void power_on_0 (void)
{
portbuf|=0x20;
write_9554(0x40,1,portbuf);
}
void para_init(void)
{
unsigned char check;
EEPROM_READ(1,check);
if(check==0x80)
{
EEPROM_READ(2,addr);
EEPROM_READ(3,baud_rate);
EEPROM_READ(4,amp);
EEPROM_READ(14,zero);
EEPROM_READ(24,da_para);
EEPROM_READ(40,alarm_val);
EEPROM_READ(48,charge_para);
}
else
{
check=0x80;
EEPROM_WRITE(1,check);
EEPROM_WRITE(2,addr);
EEPROM_WRITE(3,baud_rate);
EEPROM_WRITE(4,amp);
EEPROM_WRITE(14,zero);
EEPROM_WRITE(24,da_para);
EEPROM_WRITE(40,alarm_val);
EEPROM_WRITE(48,charge_para);
}
//uart1_init(baud_rate);
//charge_init();
mode=4;
}
void save_handle(void)
{
unsigned char check;
if(save_flag)
{
check=0x80;
EEPROM_WRITE(1,check);
EEPROM_WRITE(2,addr);
EEPROM_WRITE(3,baud_rate);
EEPROM_WRITE(4,amp);
EEPROM_WRITE(14,zero);
EEPROM_WRITE(24,da_para);
EEPROM_WRITE(40,alarm_val);
EEPROM_WRITE(48,charge_para);
save_flag=0;
}
}
void charge_init(unsigned char x)
{
if(!x)return;
period=x;
mode=charge_para[13+x];
//else mode=mode2;
time[0]=0;
time[1]=0;
time[2]=0;
charge_time=0;
if(mode==0)
{
dacV=dacV_max;
dacA=dacA_min;
}
else if(mode==1)
{
dacA=dacA_max;
dacV=dacV_min;
}
else if(mode==2)
{
dacV=dacV_max;
time[0]=charge_para[9];
time[1]=charge_para[10];
charge_time=(charge_para[9]*60+charge_para[10])*60;
}
else if(mode==3)
{
dacA=dacA_max;
time[0]=charge_para[12];
time[1]=charge_para[13];
charge_time=(charge_para[12]*60+charge_para[13])*60;
}
}
void adc_handle(void)
{
unsigned char i,j,ch;
unsigned int sum,max,min;
static unsigned char num=0;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:
ch=0x87;//输出电压
break;
case 1:
ch=0xC7;//输出电流
break;
case 2:
ch=0xA7;//交流AB
break;
case 3:
ch=0xE7;//交流BC
break;
case 4:
ch=0xB7;//温度
break;
default:
break;
}
adc_buf[i][num]=read_adc(ch);
sum=adc_buf[i][0];
max=adc_buf[i][0];
min=adc_buf[i][0];
for(j=1;j<5;j++)//YW****8
{
sum+=adc_buf[i][j];
if(max<adc_buf[i][j])max=adc_buf[i][j];
else if(min>adc_buf[i][j])min=adc_buf[i][j];
}
sum=sum-max-min;
if((screen_flag==6)&&(page_flag==i))
{
ad_result[i]=(((long)sum*dis_temp[0])>>15)+dis_temp[1];//YW***17
}
else ad_result[i]=(((long)sum*amp[i])>>15)+zero[i];//YW****17
}
if(++num>4)num=0;//YW*****7
}
unsigned int read_adc(unsigned char ch)
{
unsigned char i;
unsigned int temp;
CLI();
PORTB&=~(1<<csad);
for(i=0;i<8;i++)
{
PORTB&=~(1<<clkad);
if((ch&0x80)==0x00)
PORTB&=~(1<<dinad);
else
PORTB|=(1<<dinad);
PORTB|=(1<<clkad);
ch<<=1;
}
PORTB&=~(1<<clkad);
for(i=0;i<16;i++)
{
PORTB|=(1<<clkad);
NOP();
PORTB&=~(1<<clkad);
if((PINB&0x02)==0x02)temp|=0x01;
temp<<=1;
}
temp>>=4;
PORTB|=(1<<csad);
SEI();
return temp;
}
/********************************************************************/
// 充电状态切换
/********************************************************************/
void shift_handle(void)
{
static unsigned char mode_temp=4;
if(shift_flag)
{
work_time_perid=0;
if(++period<=period_all)
{
charge_init(period);
sound_on(); //转价段短鸣
sound_beep=1;
sound_beep_count=20;
}
else mode=4;
shift_flag=0;
}
if((Vbat_single_charge_max>Vbat_single_charge_lmt)||
(Ibat_charge>Ibat_single_charge_lmt)||
(Tbat_charge_max>Tbat_charge_lmt))
{
mode=4;
}
if(mode^mode_temp)
{
mode_temp=mode;
if(mode==4)
{
power_off();
dacV=dacV_min;
dacA=dacA_min;
time[0]=0;
time[1]=0;
time[2]=0;
charge_time=0;
period=0;
sound_on(); //关机长鸣
sound_beep=1;
sound_beep_count=250;
work_time_en=0;
work_time_car=0;
work_time_perid=0;
work_time_counter=0;
uart3_turn_off();
}
else
{
power_on();
uart3_turn_on ();
}
}
}
/********************************************************************/
// 调 压
/********************************************************************/
void adjust_voltage(int voltage)
{
if((Vout>(voltage+50))||(voltage>(Vout+50)))
// if((Vout>(voltage+10))||(voltage>(Vout+10)))
{
dacV=((long)(voltage-Vout_min)*(dacV_max-dacV_min))/(Vout_max-Vout_min)+dacV_min;
}
else
{
adjust_count++;
if(adjust_count>12)//延时
{
adjust_count=0;
if(Vout>voltage)dacV--;
else if(Vout<voltage)dacV++;
}
}
}
/********************************************************************/
// 调 流
/********************************************************************/
void adjust_current(int current)
{
if((Iout-current)>15||(current-Iout)>15)
{
dacA=((long)(current/3-Iout_min)*(dacA_max-dacA_min))/(Iout_max-Iout_min)+dacA_min;
}
else
{
adjust_count++;
if(adjust_count>10)//延时
{
adjust_count=0;
if(Iout>current)dacA--;
else if(Iout<current)dacA++;
}
}
}
/********************************************************************/
// 调压/调流 主处理函数
/********************************************************************/
void adjust_handle(void)
{
static unsigned char lmtV_count=0,lmtA_count=0;
static unsigned int shift_count=0;
if((mode!=4)&&(screen_flag!=6))
{
switch(mode)
{
case 0://**************恒流限压
if(!lmtV_flag)
{
adjust_current(Ichg);
}
//----------------------------------
if(Vout>(Vlmt+10))
{
if(lmtV_count<6)lmtV_count++;
}
else if(Vout<(Vlmt-20))
{
if(lmtV_count)lmtV_count--;
}
//-----------------------------------
if(lmtV_count>2)
{
lmtV_flag=1;
adjust_voltage(Vlmt);
}
else
{
lmtV_flag=0;
dacV=dacV_max;
}
//----------------------------------
if(Vout>=Vstp)shift_count++;
else if(shift_count)shift_count--;
if(shift_count>1000)
{
shift_count=0;
shift_flag=1;
}
//----------------------------------
break;
case 1://**********恒压限流
if(!lmtA_flag)
{
adjust_voltage(Vchg);
}
//---------------------------------
if(Iout>(Ilmt+10))
{
if(lmtA_count<6)lmtA_count++;
}
else if(Iout<(Ilmt-20))
{
if(lmtA_count)lmtA_count--;
}
//--------------------------------
if(lmtA_count>2)
{
lmtA_flag=1;
adjust_current(Ilmt);
}
else
{
lmtA_flag=0;
dacA=dacA_max;
}
//--------------------------------
if(Iout<=Istp)shift_count++;
else if(shift_count)shift_count--;
if(shift_count>1000)
{
shift_count=0;
shift_flag=1;
}
//--------------------------------
break;
case 2://*******恒流定时
if(charge_time)adjust_current(Ids);
else shift_flag=1;
break;
case 3://********恒压定时
if(charge_time)adjust_voltage(Vds);
else shift_flag=1;
break;
default:
break;
}
//------------------------------------------------
if(dacA<dacA_min)dacA=dacA_min; //DA输出保护
else if(dacA>dacA_max)dacA=dacA_max;
if(dacV<dacV_min)dacV=dacV_min;
else if(dacV>dacV_max)dacV=dacV_max;
//------------------------------------------------
}
else if(screen_flag==6) //调整DA最大最小值时执行此分支
{
if(page_flag==5)
{
if(cursor_flag)dacV=dis_temp[1];
else dacV=dis_temp[0];
dacA=dacA_max;
}
if(page_flag==6)
{
if(cursor_flag)dacA=dis_temp[1];
else dacA=dis_temp[0];
dacV=dacV_max;
}
}
update_dac();
}
/*void update_dac(void)
{
unsigned char i;
static int dacV_temp,dacA_temp;
if(dacA^dacA_temp)
{
dacA_temp=dacA;
write_dac(0xD002);
for(i=0;i<200;i++);
write_dac(dacA|0xC000);
}
if(dacV^dacV_temp)
{
dacV_temp=dacV;
write_dac(0xD002);
for(i=0;i<200;i++);
write_dac(dacV|0x5000);
}
}*/
void update_dac(void)
{
unsigned char i;
write_dac(0xD002);
for(i=0;i<200;i++);
write_dac(dacA|0xC000);
for(i=0;i<200;i++);
write_dac(dacV|0x5000);
}
void write_dac(unsigned int x)
{
unsigned char i;
CLI();
PORTB|=(1<<csda);
PORTB&=~(1<<csda);
for(i=0;i<20;i++);
PORTB |=(1<<clkda);
for(i=0;i<16;i++)
{
if((x&0x8000)==0)
PORTB &=~(1<<dinda);
else
PORTB |=(1<<dinda);
PORTB &=~(1<<clkda);
PORTB |=(1<<clkda);
x<<=1;
}
PORTB|=(1<<csda);
SEI();
}
void alarm_handle(void)
{
static unsigned char alarm_count=0;
static unsigned int alarm_temp=0;
alarm=0;
if(ad_result[2]>alarm_val[0])alarm|=0x0001;//交流过压
if(ad_result[2]<alarm_val[1])alarm|=0x0002;//交流欠压
if(ad_result[0]>alarm_val[2])alarm|=0x0004;//输出过压
if(ad_result[1]>alarm_val[3])alarm|=0x0008;//输出过流
if(alarm^alarm_temp)alarm_count++;
else alarm_count=0;
if(alarm_count>200)
{
alarm_temp=alarm;
if(alarm)
{
sound_alarm=1;
if((screen_flag==0)||(screen_flag==4))
{
screen_flag=4;
page_flag=0;
change_flag=1;
lcd_clear();
}
}
}
}
void sound_handle(void)
{
if((sound_alarm)&&(!sound_alarm_count))
{
sound_alarm_count=1;
portbuf^=0x01;
write_9554(0x40,1,portbuf);
}
else if((!sound_alarm)&&(!sound_beep))sound_off();
if((key&0x0F)==6)sound_alarm=0;
if(!alarm)sound_alarm=0;
if(sound_beep)
{
if(!sound_beep_count){sound_off();sound_beep=0;}
}
}
void write_9554(unsigned char sla_w,unsigned char command,unsigned char DATA)
{
//time_ns=2;
while(1)
{
WDR();
//if(time_ns==0)
// break;
TWCR|=0XA4;//START
while((TWCR & 0X80)==0x00)//WAIT START OUT
;
if (((TWSR & 0xF8) != 0X08)&&((TWSR & 0xF8) != 0X10))//CHECK STATE
continue;
TWDR = sla_w; //if uic 40H else 42H
TWCR |= 0X84;//SEND SLA_W ADDRESS
while ((TWCR & 0X80)==0x00)
;
if ((TWSR & 0xF8) !=0X18)
continue;
TWDR = command;/*if write out reg then command=1
else if write config reg then command=3
else if read reg then command=0 */
TWCR = 0X84;//SEND DATA
while ((TWCR & 0X80)==0x00)
;
if ((TWSR & 0xF8) !=0X28)
continue;
/*if(command==0)
{
TWCR|=0XA4;//START
while((TWCR & 0X80)==0x00)//WAIT START OUT
{
if(time_ns==0) break;
}
if ((TWSR & 0xF8) != 0X10)//CHECK STATE
continue;
TWDR = sla_r; //if uic 41H else 43H
TWCR |= 0X84;//SEND SLA_W ADDRESS
while ((TWCR & 0X80)==0x00)
;
if ((TWSR & 0xF8) !=0X40)
continue;
TWCR = 0X84;
while ((TWCR & 0X80)==0x00)
;
if ((TWSR & 0xF8) !=0X58)
continue;
DATA=TWDR;
TWCR |= 0X94;
while((TWCR&0x10)==0X10);
}*/
//else
//{
TWDR = DATA;
TWCR = 0X84;//SEND DATA
while ((TWCR & 0X80)==0x00)
;
if ((TWSR & 0xF8) !=0X28)
continue;
TWCR |= 0X94;
while((TWCR&0x10)==0X10);
//}
break;
}
}
//-----------------
void read_Qout (void)
{
EEPROM_READ(60,Qtemp[0]);
EEPROM_READ(61,Qtemp[1]);
EEPROM_READ(62,Qtemp[2]);
EEPROM_READ(63,Qtemp[3]);
Qout_H=(unsigned int)(Qtemp[3]<<8)|Qtemp[2];
Qout_L=(unsigned int)(Qtemp[1]<<8)|Qtemp[0];
}
void save_Qout (void)
{
Qtemp[0]=(unsigned char)(Qout_L&0x00FF);
Qtemp[1]=(unsigned char)((Qout_L>>8)&0x00FF);
Qtemp[2]=(unsigned char)((Qout_H)&0x00FF);
Qtemp[3]=(unsigned char)((Qout_H>>8)&0x00FF);
EEPROM_WRITE(60,Qtemp[0]);
EEPROM_WRITE(61,Qtemp[1]);
EEPROM_WRITE(62,Qtemp[2]);
EEPROM_WRITE(63,Qtemp[3]);
}
void power_add_init (void)
{
Qout_temp_flg=0;
Qout_temp=0;
read_Qout();
}
void power_out_add (void)
{
unsigned long temp;
Qout_temp=Qout_temp+(Vout*Iout);
if(Qout_temp>7200)
{
Qout_temp_flg++;
Qout_temp=0;
//Qin_temp++;
//save_Qout();
};
if(Qout_temp_flg>100)
{
Qout_temp_flg=0;
if(Qout_L!=0xFFFF)
{
Qout_L++;
}
else
{
Qout_H++;
Qout_L=0;
}
save_Qout();
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -