LusoRobótica - Robótica em Português

Sistemas específicos => ARM => Tópico iniciado por: metRo_ em 08 de Agosto de 2013, 15:35

Título: STM32 - Timers
Enviado por: metRo_ 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);
Título: Re: STM32 - Timers
Enviado por: metRo_ 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:
(https://lusorobotica.com/index.php?action=dlattach;topic=6602.0;attach=2222;image)


Se eu começar a baixa o valor do Period os resultados começam a sair errados, por exemplo, 24000000/140/2=85714khz:
(https://lusorobotica.com/index.php?action=dlattach;topic=6602.0;attach=2224;image)

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);
}
Título: Re: STM32 - Timers
Enviado por: StarRider 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
Título: Re: STM32 - Timers
Enviado por: metRo_ 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?
Título: Re: STM32 - Timers
Enviado por: StarRider 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
Título: Re: STM32 - Timers
Enviado por: metRo_ 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
Título: Re: STM32 - Timers
Enviado por: metRo_ em 28 de Agosto de 2013, 11:48
Provavelmente alguma limitação a nivel da utilização dos pinos como normais IOs?