Countern i en Mega 32:a?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Countern i en Mega 32:a?

Inlägg av Hedis »

Håller på och bygger en hastighetsmätare med lcd display och en mega32 processor.

Skall sätta en kuggskiva på drivaxeln bak och läsa av denna med en hallgivare.

Men vilket är det smidigaste sättet att räkna antalet pulser under en viss tid?

Har försökt o läsa lite om den inbyggda räknaren i avr:en men fattar inte mycket.

Någon som har något tips?
danei
EF Sponsor
Inlägg: 27417
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Är det en vanlig bakhjuldriven bil det handlar om, så är nog kardanaxeln en bra ide.
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Initiera en timer/counter som counter för att räkna externa pulser.
Initiera den andra timer/counter som timer för att få ett timer overflow interrupt vid en specifierad tid, typ 1 s. Då har du antalet pulser/sekund i counter registret.

För den första timern väljer man extern klockkälla, för den andra använder man prescaler och laddar räknarregistret med lämpligt värde för att få interrupt i rätt tid. Slutligen måste man enabla interrupt i TIMSK.
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

danei skrev:Är det en vanlig bakhjuldriven bil det handlar om, så är nog kardanaxeln en bra ide.
Det är en Formula SAE gocart det handlar om så vi kommer att mäta på bakaxeln.
Skoj hade vart o monterat en givare på ett framhjul o kontruerat ett antispinn system. Men vi får vell se hur mycket tid det blir över.

Henkebenke> Har du några kodexempel? (assembler)
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Njaee inte på rak arm, jag hänvisar till manualen. Står ganska väl beskrivet där.
Användarvisningsbild
marvin
Inlägg: 214
Blev medlem: 30 maj 2003, 22:24:57
Ort: Göteborg
Kontakt:

Inlägg av marvin »

Ogillar du c++?
Initiera en timer till lämplig tid. Tiden beror på hur snabbt hjulen snurrar.
sedan i koden nollställ timern, använd interrupt som ökar ett register varje puls. När timern räknat färdigt, behandla datan.
Hjälper dig gärna men vill veta hur många pulser som kommer per sekund så kan du få data med en gång.
Kör ni gocart i Trollhättan?
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

HTU håller på att konstruera en FSAE kart.
Vi på elprogrammet (Nilsericssons gymnasiet) har fått i uppgift att konstruera elsystem och diverse utrustning.

Så nu är det dags o bygga en hastighetsmätare.

Det enda språk jag kan är assembler så det blir smidigast så.
Satt och läste igenom databladet igår angående räknarna men blev inte så mycket klokare.
Får ta och läsa det igen i lung och ro så får vi se.

Vi får tillverka en kuggkrans och sätta på bakaxeln med kanske 5-10 "positiva kuggar" per varv. Frågan är om man inte skall hålla antalet kuggar lågt så man inte kommer över 256 pulser. Fast iofs. så är det ju bara att minska tiden till tex. 0.5sec.
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Man kan ju ha en variabel som räknar antalet overflows-interrupt, dvs antalet gånger den räknat til 256. Sedan kan man kolla denna variabeln samt innehållet i räknarregistret vid sitt 1 sekunds interrupt.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Hmm... det henkebenke skrev i sitt första inlägg verkar vettigast...

Du måste dock räkna lite på att för att på ut km/h eller liknande... du får ju bara RPS (rotation per second) för axeln... det är inte samma omkrets/hastighet på hjulen... dvs km/h är ju omkretsen på hjulen gånger antal varv genom tiden dvs V=S/t, hastigheten = Sträckan / tiden... dvs km / h, inte pulser per sekund...

Du kanske redan har tänkt på detta... ignorera isf detta inlägg...

//Rille
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Jepp det har jag tänkt på.
Men tack iaf. för att du påpekade det.
Ibland så står ju hjärnan trots allt stilla :)
Användarvisningsbild
marvin
Inlägg: 214
Blev medlem: 30 maj 2003, 22:24:57
Ort: Göteborg
Kontakt:

Inlägg av marvin »

Okej, assembler blir det. Om du ska fortsätta med mikrodatorer kan jag av egen erfarenhet rekomendera C++. Det är bra att börja med assmembler (man förstår vad man gör), men det är mycket effektivare att använda högnivåspråk.
Jag rekomenderar att skriva ut sidan "register summary" så att man har lite koll på vad man gör.
Sedan ska du initiera timern. Detta gör du i registret TCCRX (x=vilken timer du skall använda).
Du bör nog ställa in en prescaler, dvs du delar klockfrekvensen med (8,64,256,1024) bör att skapa en tidbas. Du har inte berättat hur många pulser man kan räkna med per sekund. Att göra som henkebenke föreslår ser jag ingen vinst med, men han har säkert en poäng, man kan fortfarande inte räkna med mer än 255 pulser per tidsbas.
Det finns både 16-bittars räknare och register på en mega32 men jag kan tyvärr inte hjälpa dig med dessa (har inte arbetat med dem).
Kolla på interrupt oxå. Du skall ha interrupt på en ingång (INTX) för att räkna pulser och overflow-interrupt på timern (så du vet när du ska sluta räkna).
Hoppas att du blivit något klokare. Satt själv med ungefär samma problem som dig för inte allt för längesedan. Kan inte säga att databladen är särskilt pedagogiskt skrivna.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Men henkebenkes metod kan man utöka en 8bits hårdvaruräknare till 16/24/32... hur många bitar som helst (så länge minnet räcker till och man hinner uppdatera allt innan nästa overflow) så visst kan man ha mer än 255 pulser per tidbas?
Användarvisningsbild
marvin
Inlägg: 214
Blev medlem: 30 maj 2003, 22:24:57
Ort: Göteborg
Kontakt:

Inlägg av marvin »

Jo, det är jag med på, men lagring och bearbetning i assembler??
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Tanken med metoden jag beskrev var just en utökning av 8-bitars timern. Lagring bör kunna ske i registren och om du med bearbetning menar aritmetik av typen multiplikation/division så finns det hårdvarustöd för det förra och Atmel tillhandahåller rutiner för division på sin hemsida.

Nåväl, läste artikeln "Multitasking on an AVR" på avrfreaks och i sektion 3 så beskrivs just setup för timeravbrott. Med kod, dock i C. Men det borde vara lättöversatt.
Skriv svar