STM32F103 bluepill TIM4 enkoder mod sorunu.

semih_s

Hobici
Katılım
16 Aralık 2020
Mesajlar
2,074
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.

Kod:
/* 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:

Kod:
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:
Kod:
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.
 

Forum istatistikleri

Konular
8,318
Mesajlar
136,648
Üyeler
3,295
Son üye
lejjjyo

Son kaynaklar

Son profil mesajları

mechanic ayhanarican mechanic wrote on ayhanarican's profile.
https://www.allmystery.de almanca biliyorsan burada araştır. Yapay zekada çeviriyor gerçi.
Almanların matematik bilgisi daha iyi oluyor.
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Back
Top