⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.c

📁 充电车的控制板程序
💻 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 + -