Sida 1 av 1

Rotationsgivare/Pulsgivare med AVR

Postat: 20 september 2007, 14:02:33
av gurgalof
Jag har en sån här.

Men har inte lyckats klura ut hur jag ska få den att fungera med min AVR (ATTiny2313).

Jag vet att man ska använda interupt iallafall (har aldrig använt interupt tidigare).

Sen ska man ju klura ut åt vilket håll den snurrar också...



Just det ja, jag programmerar i C.


Snälla hjälp mig, jag är nybörjare på det här...

Postat: 20 september 2007, 14:16:34
av Rohan
Ett sätt att göra det på är att koppla in den ena signalen på ett ben med avbrott och den andra signalen på en vanlig ingång. Sedan är det bara att läsa av den andra signalen varje gång du får ett avbrott.

Postat: 20 september 2007, 14:21:06
av thepirateboy
Det finns många olika sätt att läsa av en sådan. Kolla på avr-freaks så hittar du många implementeringar. Man kan polla, man kan använda interrupt. Man kan använda lågpassfilter och man kan filtrera i mjukvaran.

Själv använder jag interrupt och lågpassfilter. En av utgångarna från givaren är kopplad via lågpassfilter till en interruptingång. Genom att kolla status på utgångarna från givaren (hög eller låg) avgör man med eller moturs.

Kod: Markera allt

//--------------------------------------------------//
// Interrupt när man VRIDER på rotationsgivaren
//--------------------------------------------------//

ISR(INT0_vect)
{

	if(PINC & (1<<2))				// Kollar nivån på pinnarna för att avgöra medurs/moturs
	{
		if(PINC & (1<<3))
		{
			rotation--;
		}
		else
		rotation++;
	}
	else
	{
		if(PINC & (1<<3))
		{
			rotation++;
		}
		else
		rotation--;			
	}
}

Postat: 20 september 2007, 15:05:20
av sodjan
Interrupt har sina fördelar (ingen kod körs förrens man faktiskt rör på den) men
också en del nackdelar (kontaktstudsar bl.a).
Med extra extern hårdvara (filter) kan man minska problemen.

När jag skrev kod för en rot.enkoder (för PIC, men det spelar i detta
fall mindre roll) så hade jag en rutin i ett timer-avbrott som kollade läget.
Om det avvek från föregående läge, så jämfördes de för att få riktningen.
Jag har för mig att den pollades med ca 400 Hz. Det tar liten tid även om
enkodern står still, men blir det bara en avläsning och än jämförelse med
föregående läge (lika) och så return från timer-interruptet. Jag har för mig
att overheaden bara var någon % av tillgängliga cykler.

I de flesta applikationer har man i alla fall ett timer-interrupt av andra
orsaker, och då kan man bygga ihop det med denna funktion.

Postat: 20 september 2007, 17:23:49
av gurgalof
Jag kan inte!!! Jag är helt värdelös!!!

Jag kan verkligen inte koda....


Lägger ner det här...

Postat: 20 september 2007, 17:50:47
av oJsan
Självförtroendet på topp märker jag :(

Postat: 20 september 2007, 19:07:54
av sodjan
> Jag kan inte!!! Jag är helt värdelös!!!

Hur vet du det ?

Postat: 20 september 2007, 22:31:06
av gurgalof
Glöm det jag skrev innan...
Jag har bytt uC till ATMega16, eftersom jag fick den av skolan...

Är det någon som kan hjälpa en relativ nybörjare som mig?

Postat: 20 september 2007, 22:42:58
av sodjan
OK.
Beskriv vad du behöver hjälp med.

Postat: 20 september 2007, 22:58:57
av kimmi

Postat: 20 september 2007, 23:08:38
av gurgalof
Ska titta på det mer imorgon...

Inte min dag idag, migrän + att man har varit sjuk i en vecka.
Tur att EF finns!