示例#1
1
/*******************

Eens hij aan het algoritme begonnen is, gaat hij het blijven volhouden tot hij klaar is met laden tenzij de state aangepast wordt. 

*******************/
int charge_NiMH(int socLoad){
	int V_bat;
	int sleepTime,sleepTime_fin;
	
	init_V_max();
	setCurrentCharger(C);
	// Slaaptijd tussen opeenvolgende metingen, in milliseconden
	sleepTime = 100;
	sleepTime_fin =5000;

	while (getLoadFactor()>0) {
		setLEDS(getLoadFactor());
		if (isAtChargeLimit(socLoad)) return 2;
		V_bat=getVoltage();
	
		if(V_max<V_bat){
			V_max=V_bat;
		}
	
		if(V_bat<V_max*0.9975){
			//hoe kan je controleren of dit 5 sec lang zo blijft (andere tijdsduur is ook goed, maar men stelt 5 sec voor)
			usleep(sleepTime_fin*1000);
			if(V_bat<V_max*0.9975){
				return 1;
			}
		}

		usleep(sleepTime*1000);
	}
	return 0;
}
示例#2
0
/*********************

Hier gaan we de batterij ontladen.

**********************/
void dischargeAlgorthm(){
	while(getLoadFactor() < 0 && getStateOfCharge() > (specs.volt_max_cell*specs.nr_of_cells)*MINMARGE){
		setLEDS(-1*getLoadFactor());

		// Stel de stroom in op 1 x C
		current = 1*specs.capacity;
		setCurrentCharger(-1*getLoadFactor());
		usleep(3000000);//we slapen drie seconden
	}
}
示例#3
0
void I2C_EE_Upload(void)
{
	int percentage;
	uint8_t byte;
	unsigned int LEDbackup;
	int i;
	
	LEDbackup=LEDbyte;
	clear();
	write('S');
	write('e');
	write('n');
	write('d');
	write('i');
	write('n');
	write('g');
	
	for (i=CONFIGLENGTH;i<EEPROM_BYTES;i++)
	{
		if((i%100)==0){
		setCursor(0,1);
		percentage = (100*i)/(EEPROM_BYTES-CONFIGLENGTH);
			writenumber(percentage);
//		write('0'+(i/(EEPROM_BYTES-CONFIGLENGTH)*100)/100);
//		write('0'+((i/(EEPROM_BYTES-CONFIGLENGTH)*100)/10)%10);
//		write('0'+(i/(EEPROM_BYTES-CONFIGLENGTH)*100)%10);
		write('%');
		write(' ');
		write(' ');}
		LEDbyte = LEDGripple[(i/80)%10];
		setLEDS();
		I2C_EE_BufferRead(&byte, i, 1);
		UART_send_byte(byte);
	}
		clear();

	delay_ms(2000);
	clear();
	standby();

	LEDbyte=LEDbackup;
	setLEDS();
}
示例#4
0
void I2C_EE_Erase(void)
{
	int percentage;
	unsigned int LEDbackup;
	int i;
	
	clear();
	write('E');
	write('R');
	write('A');
	write('S');
	write('I');
	write('N');
	write('G');
	
	for (i=CONFIGLENGTH;i<EEPROM_BYTES;i++)
	{
I2C_EE_BufferWrite(blank, i,  1);

//		I2C_EE_ByteWrite(blank, i);	
		
		if((i%100)==0){
		setCursor(0,1);
		percentage = (100*i)/(EEPROM_BYTES-CONFIGLENGTH);
		writenumber(percentage);
		write('%');
		write(' ');
		write(' ');}
		LEDbyte = LEDRripple[(i/80)%10];
		setLEDS();
	}
		clear();
	complete();
	delay_ms(2000);
	clear();
	standby();

	LEDbyte=LEDbackup;
	setLEDS();

}
示例#5
0
//Main function (execution starts here after startup file)
int main(void)
{
	int i;
	int e;
	uint16_t temperature;

	init_GPIO_pins();
	
	//Short delay during which we can communicate with MCU via debugger even if later user code causes error such as sleep state with no wakeup event that prevents debugger interface working
	//THIS MUST COME BEFORE ALL USER CODE TO ENSURE CHIPS CAN BE REPROGRAMMED EVEN IF THEY GET STUCK IN A SLEEP STATE LATER
	for (i = 0; i < 1000000; i++)
	{
		LED_on();
	}
	
	GPIO_Init_Mode(GPIOA,GPIO_Pin_0,GPIO_Mode_IN_FLOATING); //User button.
	GPIO_Init_Mode(GPIOC,GPIO_Pin_11,GPIO_Mode_IN_FLOATING); //Accelerometer interrupt.
	delay_init();
	LED_off();
	LCDINIT();
	home();
	clear();
	display(); //Surely some of these can be commented out.
	noCursor();
	noBlink();

	standby();

	UART_init();
	humidity_init();
	ADC_init();
	I2C_EEPROM();
	I2C_ACCEL_INIT();
	I2C_EE_LoadConfig();
	logging_timer_init();
	
//	I2C_EE_BufferWrite(Test_Buffer, EEPROM_WriteAddress1, 100);
//I2C_EE_BufferRead(buffer, 0, 100);

	/*while(1){
		if(LEDbyte==512){LEDbyte=1;}
		else {LEDbyte=LEDbyte<<1;}
		setLEDS();
		
	setCursor(0,1);
	temperature=getTemperature();
	writenumber( temperature/100);
	write('.');
	writenumber((temperature/10)%10);
		write(' ');

		write(0xDF);
	write('C');
	setCursor(0,0);
	writenumber(readhumidity(24)); //Needs real temperature
	write(' ');
	write('%');
	write('R');
	write('H');
		delay_ms(50);
		
		check_and_process_received_command();
		
	}*/
	//currentstate=UPLOADING;

	while(1)
	{
		switch (currentstate){
			
		case WAITING:
			if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)) //Polling is probably ok here, since the loop will be very very fast.
			{
				currentstate=LOGGING;
				clear();
				write('S');
				write('t');
				write('a');
				write('r');
				write('t');
				write('i');
				write('n');
				write('g');
				delay_ms(2000);
				clear();
				I2C_EE_StartLog();
				TIM4->CNT=0;
			}
			break;

		case LOGGING:
			if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){currentstate=WAITING;I2C_EE_FinishLog();break;} //Polling is probably ok here, since the loop will be very very fast.
			LEDbyte|= 1<<8;
			setLEDS();
			if (TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) != RESET)
			{
				TIM_ClearFlag(TIM3, TIM_IT_Update);
				temperature = getTemperature();
				LogBuffer[0]=(temperature>>8)&0xFF;
				LogBuffer[1]=temperature&0xFF;
				LogBuffer[2]=readhumidity(LogBuffer[0]);
				I2C_ACCEL_READ();
				I2C_EE_Log(LogBuffer);
				setCursor(0,1);
				writenumber(temperature/100);
				write('.');
				writenumber(temperature%100);
				write(' ');
				write(0xDF);
				write('C');
				write(' ');
				setCursor(0,0);
				writenumber(25); //Needs real temperature
				write(' ');
				write('%');
				write('R');
				write('H');
				write(' ');
				LEDbyte&= ~(1<<8);
				setLEDS();
			}
			break;
		
		case UPLOADING:
			currentstate=WAITING;
			I2C_EE_Upload();
			break;
		
		case ERASING:
			currentstate=WAITING;
			I2C_EE_Erase();
			break;
		
		case STREAMING:
			if (TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) != RESET)
			{
				TIM_ClearFlag(TIM3, TIM_IT_Update);
				temperature = getTemperature();
				LogBuffer[0]=(temperature>>8)&0xFF;
				LogBuffer[1]=temperature&0xFF;
				LogBuffer[2]=readhumidity(LogBuffer[0]);
				I2C_ACCEL_READ();
//				I2C_EE_Log(LogBuffer);
				for (e=0;i<ENTRYBYTES;i++)
				{
					UART_send_byte(LogBuffer[e]);
				}
				setCursor(0,1);
				writenumber(temperature/100);
				write('.');
				writenumber(temperature%100);
				write(' ');
				write(0xDF);
				write('C');
				write(' ');
				setCursor(0,0);
				writenumber(25); //Needs real temperature
				write(' ');
				write('%');
				write('R');
				write('H');
				write(' ');
				LEDbyte&= ~(1<<8);
				setLEDS();
			}
		break;
		}
示例#6
0
/*******************

Het oplaadalgoritme voor de lipo batterij zit hier geimplementeerd.

*******************/
int charge_LiPo(battery* spec, int socLoad){
	// Definitie van variabelen
	int k;
	int voltage;
	int current;
	int sleepTime;

	// Slaaptijd tussen opeenvolgende metingen, in milliseconden
	sleepTime = 100;

	// Initialisatie
	k = 1;


	// Eerste fase:
	// Legt een constante stroom aan zolang de spanning onder de V_treshold blijft.
	do {	
		setLEDS(getLoadFactor());
		// Stopconditie
		if (charging == 0||load<=0) return 0;
		if (isAtChargeLimit(socLoad)) return 2;

		// Meet huidige spanning
		voltage = getVoltage();

		// Stel de stroom in op 1 x C
		current = 1*spec->capacity;
		setCurrentCharger(current);

		// Wacht enkele milliseconden vooraleer volgende meting uit te voeren.
		usleep(sleepTime*1000);
	} while (voltage < (spec->volt_max_cell*spec->nr_of_cells)*MARGE);


	// Meet nu zowel stroom als spanning
	voltage = getVoltage();
	current = getCurrent();

	// Tweede fase:
	// Laat de stroom afnemen.
	// Wacht totdat de spanning terug V_threshold is en herhaal
	// Stroom neemt per iteratie 10% af
	while (current > (1-MARGE)*spec->capacity) {

		// Stopconditie
		if (charging == 0||getLoadFactor()<=0) return 0;
		if (isAtChargeLimit(socLoad)) return 2;

		// Als spanning ongeveer V_threshold is, verlaag de stroom
		if (voltage > (spec->volt_max_cell*spec->nr_of_cells)*MARGE) k++;

		// Stel stroom in
		current = spec->capacity*(1-(k/10));
		setCurrentCharger(current);

		// Meet de nieuwe spanning
		voltage = getVoltage();

		// Wacht enkele milliseconden tot volgende meting
		usleep(sleepTime*1000);
	}

	// Opladen voltooid
	return 1; 
}