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