encoder
Petr Labaj
labaj na volny.cz
Pondělí Květen 15 20:02:02 CEST 2017
A to vypisování děláte jak? To vypisujete nejméně stejně rychle jako
kmitá ten kontakt?
Nebo raději nejméně 2x rychleji, viz pan Shannon nebo Kotělnik?
PL
******************************
Dne 15.5.2017 v 19:57 Fanda napsal(a):
> Ano, je to mechanický, ale jak je vidět na CNT, tak to čítá správně po
> jedničce.
> Problém je, že přerušení proběhne několikrát, i když CNT funguje OK.
>
> HUDA
>
>
> ------ Původní zpráva ------
> Od: "Petr Labaj" <labaj na volny.cz>
> Komu: "HW-news" <hw-list na list.hw.cz>
> Odesláno: 15.5.2017 19:23:44
> Předmět: Re: encoder
>
>> To máte mechanický enkodér? A díval jste se, jak vypadá jeho výstup?
>>
>> PL
>>
>> ***********************
>>
>> Dne 15.5.2017 v 18:24 Fanda napsal(a):
>>> Dobrý den,
>>> na STM32F051 zkouším číst otáčkový snímač pro ovládání menu.
>>> Používám TIMER1 v "Encoder interface mode" a pomocí registru ARR
>>> nastavuji cyklus 0 - 8. Toto funguje dobře.
>>> Teď jsem chtěl využít přerušení při přechodu čítače z 8 do 0 a z 0
>>> do 8.
>>> Což také funguje, jen přerušení proběhne vždycky několikrát a já
>>> nevím proč.
>>>
>>> void InputSetup(void)
>>> {
>>> // nastaveni portu
>>> RCC->AHBENR |= ITOC_CLK;
>>>
>>> SetPinPort(ITOC_PORT, ITOCA, GPIO_Speed_2MHz, GPIO_OType_OD,
>>> GPIO_Mode_AF, GPIO_PuPd_UP);
>>> SetPinPort(ITOC_PORT, ITOCB, GPIO_Speed_2MHz, GPIO_OType_OD,
>>> GPIO_Mode_AF, GPIO_PuPd_UP);
>>>
>>> SetPinAF(ITOC_PORT, ITOCA, ITOC_AF);
>>> SetPinAF(ITOC_PORT, ITOCB, ITOC_AF);
>>> // nastaveni timeru
>>> RCC->APB2ENR |= ITOC_TIM_CLK;
>>>
>>> ITOC_TIM->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;
>>> ITOC_TIM->CCER = 0;
>>> ITOC_TIM->SMCR = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
>>> ITOC_TIM->ARR = 0x0008;
>>> ITOC_TIM->DIER = TIM_DIER_UIE;
>>> ITOC_TIM->CR1 = TIM_CR1_URS;
>>> ITOC_TIM->CR1 |= TIM_CR1_CEN;
>>>
>>> NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0x00); //! nastavi
>>> prioritu Tim1
>>> NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); //! povoli preruseni od
>>> Tim1 v NVIC systemu
>>> }
>>>
>>> void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
>>> {
>>> pokus2 = ITOC_TIM->SR;
>>> if (pokus2 & TIM_FLAG_Update)
>>> pokus1++;
>>> ITOC_TIM->SR &= (uint16_t)~(pokus2);
>>> }
>>>
>>> Vypisuji si, přes sériovou linku, hodnoty registrů CNT a SR a
>>> proměnou pokus1. Například:
>>> CNT SR pokus1
>>> 0000 0000 0000
>>> 0001 0000 0000
>>> 0002 0000 0000
>>> 0003 0000 0000
>>> 0004 0000 0000
>>> 0005 0000 0000
>>> 0006 0000 0000
>>> 0007 0000 0000
>>> 0008 0000 0000
>>> 0000 0019 0012
>>> 0001 0000 0000
>>> 0002 0000 0000
>>> 0003 0000 0000
>>> 0004 0000 0000
>>> 0005 0000 0000
>>> 0006 0000 0000
>>> 0007 0000 0000
>>> 0008 0000 0000
>>> 0000 0019 000E
>>>
>>> Mohl by mě někdo, prosím, říct jestli to takto jde, nebo kde dělám
>>> chybu.
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list