Hej hej,

Ben momenteel een leerling van het 6de middelbaar en volg elektronica.
We hebben in het begin van het jaar een gip mogen kiezen en aan mij werd de balanstafel voorgesteld.

Na een jaar er aan te hebben gewerkt is dit momenteel het resultaat.
http://youtu.be/k5MxTGcRS0A

Er word wel nog aan gewerkt want dit is niet het eindresultaat.
Hebben jullie nog voorstellen voor verbeteringen of enkele toevoegingen?

Gegroet.

Hebben jullie nog voorstellen voor verbeteringen of enkele toevoegingen?

Hebben jullie die zelf ook? Je hebt vast meer info dan alleen een Youtroep filmpje.

Ja hoor,
Momenteel werken we nog met de x-as.
We zijn dus zeker vn plan om dit nog te laten werken met zowel de x-as al de y-as.

Ik heb momenteel softwarematig in C en PD-regelaar gemaakt. ik ben ook nog vn plan om er een I actie bij te voegen om de resterende fout weg te werken.

In het filmpje zie je ook op ong 14sec dat de servomotor even terug naar beneden gaat. dit is omdat mijn fout die in de formule gaat te groot wordt bij de D-regelaar. Ik weet zelf niet goed hoe ik hier een beperking moet opzetten omdat deze dan misschien niet zo krachtig meer reageert.


#include <htc.h> 
#include "HITECH_LCD.H"
#define _XTAL_FREQ 19660800
__CONFIG(0xEFE2); 
__CONFIG(0xFEFF);

unsigned char TELLER_TMR2 = 0;			
unsigned char MODE = 0;
unsigned char SERVO[2] = {50,100};
unsigned char Xas=0; 					
unsigned char MidX=96;					
unsigned char fout=0;					
unsigned char fout1=0;					
unsigned char fout2=0;					
unsigned char fout3=0;					
unsigned char d_term = 0;	
unsigned char p_term = 0;				
					
unsigned char x = 0; 
float Kp =1;      
float Kd =15;				
Settings_poorten()
{
	TRISC=0x00; 				 
	TRISD=0x00; 				
	TRISB=0x00; 				
	TRISE=0xFF;
	TRISA=0xFF;


PORTB = 0x00;


/*touchscreen*/
	ADCON0=0b11000101; 			
	ADCON1=0b00000000;			

/* P potmeter */
//	ADCON0=0b11000001; 				
//	ADCON1=0b00000000;				


	ANSEL = 0x20;
	ANSELH = 0x00;
	LCD_Start();
}
xas() 						
{ 
	RB0=0; 					 
	RB1=0; 					
	RB2=1; 					
	RB3=1; 					
}
sample_nemen()
{
	__delay_us(20);
	GO_nDONE=0x01; 			
	while(GO_nDONE) continue; 	
}
touchscreen()
{
	xas(); 								
	sample_nemen();					
	Xas =ADRESH;
}
LCD()
{
 LCD_Cursor(0,0);
 LCD_PrintNumber(SERVO[0]);		
 LCD_Cursor(0,1);
 LCD_PrintNumber(Xas);					
__delay_ms(10);
}
void main()
{
Settings_poorten();

INTCON = INTCON | 0b11000000; 
PIE1 = 0b00000010;


T2CON = 0b00000100;	
PR2 = 197;	
TELLER_TMR2 = 0;	


	while(1)
	{
	LCD();
		if(Xas == MidX)
		{
		PORTC=0x00;
		SERVO[0] = 50;
		}
		
		if (Xas > MidX)
		{
		PORTC=0x80;
		fout = Xas - MidX;

		d_term = fout - fout3;
		d_term = d_term * Kd;

		p_term = 50 + (fout * Kp);
		SERVO[0]  = p_term + d_term;
		}
		
		if (Xas < MidX)
		{
		PORTC=0x01;
		fout = MidX - Xas;
			
			if (fout > 50) fout = 50;  
		d_term = fout - fout3;
		d_term = d_term * Kd;
	
		p_term = 50 - (fout * Kp);
		SERVO[0]  = p_term - d_term;
		}

		if(SERVO[0] < 3)
		{
		SERVO[0] = 3;
		PORTC = 0x0f;
		}
			
		if(SERVO[0] > 100)
		{
		SERVO[0] = 100;
		PORTC = 0xf0;
		}

	}
}

void interrupt isr(void)
{
PIR1 = PIR1 & 0b11111101;	

PORTD = PORTD | 0b00001000; 

if(MODE==0)
	{
		if(TELLER_TMR2<8) {}
		else
		{
			MODE = 1;
			TELLER_TMR2 = 0;
			T2CON = 0b00000101;	
			PR2 = 10; 
		}
	TELLER_TMR2++;
	}

else if(MODE==1)
{
TELLER_TMR2++;
	if(TELLER_TMR2==SERVO[0]) {PORTB = PORTB & ~0b00010000;}
	if(TELLER_TMR2==SERVO[1]) {PORTB = PORTB & ~0b00100010;}

	if(TELLER_TMR2==123) 
	{
		MODE = 2;	
		TELLER_TMR2 = 0;	
		
		
		T2CON = 0b00010110;	
		PR2 = 183;	
	}
}
else if(MODE==2)
		{
		touchscreen();
		fout1=fout;
		fout2=fout1;
		fout3=fout2;

		TELLER_TMR2++;
		if(TELLER_TMR2<10) {}	

			else
			{
			MODE = 0;	
			TELLER_TMR2 = 0;	
			PORTB = PORTB | 0b00110000;	
			
			T2CON = 0b01111101;	
			PR2 = 7;	
			}
		}
PORTD = PORTD & ~0b00001000;	
}

gebruikte code voor de balanstafel

Lees eerst dit eens goed door!

En begin daarna eens met het documenteren van je code...

[Bericht gewijzigd door Henry S. op (27%)]