Countern i en Mega 32:a?
Countern i en Mega 32:a?
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?
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?
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
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.
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.
Det är en Formula SAE gocart det handlar om så vi kommer att mäta på bakaxeln.danei skrev:Är det en vanlig bakhjuldriven bil det handlar om, så är nog kardanaxeln en bra ide.
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)
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
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?
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?
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.
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.
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
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
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
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.
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.
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
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.
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.