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