Rotationsgivare/Pulsgivare med AVR
Rotationsgivare/Pulsgivare med AVR
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...
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...
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
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.
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--;
}
}
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.
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.