LusoRobótica - Robótica em Português
Sistemas específicos => ARM => Tópico iniciado 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
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);
-
Estava aqui a brincar mais um bocadinho com os timers para perceber bem como funcionam e estou com um problema, por exemplo:
//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.
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);
}
-
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
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
-
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
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?
-
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
-
Está aqui o codigo completo:
#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
-
Provavelmente alguma limitação a nivel da utilização dos pinos como normais IOs?