Arkadaşlar merhaba size bir sorum olacak STM32F103 microcontroler de TTL enkoder kullanıyorum işlemcinin hazır enkoder modülünü kullanıyorum enkoder modülü 15 bit ilk olduğundan dolayı 15 biti geçtikten sonra pulse değerlim sıfırlanıyor ben double integer olarak okumak istiyorum bu işlemi nasıl yapabilirim. Daha önceki projemde Atmel ile hartware interrupt kullanarak yapmıştım ama STM de bu işlemi yaptığımda ise girişteki filtreden dolayı pas kaçırıp yanlış ölçüm yapıyorum. STM nin enkoder modülünü kullandığımda ise sayıcı kendini sofırlıyor. Bu konuda başka bir önerisi olan var mı?
Arkadaşlar bir fikri olan yok mu?
TIM1->CNT ile maksimum 32768 okuyorum. 32768 değerinden sonra sayma eksi yöne geçiyor. Bu konuda yardım edebilecek veya fikir verebilecek bir arkadaş yok mu?
Kullandigin degiskeni unsigned int yapmayi dene.
Max 32768 degil de 32767 olmasin?
TIM'in update interruptı içinde
16 bitlik bir değişkene eğer timer yukarı saymışsa +1
aşağı saymışsa -1 toplayıp
TIM->CNT ve bu değişkeni 32 bitlik bir başka değişkene kaydet
TIM->CNT low word, bu ilk bahsettiğim değişken high word olucak
( pointer lerle yapabilirsin )
böylece 32 bitlik bir enkoder pozisyon bilgisi elde edersin
Sayın megraton arkadaşım Timer up veya Timer down interupları varmı? var ise nasıl yapabilirim?
tabi var
TIM'i init ederken bu satırı yazıcaksın
TIM_ITConfig(TIM2,TIM_IT_Update , ENABLE);
aşağı veya yukarı taştığı zaman
void TIM2_IRQHandler(void){ // ENCODER ICIN
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
uint16_t current = TIM2->CNT;
if ( current < 0x7FFF ) counterhi += 1; // Roll over in upwards direction
else counterhi -= 1; // Roll over in downwards direction
}
sonra programın döngüsünde
int32_t encoder;
uint16_t *RAMptr=&enkoder;
*RAMptr=TIM2->CNT; RAMptr++;
*RAMptr=counterhi;
Sevgili magnetron arkadaşım cevabınız i.in çok teşekkür ederim. Problemi çözdüm