problem med tidsintervall
Postat: 8 september 2009, 20:40:46
Hej!
Som en nybörjare så har jag fått ett problem men ett program som jag har skrivit. Jag har "försökt" att skriva ett program som ska läsa av ett varvtal med exakt lika långt tidsintervall mellan avläsningarna. Jag får så otroligt oregelbunden avläsning.
Meningen med detta är att jag ska använda det till en bromsbänk. Jag ska då använda skillnaderna mellan 2st mätvärden för att beräkna ut effekten. Problemet är nu att vissa avläsningar blir med täta avläsningar o sen kommer några som det är längre tid emellan. Resultatet blir att grafen jag sedan gör blir väldigt zick zack.
Processorn jag använder är en 16f628 och den kör jag på 20Mhz. Jag använder mig av PICkit 2 och UART Tool som finns i det programmet. Där loggar jag dom mätvärdena som jag får och sedan importerar jag det till ett excel dokument som jag sedan gör en graf på. Jag har provat att öka överföringshastigheten men det gör ingen skillnad. Kör nu på 9600 baud.
Är det någon som har ett förslag på vad jag har gjort för fel? Finns säkert många!
Som en nybörjare så har jag fått ett problem men ett program som jag har skrivit. Jag har "försökt" att skriva ett program som ska läsa av ett varvtal med exakt lika långt tidsintervall mellan avläsningarna. Jag får så otroligt oregelbunden avläsning.
Meningen med detta är att jag ska använda det till en bromsbänk. Jag ska då använda skillnaderna mellan 2st mätvärden för att beräkna ut effekten. Problemet är nu att vissa avläsningar blir med täta avläsningar o sen kommer några som det är längre tid emellan. Resultatet blir att grafen jag sedan gör blir väldigt zick zack.
Processorn jag använder är en 16f628 och den kör jag på 20Mhz. Jag använder mig av PICkit 2 och UART Tool som finns i det programmet. Där loggar jag dom mätvärdena som jag får och sedan importerar jag det till ett excel dokument som jag sedan gör en graf på. Jag har provat att öka överföringshastigheten men det gör ingen skillnad. Kör nu på 9600 baud.
Är det någon som har ett förslag på vad jag har gjort för fel? Finns säkert många!
Kod: Markera allt
void main( void)
{
char i;
unsigned long T1, t1, t2;
unsigned long k;
TRISB.3 = 1; /* CCP1-pin is input */
initserial();
delay10(10); /* 1 sek delay */
T1CON = 0b00.11.0.0.0.1 ; /* prescal 1:8 */
CCP1CON = 0b00.00.0101 ;
OPTION.7 =0;
while(1)
{
/* Väntar på signal, sen mäter värdet */
CCP1IF = 0 ; /* reset flag */
while (CCP1IF == 0 ); /* wait for capture */
t1 = CCPR1H*256;
t1 += CCPR1L;
CCP1IF = 0 ; /* reset flag */
while (CCP1IF == 0 ); /* wait for next capture */
t2 = CCPR1H*256;
t2 += CCPR1L;
delay10(50);
/* Calculations */
T1 = t2 - t1; /* calculate period */
k = 37520000/T1; /* calculate frequency */
/* print variable */
unslongtoa(k);
string_out1();
putchar('\n');
}
}
void initserial( void ) /* initialise serialcom port */
{
SPEN = 1;
BRGH = 1; /* Async high speed */
TXEN = 1; /* transmit enable */
SPBRG = 130 -1; /* 9600 Baud @ 20 MHz-clockfrequency */
CREN = 1; /* Continuous receive */
RX9 = 0; /* 8 bit reception */
TRISB.2 = 0; /* serial_out is output */
TRISB.1 = 1; /* serial_in is input */
}
bit putchar( char d_out ) /* sends one char */
{
if(d_out == '\0') return 0; /* refuse to send 0 "end of string" */
while (!TXIF) ; /* wait until previus character transmitted */
TXREG = d_out;
return 1; /* done */
}
/* If two (or more) char's are recieved, but not read, the reciever will be locked! */
/* To unlock the reciever, run function OverrunRecover() */
void OverrunRecover(void)
{
char trash;
trash = RCREG; /* the two char's that locked the reciever */
trash = RCREG; /* are read and ignored */
CREN = 0; /* the unlock procedure ... */
CREN = 1;
}
void unslongtoa(unsigned long u16)
{
char i,temp;
RPM[4] = '\0';
for (i = 3; ;i--)
{
temp = u16 % 10;
temp += '0';
RPM[i]=temp;
if (i==0) break;
u16 /= 10;
}
}
void string_out1( void )
{
char i;
for( i = 0; putchar( RPM[i] ); i++);
}
void delay10( char n)
/*
Delays a multiple of 10 milliseconds using the TMR0 timer
Clock : 4 MHz => period T = 0.25 microseconds
1 IS = 1 Instruction Cycle = 1 microsecond
error: 0.16 percent. B Knudsen.
*/
{
char i;
OPTION = 7;
do {
i = TMR0 + 39; /* 256 microsec * 39 = 10 ms */
while ( i != TMR0)
;
} while ( --n > 0);
}