Stránka 1 z 1

Rotary encoder AVR library

Napsal: 16 zář 2013, 02:03
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!!!

Napsal: 16 zář 2013, 02:07
od Hydrawerk

Napsal: 22 zář 2013, 10:38
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'

Napsal: 22 zář 2013, 21:28
od Hydrawerk
Nejsem autorem m32rotary_0.zip. Použil jsem odstranění zákmitů podle Daviduse.