Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32][C]Problem z timerami

Sand_Man 24 Feb 2011 09:15 1304 0
  • #1
    Sand_Man
    Level 11  
    Witam wszystkich.
    Jestem w trakcie budowy prostego tachometru opartego o uC stm32f103vet6. Do pomiaru prędkości mają służyć 3 timery TIM 2,3,4. Mają one zliczać impulsy z czujników optycznych z jednostce czasu. Jak narazie uruchomiłem 2 timery 2 i 3. I tu natrafiłem na dwa problemy.
    Po pierwsze nie wiem jak wyzerować wartość timerów tak aby nie zliczały w nieskończoność. Tylko podawały aktualną prędkość obrotową w rpm.
    Po drugie oba liczniki nie zliczają tak samo jeden zlicza szybciej od drugiego. Nie mam pojęcia czemu.

    Załączam kod mojego programu:

    Code:

    #include "stm32f10x.h"
    #include "stm32f10x_conf.h"
    #include "hd44780.h"
    #include <stdio.h>


    void RCC_Conf(void);
    void NVIC_Conf(void);
    void GPIO_Conf(void);

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;

    uint16_t cnt1, cnt2;
    char I[8];
    int main(void)
    {



    #ifdef DEBUG
      debug();
    #endif

        GPIO_InitTypeDef GPIO_InitStructure;

      RCC_Conf();
      GPIO_Conf();
      NVIC_Conf();
       
    // Konfiguracja ukladu podstawy czasu
         TIM_TimeBaseStructure.TIM_Period = 65535;
         TIM_TimeBaseStructure.TIM_Prescaler = 0;
         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
     
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
                                                                                                    
    /**************************************************************************
                                    TIMER 2
    **************************************************************************/
       TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1, TIM_ICPolarity_Falling, 0);
        TIM_Cmd(TIM2, ENABLE);
    /**************************************************************************
                                    TIMER 3
    **************************************************************************/ 
        TIM_TIxExternalClockConfig(TIM3, TIM_TS_TI1FP1, TIM_ICPolarity_Falling, 0);
        TIM_Cmd(TIM3, ENABLE);


    LCD_Initialize();

        LCD_GoTo(0,0);
       LCD_WriteText("<< Tachometr v1.0 >>");
       
        LCD_GoTo(0,1);
       LCD_WriteText("V1=");
        LCD_GoTo(17,1);
       LCD_WriteText("rpm");
       
        LCD_GoTo(0,2);
       LCD_WriteText("V2=");
        LCD_GoTo(17,2);
       LCD_WriteText("rpm");
       
        LCD_GoTo(0,3);
       LCD_WriteText("V3=");
        LCD_GoTo(17,3);
        LCD_WriteText("rpm");
       
       
    while (1)
          {
        cnt1 = TIM_GetCapture1(TIM2);
        cnt2 = TIM_GetCapture1(TIM3);
       
        LCD_GoTo(3,1);
        sprintf(I, "%d", cnt1);
       LCD_WriteText((uint8_t*)I);
           
        LCD_GoTo(3,2);
        sprintf(I, "%d",cnt2);
       LCD_WriteText((uint8_t*)I);
       
        }

    }


    void RCC_Conf(void)

         ErrorStatus HSEStartUpStatus;

         // Reset ustawien RCC
         RCC_DeInit();



         // Wlacz HSE
         RCC_HSEConfig(RCC_HSE_ON);

         // Czekaj za HSE bedzie gotowy
         HSEStartUpStatus = RCC_WaitForHSEStartUp();

         if(HSEStartUpStatus == SUCCESS)
            {
           FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

           // zwloka dla pamieci Flash
           FLASH_SetLatency(FLASH_Latency_2);
        
             // HCLK = SYSCLK
           RCC_HCLKConfig(RCC_SYSCLK_Div1);
     
           // PCLK2 = HCLK
           RCC_PCLK2Config(RCC_HCLK_Div1);

           // PCLK1 = HCLK/4
           RCC_PCLK1Config(RCC_HCLK_Div2);

           // PLLCLK = 8MHz * 9 = 72 MHz
           RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

           // Wlacz PLL
           RCC_PLLCmd(ENABLE);

           // Czekaj az PLL poprawnie sie uruchomi
           while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

           // PLL bedzie zrodlem sygnalu zegarowego
           RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

           // Czekaj az PLL bedzie sygnalem zegarowym systemu
           while(RCC_GetSYSCLKSource() != 0x08);

            
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD |
                                   RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA, ENABLE);
           
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
         }
    }

    void GPIO_Conf(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_6 |GPIO_Pin_8;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOB, &GPIO_InitStructure);
    }

    void NVIC_Conf(void)
    {
     

       #ifdef  VECT_TAB_RAM 
            // Jezeli tablica wektorow w RAM, to ustaw jej adres na 0x20000000
            NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
       #else  // VECT_TAB_FLASH
            // W przeciwnym wypadku ustaw na 0x08000000
            NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
       #endif
     
    }

    #ifdef  DEBUG
    void assert_failed(uint8_t* file, uint32_t line)
    {
         while (1);
    }
    #endif
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się