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

📄 main.c

📁 车载NI_MH快速充电器
💻 C
字号:
/********************************************************************************/
//		
// 		builder : 2007-04-10
// 		Target  : ATMEAG 48V
// 		Crystal : 内部 8.00 MHz
//
//		快速充电器
		
/********************************************************************************/

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>


#define		uchar		unsigned char
#define		uint		unsigned int

#define		SET_LED1	PORTB |=  (1<<PB6)
#define		SET_LED2	PORTB |=  (1<<PB7)
#define		SET_LED3	PORTD |=  (1<<PD2)
#define		SET_LED4	PORTD |=  (1<<PD3)
#define		SET_LED5	PORTD |=  (1<<PD4)

#define		CLR_LED1	PORTB &= ~(1<<PB6)
#define		CLR_LED2	PORTB &= ~(1<<PB7)
#define		CLR_LED3	PORTD &= ~(1<<PD2)
#define		CLR_LED4	PORTD &= ~(1<<PD3)
#define		CLR_LED5	PORTD &= ~(1<<PD4)

#define		CLR_PWM		PORTD &= ~(1<<PD5)

uchar	pwm_data;
uint	IREF;
uint	VREF;
uchar	stop;
uchar	stop_num;

uchar	time;
uchar	time_5ms;
uchar	time_1s;
uchar	time_min;
uint	charge;

uchar	mode;
uchar	power;
uchar	buz_t,buz;

uchar 	key1,key2;


/*---------------------------------------------------------------
   			初始化
----------------------------------------------------------------*/

void timer1_init(void)
{
 	TCCR1B = 0x00; 	//stop
 	TCNT1H = 0x63; 	//setup
 	TCNT1L = 0xC0;
 	TCCR1A = 0x00;
 	TCCR1B = 0x01; 	//start Timer
}

void timer2_init(void)	// PWM
{
 	TCCR2B = 0x00; //stop
 	ASSR   = 0x00; //set async mode
 	TCNT2  = 0x01; //setup
 	OCR2A  = 0x7F;
 	OCR2B  = 0x00;
 	TCCR2A = 0xC3; 
}


void init_devices(void)
{
	
	asm("cli");
	
	DDRB  = 0xFF;
 	PORTB = 0x30;
 	
 	DDRC  = 0x00;
 	PORTC = 0x00; 
 	
 	DDRD  = 0x3F;
 	PORTD = 0xC0; 
 	
 	adc_int();
 	timer0_init();
 	timer1_init();
 	timer2_init();
 	
 	MCUCR = 0x00;
 	EICRA = 0x00; //extended ext ints
 	EIMSK = 0x00;
 
 	TIMSK0 = 0x00; //timer 0 interrupt sources
 	TIMSK1 = 0x01; //timer 1 interrupt sources
 	TIMSK2 = 0x00; //timer 2 interrupt sources
 	
 	asm("sei");
}



void delay(uint t)
{
	uint i,j,k;
	
	for(i=0;i<t;i++)
	{
		for(j=0;j<2000;j++)
		{
			for(k=0;k<500;k++);;
		}
	}
}
/*---------------------------------------------------------------
   			BUZ 控制
----------------------------------------------------------------*/

void buz_set(uchar i)
{
	TCCR2B = 0x02; //start
	buz_t  = 0;
	buz    = i;
}

/*---------------------------------------------------------------
   			恒流控制
----------------------------------------------------------------*/

void I_auto_set(void)
{
	uint I_data;
	
	if(power) 
	{	
		SET_LED1;
		
		I_data = adc_colect(2);	// 读电流值
	
		if(I_data<IREF) 
		{
			if(pwm_data<254) pwm_data ++;
		}
		else if(I_data>(IREF+5)) 
		{	
			if(pwm_data>2) pwm_data --;
		}
	
		Pwm_set(pwm_data);	// 设置占空比
	}
	else 
	{	
		TCCR0B = 0x00; 		//start timer
		TCCR0A = 0x00; 
		CLR_PWM;
		CLR_LED1;
	}
}

/*---------------------------------------------------------------
   			电压检测
----------------------------------------------------------------*/

void V_auto_set(void)
{
	uint temp;
		
	temp = adc_colect(2);	// 读电流值
	
	if(temp>10)
	{
		TCCR0A = 0x00;	//0x23; 
 		TCCR0B = 0x00; 	//start timer
		delay(120);
		
		temp = adc_colect(4);	// 读电流值
		temp = adc_colect(4);	// 读电流值
		
		if(VREF>=temp) stop ++;
		else stop = 0;
		
		if(stop>stop_num)		// 3分钟电压无变化电已充满
		{
			stop  = 0;
			power = 0;
			CLR_LED1;
			SET_LED2;
			for(temp=0;temp<3;temp++)
			{
				buz_set(200);
				delay(180);
			}
		}
		VREF = temp;	
	}
	else power = 0;		// 没接电池关机
}


/*---------------------------------------------------------------
   			T1 5ms 中断
----------------------------------------------------------------*/

SIGNAL(SIG_OVERFLOW1) 
{
	TCNT1H = 0x63; 		//reload counter high value
 	TCNT1L = 0xC0; 		//reload counter low value
 	
 	time_5ms = 1;
 	buz_t ++;
 	if(buz_t>buz) TCCR2B = 0x00; 
}

/*---------------------------------------------------------------
   			按键扫描 
----------------------------------------------------------------*/

void key_set(void)
{
	uchar temp;
	
	temp = PIND & 0xC0;
	
	if(temp==0x80) key1 ++;
	else key1 = 0;

	if(temp==0x40) key2 ++;
	else key2 = 0;

}

/*---------------------------------------------------------------
   			按键处理
----------------------------------------------------------------*/

void key(void)
{
	uchar i;
	
	i = PIND & 0xC0;
	
	if(key1>3 && (i==0xc0)) 
	{
		key1 = 0;
		buz_set(40);
		power = !power;
		charge = 0;
		stop   = 0;
		CLR_LED2;
		pwm_data = 0;
		time_min = 0;
	}
	else if(key2>3 && (i==0xc0))
	{
		key2 = 0; 
		buz_set(20);
		mode ++;
		if(mode>=3) mode = 0;
	}
	
	if(mode==0) 
	{
		IREF 	 = 98;//93;
		stop_num = 6;
		PORTD 	&= 0xE0; 
		SET_LED3;
	}
	else if(mode==1) 
	{
		IREF 	 = 190;
		stop_num = 5;
		PORTD 	&= 0xE0; 
		SET_LED4;
	}
	else if(mode==2) 
	{
		IREF 	 = 350;
		stop_num = 4;
		PORTD 	&= 0xE0; 
		SET_LED5;
	}
}


/*---------------------------------------------------------------
   			main
----------------------------------------------------------------*/

void main(void)
{
	uchar i;
	
	delay(50);
	
	init_devices();
	
	buz_set(400);
	
	while(1)
	{	
		key();
		if(time_5ms)
		{
			time_5ms = 0;
			key_set();
			I_auto_set();
			
			time_1s ++;
			if(time_1s>=200) 
			{	
				time_1s = 0;
				time_min ++;
				charge ++;
			}

			if(time_min >60)
			{
				time_min = 0;
				V_auto_set();
			}
			
			if(charge>3600)
			{
				power  = 0;
				SET_LED2;
				charge = 0;
			}
		}
	}
}

/*--------------------   the end ------------------------------------*/

⌨️ 快捷键说明

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