 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vitez93 Član


Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.00 Kraj: Celje- Dobrna
|
Objavljeno: Pet Jul 31, 2009 9:40 pm Naslov sporočila: Merilec hitrosti |
|
|
Ker treniram smučarske skoke me zanima da bi naredil merilec zaletne hitrosti. Uporabil bi pic 16f628a. Torej v=s/t. Imel bi dva IR senzorja ( Ir oddajnik - timer 555 in sprejemnik TSOP 38kHz). Senzorja bi bila razmaknjena recimo 8m. Ko se prvi senzor prekine, pic šteje čas dokler se ne prekine 2. senzor. Nato izračunamo, pretvorimo m/s -> km/h in izpišemo na led prikazovalniku oz. lcd displey-u. Na kakšen način je najbolje šteti čas? Ta mora biti najmanj na 0,001s natančen. Časi bi se gibali od 0,15s do največ 0,40s. Pisal bi v zbirniku. |
|
Nazaj na vrh |
|
 |
Dexboy Član



Pridružen-a: Pon 01 Sep 2008 22:46 Prispevkov: 1116 Aktiv.: 5.46 Kraj: Horjul
|
Objavljeno: Pet Jul 31, 2009 10:10 pm Naslov sporočila: |
|
|
Kaj pa možnost z merilnikom pospeškov? Tam bi lahko izrisal celoten graf skoka  _________________ Imagination is more important than knowledge.
-Albert Einstein- |
|
Nazaj na vrh |
|
 |
vitez93 Član


Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.00 Kraj: Celje- Dobrna
|
Objavljeno: Pet Jul 31, 2009 10:19 pm Naslov sporočila: |
|
|
Ja takšen merilec stane 1000 evrov+ . Tukaj bi pa bili stroški izdelave 1-2% tiste cene. Torej kako najbolje meriti čas???
A 16f628a se da debugirati? |
|
Nazaj na vrh |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Pet Jul 31, 2009 11:05 pm Naslov sporočila: |
|
|
Ja 1 ms ni problema merit čipu. Tudi senzorji so dovolj odzivni da se da dosečt to natančnost.
Sem delal nekaj zelo podobnega ... v C-ju, takrat sem uporabljal 16f876.
Uporabljal sem Timer1 (16 bitni) in oba Capture signala. Ko je bila prekinjena prva celica se je zabeležil Timer1 in nato se je aktiviral (in čakal) drugi Capture... za drugo fotocelico.
Spodaj je koda za HTPIC compiler... mogoce si lahko kaj pomagas z njo:
Koda: |
#include <pic.h>
#include "lcd.h"
#include "delay.h"
//1234567890123456
//spd.1
//hs, wdt off, poweruptimer on, brown off, lvp off
__CONFIG(0x3f32);
volatile unsigned int tmre;
volatile unsigned char measure;
volatile unsigned long long t1start, t2start;
void lcd_printlong(unsigned long long num)
{
unsigned long long t;
unsigned char n;
n=0;t=1000000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=100000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=1000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=100000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=1000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=100;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
lcd_putch(num+'0');
}
void lcd_printspeed(unsigned long long num)
{
unsigned long long t;
unsigned char n,d=0;
n=0;t=1000000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=100000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=10000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=1000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=100000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=10000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=1000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=100;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
lcd_putch(',');
n=0;t=10;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
lcd_putch(num+'0');
}
void lcd_printtime(unsigned long long num)
{
unsigned long long t;
unsigned char n,d=0;
n=0;t=600000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=60000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
if(d){lcd_putch(':');}
n=0;t=10000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=1000000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
if(d==0){lcd_putch('0');}
lcd_putch(',');
n=0;t=100000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=10000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
n=0;t=1000;while(num>=t){num-=t;n++;d++;}if(d){lcd_putch(n+'0');}
}
void lcd_printchar(unsigned char num)
{
unsigned char t;
unsigned char n;
n=0;t=100;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
lcd_putch(num+'0');
}
void main()
{
const unsigned long long d = 3600000000;
unsigned long long time,speed,tprev,lap;
//settings
T1CON = 1; //tmr1 on internal clock, tmr1on = 1
PORTB = 0;
TRISB = 0; //lcd outputs
PORTC = 0;
TRISC = 0xff; //inputs for data
//lcd setup
lcd_init();
lcd_clear();
lcd_puts("VR speedtrap");
//cleanup
tmre = 0;
measure = 0;
//enable capture
CCP1CON = 5; //rising edge, capture
CCP1IE = 1;
CCP1IF = 0;
CCP2CON = 0; //disabled before start
CCP2IE = 1;
CCP2IF = 0;
TMR1IE = 1;
PEIE = 1;
GIE = 1;
while(1)
{
//show status
lcd_goto(0xce);
if(RC2)
{
lcd_putch('1');
}
else
{
lcd_putch(' ');
}
if(RC1)
{
lcd_putch('2');
}
else
{
lcd_putch(' ');
}
if(measure==2)
{
measure = 0;
time = t2start - t1start;
lcd_clear();
speed = d/time;
lcd_printspeed(speed);
lcd_puts(" km/h");
lap = t2start - tprev;
tprev = t2start;
}
}
}
void interrupt isr(void)
{
if(CCP1IF)
{
CCP1IF = 0;
if(measure==0)
{
*(((unsigned char*)&t1start)+3) = *(((unsigned char*)(&tmre))+1);
*(((unsigned char*)&t1start)+2) = *((unsigned char*)(&tmre));
*(((unsigned char*)&t1start)+1) = CCPR1H;
*((unsigned char*)(&t1start)) = CCPR1L;
measure = 1;
CCP1CON = 0;
CCP2CON = 5;
return;
}
//LCD_Error(11);
return;
}
if(CCP2IF)
{
CCP2IF = 0;
if(measure==1)
{
*(((unsigned char*)&t2start)+3) = *(((unsigned char*)(&tmre))+1);
*(((unsigned char*)&t2start)+2) = *((unsigned char*)(&tmre));
*(((unsigned char*)&t2start)+1) = CCPR2H;
*((unsigned char*)(&t2start)) = CCPR2L;
measure = 2;
CCP1CON = 5;
CCP2CON = 0;
return;
}
//LCD_Error(21);
return;
}
if(TMR1IF)
{
TMR1IF=0;
tmre++;
/*
if(measure)
{
//speed below 1m/s (3,6km/h)
if(tmre-tmres>152 && measure!=5)
{
measure = 0;
CCP1CON = 5;
CCP2CON = 0;
//LCD_Error(reset);
}
}
*/
return;
}
}
|
|
|
Nazaj na vrh |
|
 |
vitez93 Član


Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.00 Kraj: Celje- Dobrna
|
Objavljeno: Sob Avg 01, 2009 9:58 am Naslov sporočila: |
|
|
Najlepša hvala za tole. Ko bo nareto lahko prideš pogledat ko si ravno iz velenja. Kakšno preddelitev si pa imel? |
|
Nazaj na vrh |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Sob Avg 01, 2009 11:53 am Naslov sporočila: |
|
|
No pa bom prisel pogledat ko boste skakal
Nisem uporabljal preddelitve (1:1), kvarz pa je bil 4MHz. Sem pa potem uporabljal eno dodatno spremenljivko da mi je stela timer1 overflow... |
|
Nazaj na vrh |
|
 |
vitez93 Član


Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.00 Kraj: Celje- Dobrna
|
Objavljeno: Sob Avg 01, 2009 12:14 pm Naslov sporočila: |
|
|
Jaz sem nekako računal in ugotovil da pri preddelitvi 1:8 mi timer ne bi dosegel max vrednosti. V nastavitvah timerja bi verjetno moral nastaviti timer mod. Kaj pa pomeni tole: Timer1 Oscillator Enable Control bit ? |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Sob Avg 01, 2009 12:51 pm Naslov sporočila: |
|
|
vitez93 je napisal/a: |
Jaz sem nekako računal in ugotovil da pri preddelitvi 1:8 mi timer ne bi dosegel max vrednosti. V nastavitvah timerja bi verjetno moral nastaviti timer mod. Kaj pa pomeni tole: Timer1 Oscillator Enable Control bit ? |
Tocno to, kar pise - ta bit omogoci delovanje T1 oscilatorja. Ta je opisan v datasheetu, a ga ti za tvoj namen ne rabis, razen ce bi rad meril cas bolj tocno (urin kvarc). _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
int47 Član


Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2104 Aktiv.: 8.88 Kraj: Ljubljana
|
Objavljeno: Sob Avg 01, 2009 2:31 pm Naslov sporočila: |
|
|
Poglej v pdf tvojega sprejemnika. Nekateri zahtevajo pavzo med serijami impulzov. |
|
Nazaj na vrh |
|
 |
vitez93 Član


Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.00 Kraj: Celje- Dobrna
|
Objavljeno: Sob Avg 01, 2009 9:10 pm Naslov sporočila: |
|
|
napisal sem začetek programa, v katerem štejem čas. A bo tole vredu?
Koda: |
list p=16f628a
#include <p16f628a.inc>
__CONFIG _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON
org 0x000
goto zacni
org 0x004
zacni
CAS1 EQU 0X20
CAS2 EQU 0X21
BSF STATUS, RP0
MOVLW B'00000000' ;VSI SO IZHODI ZA LED PRIKAZOVALNIK
MOVWF TRISB
MOVLW B'00110000' ;RA0,1,2 SO IZHODI ZA TRANZISTORJE RA5 IN 4 SO VHODI ZA SENZORJE
MOVWF TRISA
;**********************************nastavitve timerja**********************************
BCF STATUS, RP0
movlw b'00110001'
MOVWF T1CON
;*************************************************************************************
cakaj1 BTFSC PORTA,5 ;ko se prvi senzor prekine, se stevec timerja resetira
goto cakaj1
CLRF TMR1
cakaj2 btfsc PORTA,4 ;ko se prekine 2. senzor se vrednost
;timerja kopira v registra cas1 in cas2
goto cakaj2
movf TMR1L,0
movwf CAS1
movf TMR1H, 0
movwf CAS2
ZANKA GOTO ZANKA
END |
|
|
Nazaj na vrh |
|
 |
vitez93 Član


Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.00 Kraj: Celje- Dobrna
|
Objavljeno: Ned Avg 02, 2009 8:30 pm Naslov sporočila: |
|
|
Že napredujem. Kodo sem sestavil do izračuna desetic. Čas delim z 36. 10*3,6. Z 10 zato, da dobim iste enote. Z 3,6 pa zato da ko potem izračunam, že imam pretvorjeno v km/h. Ampak imam en problem. Tam ko drugič kličem Deli16, program kar preskoči.
Koda: |
list p=16f628a
#include <p16f628a.inc>
__CONFIG _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON
Cblock 0x20 ; Blok za definicijo konstant
Deljenec : 2 ; Deljenec (2 bajta)
Deljitelj : 2 ; Deljitelj (2 bajta)
Kolicnik : 2 ; Kolicnik (2 bajta)
Ostanek: 2 ; Ostanek (2 bajta)
Stevec ; Stevec za deljenje
Cas : 2 ; Preracunan cas
Desetice
endc ; Konec bloka konstant
org 0x000
goto zacni
org 0x004
zacni
BSF STATUS, RP0
MOVLW B'00000000' ;VSI SO IZHODI ZA LED PRIKAZOVALNIK
MOVWF TRISB
MOVLW B'00110000' ;RA0,1,2 SO IZHODI ZA TRANZISTORJE RA5 IN 4 SO VHODI ZA SENZORJE
MOVWF TRISA
;**********************************nastavitve timerja**********************************
BCF STATUS, RP0
movlw b'00000001'
MOVWF T1CON
;*************************************************************************************
cakaj1 BTFSC PORTA,5 ;ko se prvi senzor prekine, se stevec timerja resetira
goto cakaj1
CLRF TMR1L
CLRF TMR1H
cakaj2 btfsc PORTA,4 ;ko se prekine 2. senzor se vrednost kopira v registre za deljenje
goto cakaj2
movf TMR1H,0
movwf Deljenec
movf TMR1L, 0
movwf Deljenec+1
movlw 0x00
movwf Deljitelj
movlw 0x24
movwf Deljitelj+1 ; Nalozi podatke v registre
; Deljenec = cas
; Deljitelj = 0x24
call Deli16 ; Klici deljenje
movlw 0x27
movwf Deljenec
movlw 0x10
movwf Deljenec+1
movf Kolicnik,0
clrf Deljitelj
movwf Deljitelj
movf Kolicnik+1,0
clrf Deljitelj+1
Movwf Deljitelj+1
call Deli16
zanka goto zanka ; Neskoncna zanka
;***** DELJENJE: Deljenec / Deljitelj = Kolicnik in Ostanek **************
Deli16
clrf Kolicnik
clrf Kolicnik+1 ; Izbrisemo Kolicnik
clrf Ostanek
clrf Ostanek+1 ; Izbrisemo ostanek
movlw .17
movwf Stevec ; 17 -> Stevec (stevilo ponovitev+1)
Delaj
decf Stevec,f ; Zmanjsamo Stevec
btfsc STATUS,Z ; Ali je stevec ze 0?
return ; Da, koncaj deljenje
rlf Deljenec+1,f
rlf Deljenec,f ; Pomakni cel Deljenec v levo
rlf Ostanek+1,f
rlf Ostanek,f ; Pomakni cel Ostanek v levo s C
call Deli ; Klici pomozni podprogram za Kolicnik
goto Delaj ; Nadaljuj (16x)
;********************* POMOZNI PODPROGRAM ZA DELJENJE ********************
Deli
movf Deljitelj+1,w ; Nizji bajt deljitelja -> W
subwf Ostanek+1,f ; Odstej od nizjega bajta ostanka
movf Deljitelj,w ; Visji bajt deljitelja -> W
btfss STATUS,C ; Ali je prislo do prenosa (C=0)?
incf Deljitelj,w ; Da, povecaj deljitelj -> W
subwf Ostanek,f ; Odstej od visjega bajta ostanka
btfss STATUS,C ; Ali je rezultat negativen (C=0)?
goto Negativno ; Da, skoci na Negativno
bsf STATUS,C ; Ne, C=1
rlf Kolicnik+1,f
rlf Kolicnik,f ; Kolicnik pomakni v levo in LSB=C=1
return ; Konec pomoznega podprograma
Negativno
bcf STATUS,C ; C=0
rlf Kolicnik+1,f
rlf Kolicnik,f ; Kolicnik pomakni v levo, LSB=C=0
movf Deljitelj+1,w
addwf Ostanek+1,f
btfsc STATUS,C
incf Ostanek,f
movf Deljitelj,w
addwf Ostanek,f ; 16 bitno sestej Kolicnik in Ostanek, da
; dobis spet prvoten ostanek (pozitiven)
return ; Konec pomoznega podprograma
END |
|
|
Nazaj na vrh |
|
 |
mkezmah Član

Pridružen-a: Sre 21 Jan 2009 16:30 Prispevkov: 220 Aktiv.: 1.10 Kraj: Maribor
|
Objavljeno: Pon Avg 03, 2009 9:29 am Naslov sporočila: |
|
|
Morda bi opozoril na eno (po mojem) konceptno napako. Ti bi meril zaletno hitrost po formuli za konstanto hitrost, dejansko pa gre za pospešeno gibanje . Če se ne motim, pospešuješ vse do odriva. Raje si nastavi dva senzorja tik pred odskokom z razdaljo recimo 1 m, da boš dobil vsaj približek končne hitrosti. Mikrokrmilniki so več kot sposobni meriti tako kratke čase.
LP
Marko |
|
Nazaj na vrh |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Pon Avg 03, 2009 10:52 pm Naslov sporočila: |
|
|
Samo potem pride v igro odzivnost senzorja pri tako malih časih...
In vprašanje koliko je še dejansko pospeška tam pri neki visoki hitrosti (upoštevajoč trenje in zračni upor). Verjetno pa fante (in dekleta?) bolj zanima neka relativna primerjava, kot čista absolutna hitrost na decimalke. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70830.68
|
Objavljeno: Pon Avg 03, 2009 11:12 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
mkezmah Član

Pridružen-a: Sre 21 Jan 2009 16:30 Prispevkov: 220 Aktiv.: 1.10 Kraj: Maribor
|
Objavljeno: Tor Avg 04, 2009 7:17 am Naslov sporočila: |
|
|
Seveda je proti koncu bolj malo pospeška, zato pa je tam tudi najbolj primeren del za merjenje.
Glede odzivnosti jaz ne bi kaj preveč kompliciral, saj pri 150 km/h traja cca 24 ms da prepotuješ 1 m in to ni ravno kratek čas... |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|