encoder

Fanda hudaklan na volny.cz
Pondělí Květen 15 18:24:20 CEST 2017


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.





Další informace o konferenci Hw-list