Mäta varvtal med TMR0 ?
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
Mäta varvtal med TMR0 ?
Hej!
Jag ska bygga en varvtalsräknare men problemet är att hjulet jag ska mäta på går mycket sakta så det blir svårt tror jag att andvända Tocki pinnen på pickretsen.
Min fråga är om detta förslag skulle gå?
När min givare blir (1) så nollställer jag Timer0 räknar sen antalet gånger som TMR0 går runt addera dessa gånger till en variabel Y0, när sen givaren blir (1) igen så läser jag timer0 värde till en annan variabel Y1.
Jag har räknat ut att tiden det tar att TMR0 ska gå runt utan prescalern är 512uS vid 4MHz
Enligt formeln Tottid= 8*256/4 = 512uS Stämmer det?
Om jag nu andvänder full prescaler borde inte en runda TMR0 bli
512*256=131072 = 131,072mS
Om detta stämmer och fungerar har jag ju tiden genom att multiplisera variabeln1 med tiden 131.072 och variabel 2 genom att ta 131,072 / 256 *Y1
Och därmed har jag den totala tiden det tar att gå ett varv, sen är det bara att mäta hur många meter ett varv är och räkna ut RPM
Tro ni detta fungerar eller ska jag göra på något annat sätt??
MVH
Micke
Jag ska bygga en varvtalsräknare men problemet är att hjulet jag ska mäta på går mycket sakta så det blir svårt tror jag att andvända Tocki pinnen på pickretsen.
Min fråga är om detta förslag skulle gå?
När min givare blir (1) så nollställer jag Timer0 räknar sen antalet gånger som TMR0 går runt addera dessa gånger till en variabel Y0, när sen givaren blir (1) igen så läser jag timer0 värde till en annan variabel Y1.
Jag har räknat ut att tiden det tar att TMR0 ska gå runt utan prescalern är 512uS vid 4MHz
Enligt formeln Tottid= 8*256/4 = 512uS Stämmer det?
Om jag nu andvänder full prescaler borde inte en runda TMR0 bli
512*256=131072 = 131,072mS
Om detta stämmer och fungerar har jag ju tiden genom att multiplisera variabeln1 med tiden 131.072 och variabel 2 genom att ta 131,072 / 256 *Y1
Och därmed har jag den totala tiden det tar att gå ett varv, sen är det bara att mäta hur många meter ett varv är och räkna ut RPM
Tro ni detta fungerar eller ska jag göra på något annat sätt??
MVH
Micke
Vilken processor använder du?
Finns det Input Capture Unit på?
Jag har just tillverkad ett program som i detta fall mätar hastighet men det är exakt samma funktion.
Jag använder Input Capture Unit (ICU). En ICU är en bit hårdvara som har en fritt löpande räknare, vid varje flank (stigande/fallande/båda) på input-pinnen sparas räknarens värde i ett register och ett interrupt signaleras.
Räknaren har (nästan alltid) en funktion som ger interrupt vid overflow, denna interrupt kan man använda till att räkna upp "de höga siffror". Själv är min CU på 16 bit men jag använder ett 32-bit tal och en upplösning om 225KHz, det ger en max. tid mellan mätpulserna på 5 timmer och det är väl OK i detta fall.
Jag gillar inte detta med att polla en pinne och mäta tid efter det men om tiderna är långsamma kan det fungera ganska hyggligt.
Tänk på att du inte kan förlita dig på att du inte missar en mätpuls under tiden du räknar talet för RPM ut.
Vilka tider som TMR0 tar på sig står tydligt i databladet (om vi snacker PIC t.ex.) och om du räknar enligt det är det rätt.
Men vilken RPM är aktuellt?
Finns det Input Capture Unit på?
Jag har just tillverkad ett program som i detta fall mätar hastighet men det är exakt samma funktion.
Jag använder Input Capture Unit (ICU). En ICU är en bit hårdvara som har en fritt löpande räknare, vid varje flank (stigande/fallande/båda) på input-pinnen sparas räknarens värde i ett register och ett interrupt signaleras.
Räknaren har (nästan alltid) en funktion som ger interrupt vid overflow, denna interrupt kan man använda till att räkna upp "de höga siffror". Själv är min CU på 16 bit men jag använder ett 32-bit tal och en upplösning om 225KHz, det ger en max. tid mellan mätpulserna på 5 timmer och det är väl OK i detta fall.
Jag gillar inte detta med att polla en pinne och mäta tid efter det men om tiderna är långsamma kan det fungera ganska hyggligt.
Tänk på att du inte kan förlita dig på att du inte missar en mätpuls under tiden du räknar talet för RPM ut.
Vilka tider som TMR0 tar på sig står tydligt i databladet (om vi snacker PIC t.ex.) och om du räknar enligt det är det rätt.
Men vilken RPM är aktuellt?
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
Jag kommer att andvända Pic16f628A till denna app.
Har tittat liet om det du pratade om (ICU) utan framgång det finns inte på dom pickretsar jag tittat på.
Jag kommer nog inte att mäta under beräkningstiden om det var det du menade, å sen kommer jag att köra ett par varv och ta medeltal av det.
Varvtals området jag ska mäta ligger mellan 100 - 2000 RPM och det är det låga som jag tror blir problem!
MVH
Michaël
Har tittat liet om det du pratade om (ICU) utan framgång det finns inte på dom pickretsar jag tittat på.
Jag kommer nog inte att mäta under beräkningstiden om det var det du menade, å sen kommer jag att köra ett par varv och ta medeltal av det.
Varvtals området jag ska mäta ligger mellan 100 - 2000 RPM och det är det låga som jag tror blir problem!
MVH
Michaël
Jag vet inte vilka µC Icecap refererar till med "Input Capture Unit" på, men på PIC heter motsvarande modul CCP (Capture, Compare, PWM). Med capture-modulen kan man få timer1 (16 bit) att räkna tiden mellan varje up/ner-flank på ingångspinnen. Räcker inte 16 bitar trots prescaler så kan man ju som tidigare sagt låta timern snurra fler varv och hålla reda på detta via timer1 overflow interrupt. En capture ger självklart också ett interrupt om så önskat.
Varför måste du förresten använda timer 0? Ska du ha timer 1 till annat? Isåfall funkar det inte att använda CCP-modulen.
Varför måste du förresten använda timer 0? Ska du ha timer 1 till annat? Isåfall funkar det inte att använda CCP-modulen.
Då så. Med CCP är det ofattbart enklare fast såklart finns det ett krux: Om den når att räkna "runt" under ett varv. Fast om du enbart gör en uträkning enligt: Varvtiden = Tiden_nu - Tiden_förr och strunter i overflow och sign-bits kommer det att vara rätt hur som helst.
Du behöver alltså att ha 3 16-bit variabler:
Tiden_nu
Tiden_förr
Skillnad
Sen räknar du:
Skillnad = Tiden_nu - Tiden_förr
Tiden_förr = Tiden_nu; Flyttar tiden ett jack tillbaka
och sen räknar du ut RPM-talet.
Du behöver alltså att ha 3 16-bit variabler:
Tiden_nu
Tiden_förr
Skillnad
Sen räknar du:
Skillnad = Tiden_nu - Tiden_förr
Tiden_förr = Tiden_nu; Flyttar tiden ett jack tillbaka
och sen räknar du ut RPM-talet.
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
Då jag är van att använda interrupten till sånt tycker jag ju att du bör göra det men interrupt men det kan göras utan också, man kan polla bitten som anger att det har blivit fångad något och sen gör man exakt det samma som en interrupt hade gjort med uträkning osv.
Så det är helt upp till dig, enligt mitt tycke är det minimalt med extrajobb att fixa en interruptstyrd rutin men smak och tycke.....
Så det är helt upp till dig, enligt mitt tycke är det minimalt med extrajobb att fixa en interruptstyrd rutin men smak och tycke.....
Om du inte gör något annat så kan du klara dig utan interrupt. Det du behöver göra är typ såhär (pseudo-kod)
time, old_time och diff är 16bits tal
diff blir tiden (i enheten "8 us") mellan två flanker, sen får du räkna om det till RPM...
läs om timer1 och ccp i databladet, där står det hur det funkar...
Det enda jobbiga är att hantera 16bits talen om man använder assembler
time, old_time och diff är 16bits tal
Kod: Markera allt
; Ställ in timer1
T1CON = b'00110001'
; Ställ in CCP
CCP1CON = b'00000101'
; loopa
while(1)
{
if(PIR1.CCPIF == 1) ; capture-event
{
PIR1.CCPIF = 0
old_time = time
time = CCPR1H:CCPR1L
diff = time - old_time
; beräkna mer här...
}
}
läs om timer1 och ccp i databladet, där står det hur det funkar...
Det enda jobbiga är att hantera 16bits talen om man använder assembler
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
beräkna varvtalet??
Finns det någon genväg för mig när jag räknar fram RPM?
Jag får ju ut "diff" där en diff är 8uS varvtalet bör då bli
(8*diff) / 1000000 = tid i sek
tid i min = tid i sek / 60
rpm = 1/ tid i min
Kan jag göra på något annat enklare sätt för min compilator klarar inte detta?
Det måste finna ett enklare sätt men hur?
Jag får ju ut "diff" där en diff är 8uS varvtalet bör då bli
(8*diff) / 1000000 = tid i sek
tid i min = tid i sek / 60
rpm = 1/ tid i min
Kan jag göra på något annat enklare sätt för min compilator klarar inte detta?
Det måste finna ett enklare sätt men hur?
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
Jag andvänder ju 4Mhz klockfrekvens, så det blir väl 1miljon klockpulser per sekund eller hur vilket ger 60 miljoner klockpulser på en minut.
RPM = 60 miljoner / (diff * 8 )
jag har ju redan problem med dom beräkningar så jag ser inget lättare med detta jag har ju bara variabel typen Word i min basic kompiler så detta gå rinte detta heller
RPM = 60 miljoner / (diff * 8 )
jag har ju redan problem med dom beräkningar så jag ser inget lättare med detta jag har ju bara variabel typen Word i min basic kompiler så detta gå rinte detta heller
Om du nu trimmar miniräknaren rätt vill du upptäcka att det snackades om 8µs som tidsmått. Du har därför 125000 pulser per sekund vilket ger 7,5M på 1 minut. Om du mätar mellan 2 pulser är talen helt annolunda eller hur?
Om du mätar vid 3000 RPM måste faktorn ju bli:
1/(3000/60) = 20ms.
Detta ger att TMR0 hinner att ge ett Diff om 2500 vid 3000RPM.
För att få '3000' som resultat måste faktorn då bli 7.500.000.
Detta betyder alltså med de begränsningar som du har i programmeringskunnighet och språk att det är dödfödd med i denna upplösning, du måste alltså sänka klockfrekvensen som tiden räknas i eller ge dig in på tyngre programmering.
Databladet kan avgöra för dig vilket som är möjligt.
Om du mätar vid 3000 RPM måste faktorn ju bli:
1/(3000/60) = 20ms.
Detta ger att TMR0 hinner att ge ett Diff om 2500 vid 3000RPM.
För att få '3000' som resultat måste faktorn då bli 7.500.000.
Detta betyder alltså med de begränsningar som du har i programmeringskunnighet och språk att det är dödfödd med i denna upplösning, du måste alltså sänka klockfrekvensen som tiden räknas i eller ge dig in på tyngre programmering.
Databladet kan avgöra för dig vilket som är möjligt.
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås