- UNI-T-Messgeraete    Werbung      
Ergebnis 1 bis 10 von 20

Thema: Timer als Counter zu konfigurieren

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    41
    Beiträge
    557
    Mit dem µC kenn ich mich leider nicht aus. Aber wie schon gesagt:

    Bei den meisten (allen?) AVRs gibt es ein Register für den Timer um diesen zu konfigurieren. Man hat die Wahl zwischen zwei "Zählweisen"

    1. Der Zähler zählt mit dem µC-Takt, evtl. verrechnet mit einem Presceler, hoch, der überwachte Pin für die zweite Zählgeschwindigkeit hat keinen Einfluss
    2. Der Zähler zählt bei jeder steigenden oder fallenden Flanke um jeweils 1 hoch, der µC-Takt hat keinen Einfluss auf die Zählgeschwindigkeit

    Ich schätze mal, so eine Einstellung dürfte es auch bei deinem µC geben.
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    @Arkon Er verwendet keinen AVR sondern einen ARM. Ds ist nicht die gleiche Technik.

    @kmrish: Leider kann ich dir ebenfalls nicht weiterhelfen da ich mit Atmegas/Attinys, also AVR, programmiere.

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2011
    Ort
    Hamburg
    Beiträge
    7
    Die Initialisierung des TIM1 bis TIM5 und TIM8 als Endcoder ( Endcoder-Mode ) ist relativ einfach. Im Kap. 14.3.12 Manual Rev. 11 steht da alles beschrieben.

    Hier ein Bsp. für TIM3:

    #define ENCODER_TIMER TIM3
    #define C_QA GPIO_Pin_6 //- Input Encoder A
    #define C_QB GPIO_Pin_7 //- Input Encoder B

    void EncoderTimerInit( void )
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;

    /* Timer configuration in Encoder mode */
    TIM_DeInit(ENCODER_TIMER);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

    TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);

    TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
    TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);

    //-
    TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12,
    TIM_ICPolarity_Falling, TIM_ICPolarity_Rising);


    // Clear all pending interrupts
    // TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    // TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);

    TIM_Cmd(ENCODER_TIMER, ENABLE);

    }

    void init_gpio( void )
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    //- andere Portpins für TIM3 ( GPIO 6 und GPIO 7 )
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

    GPIO_InitStructure.GPIO_Pin = C_QA | C_QB;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    }

    void main( void )
    {
    u16 wCounter =0;

    init_gpio( );
    EncoderTimerInit();

    //- Bsp. für das lesen des Encoder-Counter
    wCounter = ENCODER_TIMER->CNT;


    // etc.

    }

    Das sollte so funktionieren. Musst Du halt noch entsprechend erweitern oder abändern ( Timer und Ports z.B. )

    Gruss
    Steffen

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    da der Counter in beide Richtung zählen soll, soll als CounterMode das " TIM_CounterMode_CenterAligned3 " ausgewählt werden. stimmt??

    RM0008 steht seite 344 " the counter counts up and down (Center aligned mode 3, CMS ="11"). "

    wenn das richtig ist, soll ich TIM_TimeBaseStructure.TIM_CounterMode verwenden oder soll ich das da verwenden:
    void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)

    welche soll ich verwenden um den Counter-Mode einzustellen?

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    Kannst du ein Datenblatt posten nach deem du gehst. Dann könnte ich nachlesen.

    MfG Hannes

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Hallo Lieber 021aet04

    Ich danke dir viel mals für deine Bereitschaft mir zu helfen.
    Anbei sende ich dir das Referenz Manual (RM000 Bild  .

    Dieses Datenbaltt besteth aus 1072 Seiten, deswegen möchte ich dir erleichten, die entsprechende Seiten schnell zu finden.

    Encoder Inreface Mode findest du ab Seite 301
    Center-aligned mode (up/down counting) ab Seit 278
    SPI ab Seite 657 (meine Schaltung wird dabei als Slave-Device betrieben)

    Vielen Danke für deine Hilfe.
    LG
    Adam

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    So hat er bei mir functioniert mit ein qwadrature encoder !! Beide Eingangen mussen beschaltet sein, und in Fase versetzt. Dan zaehlt den counter hoch oder ab, abhangig welke Flanke erst kommt.
    Code:
     /**
      * @brief  Configures the TIMx Encoder Interface.
      * @param  TIMx: where x can be  1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
      * @param  TIM_EncoderMode: specifies the TIMx Encoder Mode.
      *   This parameter can be one of the following values:
      *     @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level.
      *     @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level.
      *     @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending
      *                                on the level of the other input.
      * @param  TIM_IC1Polarity: specifies the IC1 Polarity
      *   This parmeter can be one of the following values:
      *     @arg TIM_ICPolarity_Falling: IC Falling edge.
      *     @arg TIM_ICPolarity_Rising: IC Rising edge.
      * @param  TIM_IC2Polarity: specifies the IC2 Polarity
      *   This parmeter can be one of the following values:
      *     @arg TIM_ICPolarity_Falling: IC Falling edge.
      *     @arg TIM_ICPolarity_Rising: IC Rising edge.
      * @retval None
      */
    TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
    TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
      /* TIM enable counter */
      TIM_Cmd(TIM2, ENABLE);
      TIM_Cmd(TIM4, ENABLE);
      
       /* TIM2 + TIM4 clock enable */
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
       /* GPIOA, GPIOB and GPIOC clock enable */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                             RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
      
       //configure TIM2 CH0/CH1 = A0,A1 alternate function for encoder reading
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_15;
      GPIO_Init(GPIOA, &GPIO_InitStructure); 
      //configure TIM4 CH0/CH1 = B6,B7 alternate function for encoder reading
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 |GPIO_Pin_6 | GPIO_Pin_7;
      GPIO_Init(GPIOB, &GPIO_InitStructure); 
      
       static int16_t encoder1;
       static int16_t encoder2;
        encoder1=TIM2->CNT; //actuele waarde van encoder1
        encoder2=TIM4->CNT; //actuele waarde van encoder2

Ähnliche Themen

  1. Konfiguration: Timer als Counter gesucht
    Von robodriver im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 10.02.2008, 11:42
  2. Timer/Counter und PWM Channles
    Von ricola im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 04.07.2007, 19:48
  3. Timer/Counter
    Von Jon im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 17.05.2007, 18:43
  4. Attiny2313, Timer-Counter-Wie gehts?
    Von sebastian.fr im Forum AVR Hardwarethemen
    Antworten: 13
    Letzter Beitrag: 04.04.2006, 22:48
  5. Externer Timer/Counter um uC aufzuwecken
    Von Whassup im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 21.11.2005, 09:25

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      fchao-Sinus-Wechselrichter AliExpress