collapse

* Links de Robótica

* Posts Recentes

Palavras Cruzadas por Hugu
[Hoje às 00:54]


[Projecto] Bomba Airsoft por jm_araujo
[Ontem às 16:54]


Apresentação por Tech_JA
[Ontem às 09:19]


Medir Agua que está no Poço por filjoa
[21 de Setembro de 2017, 20:58]


URGENTE - display de 7 segmentos com backpack por helderjsd
[20 de Setembro de 2017, 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]

Autor Tópico: STM32 - Timers  (Lida 2460 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
STM32 - Timers
« em: 08 de Agosto de 2013, 15:35 »
Olá,
Alguem me sabe dizer para que serve este atributo da STD Library TIM_TimeBaseStructure.TIM_ClockDivision? Pelo nome diria que o Prescaler já faz o mesmo :s

   
Código: [Seleccione]
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 3;
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/1000 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: STM32 - Timers
« Responder #1 em: 08 de Agosto de 2013, 16:34 »
Estava aqui a brincar mais um bocadinho com os timers para perceber bem como funcionam e estou com um problema, por exemplo:

   
Código: [Seleccione]
//configure timer
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 150;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;//SystemCoreClock/1000 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

O TIM_Period está encarregue do ARR, com um PSC a 0 temos um clock a 24Mhz. Então
24Mhz/150/2(troco o estado do pino a cada interrupção) = 80khz o que bate certo com os resultados:



Se eu começar a baixa o valor do Period os resultados começam a sair errados, por exemplo, 24000000/140/2=85714khz:


Supostamente o contador pode ir de 0 a 2^16 mas deve haver algo que me está a escapar :s

O seguinte código trata da interrupção e depois alterar um pino em função disso.
Código: [Seleccione]
while(1){
        if(change){
            GPIO_WriteBit(GPIOC, GPIO_Pin_9, (ledval)? Bit_SET : Bit_RESET);
            ledval = 1 - ledval;
            change=0;
        }

    };

    return 0;
}

void TIM2_IRQHandler(void){

    change=1;

    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

StarRider

  • Visitante
Re: STM32 - Timers
« Responder #2 em: 08 de Agosto de 2013, 18:56 »
Olá,
Alguem me sabe dizer para que serve este atributo da STD Library TIM_TimeBaseStructure.TIM_ClockDivision? Pelo nome diria que o Prescaler já faz o mesmo :s

   
Código: [Seleccione]
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 3;
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/1000 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

Boas,

O campo "ClockDivision" corresponde ao valor dos bits CKD no CR1 (Control Register 1) do timer, e serve como divisor
entre o clock do timer (CK_INT) e o timer dos filtros digitais se os mesmos forem usados.

Geralmente o uso dos "filtros digitais" é aplicado quando o timer está em modo "Input capture" e existe ruído nas linhas
de entrada, como no caso de alguns encoders.

Abraços,
PA
« Última modificação: 08 de Agosto de 2013, 18:59 por StarRider »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: STM32 - Timers
« Responder #3 em: 08 de Agosto de 2013, 21:58 »
Olá,
Alguem me sabe dizer para que serve este atributo da STD Library TIM_TimeBaseStructure.TIM_ClockDivision? Pelo nome diria que o Prescaler já faz o mesmo :s

   
Código: [Seleccione]
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 3;
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/1000 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

Boas,

O campo "ClockDivision" corresponde ao valor dos bits CKD no CR1 (Control Register 1) do timer, e serve como divisor
entre o clock do timer (CK_INT) e o timer dos filtros digitais se os mesmos forem usados.

Geralmente o uso dos "filtros digitais" é aplicado quando o timer está em modo "Input capture" e existe ruído nas linhas
de entrada, como no caso de alguns encoders.

Abraços,
PA

Obrigado :)

Quanto à segunda questão percebes o que se está a passar?

StarRider

  • Visitante
Re: STM32 - Timers
« Responder #4 em: 09 de Agosto de 2013, 07:44 »
Boas,

Necessito ver qual o código de inicialização dos canais OC , de forma a saber se estão configurados como Timers, PWM, Togles, etc.


Abraços,
PA

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: STM32 - Timers
« Responder #5 em: 09 de Agosto de 2013, 10:59 »
Está aqui o codigo completo:
Código: [Seleccione]
#include <stm32f10x.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_tim.h>
#include <misc.h>

static __IO uint8_t ledval;
static __IO uint8_t change;

int main(void)
{
    ledval=0;
    change=0;
   
    GPIO_InitTypeDef  GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    //Configure Clocks
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    //Configure GPIO PC9
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    //configure NVIC
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    //configure timer
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 140-1;//SystemCoreClock/1000 - 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;//SystemCoreClock/1000 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    /* TIM2 TRGO selection */
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM2, ENABLE);
   
    while(1){
        if(change){
            GPIO_WriteBit(GPIOC, GPIO_Pin_9, (ledval)? Bit_SET : Bit_RESET);
            ledval = 1 - ledval;
            change=0;
        }

    };

    return 0;
}

void TIM2_IRQHandler(void){

    change=1;

    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}


#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
  while(1);
}
#endif

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: STM32 - Timers
« Responder #6 em: 28 de Agosto de 2013, 11:48 »
Provavelmente alguma limitação a nivel da utilização dos pinos como normais IOs?