Rotary encoder AVR library

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Hydrawerk
Příspěvky: 8516
Registrován: 13 pro 2011, 00:00
Bydliště: Earth

Rotary encoder AVR library

#1 Příspěvek od Hydrawerk »

Jakou knihovnu pro rotační enkodér používáte pro MCU ATmega? Já jsem pro svou ATmega32 použil knihovnu odtud:
http://winavr.scienceprog.com/interfaci ... o-atmega32

Furt to fungovalo nějak blbě. Bylo nutný nastavit větší vzorkovací rychlost. Ta je ovlivněna předděličkou Timeru 2. Původně byla nastavená na 256.

Kód: Vybrat vše

void Timer2_Start(void)
{
    TCCR2|=(1<<CS22)|(1<<CS21); //prescaller 256 ~122 interrupts/s
    TIMSK|=(1<<TOIE2);//Enable Timer0 Overflow interrupts
}

Změnil jsem to raději na 8.

Kód: Vybrat vše

ISR(TIMER2_OVF_vect)
{
RotaryCheckStatus(); //reading rotary and button
}

int main(void) {
TCNT2=0x00;
TIMSK=0b01000000; //Enable Timer2 Overflow interrupts
TCCR2=0b00000010; //prescaller 8
//the sample rate must be fast enough!
sei(); //GLOBAL INTERRUPT ENABLE!!!
Přílohy
m32rotary_0.zip
(69.68 KiB) Staženo 159 x
Uživatelský avatar
Hydrawerk
Příspěvky: 8516
Registrován: 13 pro 2011, 00:00
Bydliště: Earth

#2 Příspěvek od Hydrawerk »

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#3 Příspěvek od frpr666 »

Koukal jsem na ten tvůj m32rotary.zip.
Zdá se, že to funguje tak, že periodicky v časovém přerušení se vyčítá stav enkodéru.
Nechápu proč proměnné: rotarystatus, wait nejsou volatile, když se nastavují v přerušení?

O něco lepší řešení se mě zdá tady:
http://www.timmestein.nl/index.php?page ... rupt-style
1/ hw vstupy do uC jsou ošetřeny před zákmity filtrem, C1,C2=100nF, R1,R2=10k
2/ sw využívá ext. přerušení INT1, takže se zpracuje opravdu každé pootočení hřídelky!
3/ sw využívá TMR přerušení, takže se rozpozná rychlé a pomalé pootočení.
4/ 'obraz' polohy enkodéra je 16bit číslo, což se mě zdá užitečnější než dvě hodnoty 'doprava' a 'doleva'
Uživatelský avatar
Hydrawerk
Příspěvky: 8516
Registrován: 13 pro 2011, 00:00
Bydliště: Earth

#4 Příspěvek od Hydrawerk »

Nejsem autorem m32rotary_0.zip. Použil jsem odstranění zákmitů podle Daviduse.
Přílohy
osetreni zakmitu u enkoderu01.png
(10.88 KiB) Staženo 159 x
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“