STM32F103 bluepill TIM4 enkoder mod sorunu.

semih_s

Hobici
Katılım
16 Aralık 2020
Mesajlar
1,908
Merhaba. Daha evvel kolayca çalıştırdığım enkoder modu şu anda çalışmıyor ve nedenini anlayamıyorum. MIG kaynak mak. motoru için yaptığım testte enkoderi input olarak kullanıyordum.


Şimdi bir türlü çalıştıramadım.

Enkoder sinyalini mcu bacaklarından kontol ettim ve aşağıdaki gibi:
1730827702714.jpeg


cube ide kullanıyorum.
tim4 için konfigürasyonum aşağıdaki gibi:
1730828760940.png
1730828723671.png



Kullandığım TIM4 init kodu aşağıdaki gibi, bu kod ide'nin ürettiği kod.

TIM4:
/* TIM4 init function */
void MX_TIM4_Init(void)
{

  /* USER CODE BEGIN TIM4_Init 0 */

  /* USER CODE END TIM4_Init 0 */

  TIM_Encoder_InitTypeDef sConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM4_Init 1 */

  /* USER CODE END TIM4_Init 1 */
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 0;
  htim4.Init.CounterMode = TIM_COUNTERMODE_DOWN;
  htim4.Init.Period = 65535;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 0;
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 0;
  if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM4_Init 2 */

  /* USER CODE END TIM4_Init 2 */

}

Aşağıdaki kodu, sorunu tespit etmek için hazırladım. Enkoderi okuduğum döngüde, döngünün çalıştığını görmek için bir de sayaç var:

main:
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_I2C2_Init();
  MX_TIM1_Init();
  MX_TIM4_Init();
  MX_TIM3_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
    HAL_Delay(10);
    lcd_init();
    lcd_backlight(1);
    lcd_enable(1);
    HAL_Delay(100);
    TIM4->CNT=1000;
    TIM1_1MHZ_Init();
    while(ENKODER_BUTON_OKU)    // enkoder tuşuna basılana kadar çalışır.
    {
        if(TIM1->CNT>2499) // 2.5ms periyotta çalışır.
        {
          TIM1->CNT=0;
          lcd_tarama();
          bufferu16_1=TIM4->CNT;
          lcd_print_cur(0,0,"TIM4->CNT=");
          lcd_print_int(bufferu16_1,5);
          lcd_print_cur(1,0,"sayaç:");
          lcd_print_int((bufferu16_0++)/400,6);
        }
    }

Döngü çalışıyor- TIM4->CNT' ye atadığım değeri okuyup yazdırabiliyorum, saniye sayacı çalışıyor ama enkoder modda olmasına rağmen enkoder hareketlerine tepki vermiyor.

1730829236117.jpeg


Neyi gözden kaçırıyorum?
 
i/o'da bir problem olup olmadığını da test ettim:
enkoder:
if(TIM1->CNT>2499) // 2.5ms periyotta çalışır.
        {
          TIM1->CNT=0;
          lcd_tarama();
          bufferu16_1=TIM4->CNT;
          lcd_print_cur(0,0,"TIM4->CNT=");
          lcd_print_int(bufferu16_1,5);
          lcd_print_cur(1,0,"sn:");
          lcd_print_int((bufferu16_0++)/400,6);
          lcd_print_cur(1,8,"AB");
          lcd_print_int(((ENC_A_GPIO_Port->IDR)>>7)&1u,1);
          lcd_print_int(((ENC_B_GPIO_Port->IDR)>>6)&1u,1);

        }
    }
 

Ekler

  • enkoder_dert.mp4
    1.4 MB
Etrafını alkolle tinerle yıkamayı dene. Eğer yanlış görmüyorsam her yeri pasta/flux kalıntısı.
Enkoder başa bela bir şey. Çok uğraştırıyor insanı.
 
Etrafını alkolle tinerle yıkamayı dene. Eğer yanlış görmüyorsam her yeri pasta/flux kalıntısı.
Enkoder başa bela bir şey. Çok uğraştırıyor insanı.
Evet, enkoderi söke taka o hale geldi. Sinyali takip ediyorum hem skopla hem de lcd'de input sinyalini doğru okuyor alet. enkoder modu ile ilgili kodlamada sorun var gibi görünüyor.
 
Hocam "USER CODE BEGIN 2" den sonrasına bu kodlarıda ekler misiniz.

HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_2);
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,950
Mesajlar
118,718
Üyeler
2,822
Son üye
lalemasall

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top