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

📄 test._c

📁 a good program for battery charge,only for reference
💻 _C
📖 第 1 页 / 共 3 页
字号:
   
   tem[0]=0x90;	 		
   tem[1]=0x00;			  
   tem[2]=DA_SET/4;		
   tem[3]=DA_SET%4;		  
   tem[3]=tem[3]<<6;	

   Start_I2c();             
     for(i=0;i<4;i++)
    {   
     SendByte(tem[i]);            
	   if((temp&(1<<ack))==0)return(0);  
     } 
  Stop_I2c();               
  return(1);   
}
/********************************************************************/
TC1321_SET_1(unsigned int DA_SET)
{
   unsigned char i;
   unsigned char tem[4];
   tem[0]=0x90;	 		
   tem[1]=0x00;			 
   tem[2]=DA_SET/4;		
   tem[3]=DA_SET%4;		
   tem[3]=tem[3]<<6;	

   Start_I2c();             
     for(i=0;i<4;i++)
    {   
     SendByte(tem[i]);            
	   if((temp&(1<<ack))==0)return(0);  
     } 
  Stop_I2c();               
  return(1);   
}
/********************************************************************/
void Delay(unsigned int ddd)   				//Delay50Ms() i=0xF8F;
{
 //ddd=100;
 while(--ddd){;}
}
/********************************************************************/
void temp_det(void)
{
	adc_mux=0X02;
	Delay(0xff);   			  				//A/D采样延时
	ad_reulst();
	if(adc_old <=139 )	  	  			   	//当前温度为80-90
		{temp_step=80;
		temp_start=139;
		temp_dange=3;
		}
	if(adc_old > 139 && adc_old <=178 )	  	//当前温度为70-80
		{temp_step=70;
		temp_start=178;
		temp_dange=4;
		}				
	if(adc_old > 178 && adc_old <=230 )	  	//当前温度为60-70
		{temp_step=60;
		temp_start=230;
		temp_dange=5;
		}
	if(adc_old > 230 && adc_old <=293 )	  	//当前温度为50-60
		{temp_step=50;
		temp_start=293;
		temp_dange=6;	
		}		
	if(adc_old > 293 && adc_old <=371 )	  	//当前温度为40-50
		{temp_step=40;
		temp_start=371;
		temp_dange=8;	
		}					
	if(adc_old > 371 && adc_old <=462 )	  	//当前温度为30-40
		{temp_step=30;
		temp_start=462;
		temp_dange=9;
		}				
	if(adc_old > 462 && adc_old <=562 )	  	//当前温度为20-30
		{temp_step=20;
		temp_start=562;
		temp_dange=10;	
		}			
	if(adc_old > 562 && adc_old <=663 )	  	//当前温度为10-20
		{temp_step=10;
		temp_start=663;
		temp_dange=10;	
		}			
	if(adc_old > 663 && adc_old <=758 )	  	//当前温度为0-10
		{temp_step=0;
		temp_start=758;
		temp_dange=9;
		}					
	if(adc_old > 758 && adc_old <=839 )	  	//当前温度为-10~0
		{temp_step=-10;
		temp_start=839;
		temp_dange=8;
		}			
		now_temp=(temp_step+(temp_start-adc_old)/temp_dange);
	if(adc_old > 839 )	  									 
		{
		now_temp=-11;
		}				
}
/**********************A/D循环采样60次取平均值********************/
void ad_reulst(void)												  
	{	
		abc=61;
		adc_old=0;
	 	while(--abc)
	 		 {Delay(0xff);
			  adc_old=(adc_old+adc_rel);
	 		 }
		adc_old=adc_old/60;	 
	} 
/********************************************************************/
void alarm(void)
{
 	 	adc_mux=0X01;
		Delay(0xff);   						//A/D采样延时
		ad_reulst();	
	while(adc_old > 440)				//检测当前电压是不是大于16.5V
		{
		 temp |= (1<<LED_yes);
		 PORTD &= ~(1<<Green);			//绿色指示灯灭
		 PORTB &= ~(1<<P0);				//关断P0   0.16A恒流充电
		 PORTD |= (1<<P1); 				//打开P1   0.16A恒流充电
		 PORTB &= ~(1<<P2);				//关断P2   0.16A恒流充电
		 PORTB &= ~(1<<P3);				//关断P3   0.16A恒流充电			
		 TC1321_SET_1(999);	 			// D/A送电压10V
		
		 adc_mux=0X01;
		 Delay(0xff);   				//A/D采样延时
		 ad_reulst();
		 adc_old=adc_rel;	
		}		  
		temp &= ~(1<<LED_yes);

		
		adc_mux=0X02;
		Delay(0x4ff);   			  		//A/D采样延时
		ad_reulst();
	while(adc_old < 0x7A)	  	  		//检测温度有没有大于85摄氏度  0.42V
		{
		 PORTD &= ~(1<<Green);			//绿色指示灯灭
		 PORTD |= (1<<Red);
		 
		 PORTB &= ~(1<<P0);				//关断P0   0.16A恒流充电
		 PORTD |= (1<<P1); 				//打开P1   0.16A恒流充电
		 PORTB &= ~(1<<P2);				//关断P2   0.16A恒流充电
		 PORTB &= ~(1<<P3);				//关断P3   0.16A恒流充电			
		 TC1321_SET_1(999);	 	  		// D/A送电压10.0V 
		 adc_mux=0X02;
		 Delay(0x4ff);   			  	//A/D采样延时
		 ad_reulst();
		 adc_old=adc_rel;
		}	

		
	if((temp&(1<<anther))==0x20)		//0电流检测使能位
	{
 	 adc_mux=0X07;
	 Delay(0xff);   				  					 //A/D采样延时
	 ad_reulst();
	if(adc_old < 27){Second_count_3=00;}             //27
	while(adc_old < 27)		  						 //检测当前电流是不是为0
		{temp |= (1<<LED_yes);
		PORTD &= ~(1<<Green);						 //绿色指示灯灭
		PORTB &= ~(1<<P0);							 //关断P0   0.16A恒流充电
		PORTD |= (1<<P1); 							 //打开P1   0.16A恒流充电
		PORTB &= ~(1<<P2);							 //关断P2   0.16A恒流充电
		PORTB &= ~(1<<P3);							 //关断P3   0.16A恒流充电
		TC1321_SET_1(999);							 // D/A送电压10.0V
		 		if(Second_count_3>5)
		 		{
		    	 Second_count_3=00;
		  		 TC1321_SET_1(735);	 	   				 // D/A送电压15.8V 
		  		 Delay(0xff);
		 
		  		 adc_mux=0X07;
		  		 Delay(0xff);   				  			 //A/D采样延时
		  		 ad_reulst();
		  		 adc_old=adc_rel;

		 				if(adc_old > 6)
		 	    		{
		          	 	 TC1321_SET_1(735);	 	   		 // D/A送电压15.8V 
		          	 	 Delay(0xff);
		        	 	}
		  		}
		  
		adc_mux=0X07;
		Delay(0xff);   				  				 //A/D采样延时
		ad_reulst();
		adc_old=adc_rel;
		}
	}
		temp &= ~(1<<LED_yes);
}
/******************************************************************/
//MAIN程序
void main(void)
{
 unsigned char i; 
 ADMUX=00;     	  			   //防止两个基准原短路 
 PORTB = 0x00; 	  			   // I/O口初始化
 DDRB  = 0xFF; 	  			   // I/O口初始化  老版本是FB
 PORTC = 0x00; 	  			   // I/O口初始化  
 DDRC = 0x70;  	  			   // I/O口初始化   老版本是F0
 PORTD = 0x00; 	 			   // I/O口初始化
 DDRD  = 0x2C; 	  			   // I/O口初始化  老版本是FF
 Second_count_3=0;
 TC1321_SET_1(780);	 		   // 14.78,不补偿
 if(Second_count_3<6){;} 
 cycle=0x00;   				   //第五次到第一次之间循环次数清零
 temp &= ~(1<<plus_charge);    //上电后不允许进行脉冲充电
 temp &= ~(1<<LED_yes);		   //开始不允许红灯闪烁
 	  
 temp &= ~(1<<anther);		   //测试用
 //temp |= (1<<anther);
 //temp |= (1<<LED_yes); 	   //允许红灯闪烁
 temp |= (1<<Charge_Sel);	   //选择warmup_charger方式
 SEI();						   //使能全局中断
 timer1_init(); 			   //timer 1 interrupt sources
 TIMSK1 = 0x01; 			   //timer 1 interrupt sources
 TCNT1H = 0xFE; 			   //reload counter high value
 TCNT1L = 0xAA; 			   //reload counter low value
 PORTD &= ~(1<<Red);		   //关闭红色指示灯
 PORTD &= ~(1<<Green);		   //关闭绿色指示灯
 adc_init();
 adc_old=0;
 adc_rel=0;  
	  
		PORTB &= ~(1<<P0);	   //关断P0   0.8A恒流充电
		PORTD &= ~(1<<P1);	   //关断P1   0.8A恒流充电
		PORTB &= ~(1<<P2);	   //关断P2   0.8A恒流充电
		PORTB |= (1<<P3);      //打开P3   0.8A恒流充电

 temp |= (1<<anther);
 alarm();  					   //检测过流、低压、过温 
 //------------------ 开始进入主流层 --------------------/ 	
  //------------------在2A负载情况下,-------------------/
 // 电池电压15.55V  ADC1=421  充电器输出15.8V 电池电压15.55V
 // 电池电压14.4V   ADC1=390   
 // 电池电压13.8V   ADC1=374
 // 电池电压13.2V   ADC1=358
 // 电池电压13.0V   ADC1=353  
 // 电池电压12.6V   ADC1=342  
 // 电池电压12.0V   ADC1=326
 // 电池电压11.5V   ADC1=313
 // 电池电压10V     ADC1=273
 // 2A     ADC7=229
 //-----------------在0.16A负载情况下,------------------//
 // 电池电压15.55V  ADC1=411
 // 电池电压14.4V   ADC1=380  
 // 电池电压13.8V   ADC1=364
 // 电池电压13.2V   ADC1=348
 // 电池电压13.0V   ADC1=343
 // 电池电压12.6V   ADC1=332
 // 电池电压12.0V   ADC1=316
 // 电池电压11.5V   ADC1=303
 // 电池电压10.0V   ADC1=263
 // 0.16A     ADC7=31
//------------------------------------------------------/
// 电流2A情况下,充电输出电压      15.8 V  ;TC132=2.820 V 000  00000000
// 电流2A情况下,充电输出电压      14.4 V  ;TC132=2.978 V 878  00000000		
// 电流2A情况下,充电输出电压      13.8 V  ;TC132=3.015 V 892  00000000
// 电流2A情况下,充电输出电压      13.2 V  ;TC132=3.047 V 903  00000000 
// 电流2A情况下,充电输出电压      13.0 V  ;TC132=3.056 V 893
// 电流2A情况下,充电输出电压      12.6 V  ;TC132=3.075 V 899
// 电流0.16A情况下,充电输出电压   12.6 V  ;TC132=3.100 V 906
// 电流0.16A情况下,充电输出电压   12.0 V  ;TC132=3.127 V 921  00000000
// 电流0.16A情况下,充电输出电压   11.5 V  ;TC132=3.148 V 930  00000000
// 电流0.16A情况下,充电输出电压   10.0 V  ;TC132=3.211 V 950  00000000
//------------------------------------------------------/
 while(1)					 
 {  		 
	goto	 step_3;	 	        //开始应该  goto	 step_3进入恒流充电	
/***** 第一步 去硫化、脉冲、14.4V&13.8V 0.8A 1Hz 脉冲充电 红色指示灯*****/ 
step_1:
goto	 step_3;
/****************** 第二步 软启动、14.4V/0.8A 红色指示灯***********************/
step_2:		
goto	 step_3;
/********************* 第三步 恒流4A、红色灯**************************/ 
step_3: 
    Second_count_1=00; 		  		//延时24小时,等于86400秒
 	Second_count_2=00; 				//Second_count_1*Second_count_2=60*1660
	while(1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -