Stm32f4 disco timer hesabı

Başlatan görkem, 19 Nisan 2016, 23:52:41

görkem

Başlıktanda anlaşılacağı gibi Stm32f4 ün timer hesabı nasıl yapılır formülü nedir? keil ile programlıyorum prescaler ve periyot değerleri nasıl hesaplanıyor?

C6603 cihazımdan Tapatalk kullanılarak gönderildi


Klein

Timer hızı  = Bus hızı / (prescaler + 1)
Periyot = Timer hızı / (ARR +1)

görkem

Hocam formüldeki  ARR nedir

C6603 cihazımdan Tapatalk kullanılarak gönderildi


görkem

Alıntı yapılan: görkem - 20 Nisan 2016, 13:11:40
Hocam formüldeki  ARR nedir

C6603 cihazımdan Tapatalk kullanılarak gönderildi
Tmm hocam auto reloaded mış

C6603 cihazımdan Tapatalk kullanılarak gönderildi


görkem

#4
Hocam 2 gündür uğraşıyorum timer2 50hz için bir örnek yapabilirmisiniz eksik yaptığım birşey var sanırım

SysTick

Temel olarak bunları yapman gerekli

void PIN_config(void)
{
	GPIO_InitTypeDef gpio;

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);

	GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);

	gpio.GPIO_Mode = GPIO_Mode_AF;
	gpio.GPIO_OType = GPIO_OType_PP;
	gpio.GPIO_Pin = GPIO_Pin_6;
	gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
	gpio.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio);

	gpio.GPIO_Mode = GPIO_Mode_OUT;
	gpio.GPIO_OType = GPIO_OType_PP;
	gpio.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
	gpio.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &gpio);
}
void TIM_config(void)
{
	TIM_TimeBaseInitTypeDef timer;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  // kullanacağın timer ın clock aktiflerştirmesi

	timer.TIM_Prescaler = 0;                                                              //timer frekansı = MCU/(Prescaler + 1)
	timer.TIM_CounterMode = TIM_CounterMode_Up;                     // timer ın yukarı doğru(artırarak) sayacağını belirler 
	timer.TIM_Period = 4800;                                                             // Arr değeri
	timer.TIM_ClockDivision = TIM_CKD_DIV1;                               // timer clock 1/1 çalışacak
	timer.TIM_RepetitionCounter = 0;

	TIM_TimeBaseInit(TIM3, &timer);
	TIM_Cmd(TIM3, ENABLE);
}
void Pwm_config(void) // Pwm ayarları
{
	TIM_OCInitTypeDef pwm;

	pwm.TIM_OCMode = TIM_OCMode_PWM1;         
	pwm.TIM_OutputState = TIM_OutputState_Enable;
	pwm.TIM_OCPolarity = TIM_OCPolarity_Low;
	/*pwm doluluk formülü=((TIM_period+1)*dutyCycle)/100-1,örnek%50 için = */
	pwm.TIM_Pulse = 0;
	TIM_OC1Init(TIM3, &pwm);
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
}

int main(void)
{
        PIN_config();
	TIM_config();
	Pwm_config();

	int16_t pulse = 0;

	while(1)
	{
			/*TIM3->CCR1 = pulse;  // duty cycle'ı böyle değiştirebilirsin yani */

		for (pulse = 0; pulse < 4800; pulse++)
		{
			TIM3->CCR1 = pulse;
			delay(1);
		}
		for (pulse = 4800; pulse > 0; pulse--)
		{
			TIM3->CCR1 = pulse;
			delay(1);
		}


	}
}
void delay(__IO uint32_t num)
{
	__IO uint32_t icindeki=0;
	for(icindeki = (7200*num) ;icindeki! = 0;icindeki--)
	{}
}

görkem

#6
50hz lik bir frekans oluşturup led yakıp söndürmeyi deniyorum nvic ile yapıyorum pwm modülü olarak değilde timer2 ile  direk yapmaya çalışıyorum timer2 frekansım 42 MHz.Sıkıntım prescaler ve period hesabında hesaplıyorum 15hz bir frekans oluşuyor  50hz oluşması gerekirken kodum aşağıda



#include "stm32f4xx.h"                  // Device header


uint32_t Period = 1000;        
uint16_t Prescaler = 1440;   

 
int main(void)
{
	GPIO_InitTypeDef           GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
	NVIC_InitTypeDef           NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOD,&GPIO_InitStructure);
	
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	 
	TIM_TimeBaseStructure.TIM_Prescaler         =Prescaler-1;         
	TIM_TimeBaseStructure.TIM_CounterMode       =TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_Period            =Period-1;
	TIM_TimeBaseStructure.TIM_ClockDivision     =0; 
	TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
	TIM_Cmd(TIM2,ENABLE);
	
	
	
	NVIC_InitStructure.NVIC_IRQChannel                    =TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  =0x00;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority         =0x00;
	NVIC_InitStructure.NVIC_IRQChannelCmd                 =ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	

	while(1)
	{
		
		
		
	}
	
	
	
	
}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
	{
		
		
		
		//kesme de yapılacak islem
		
		GPIO_ToggleBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_2);
		//
		
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
		
		
	}
	
}                         


SysTick

İşlemci hızından emin misin ?

görkem


ayarlarım aşağıdaki gibi




çıkan frekansın lojik analizördeki değeri




mikroelektronika nın timer programı var onunlada hesaplattığımda sorun aynı hatam nerde anlayamadım

mdargut

Period = 2000       
Prescaler = 420

Denermisin.

görkem

denedim 1.59 hz çıkış alıyorum

görkem

 yaptığım hatanın nerde olduğunu bulamıyorum kafayı yedim açıkcası bu kadar basit bişey yüzünden,yardımcı olabilirseniz sevinirim

z

Clock yapılandırma rutinin MCU'yu düşündüğün frekansda koşturuyormu?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

görkem

#13
Yapılandırma ayarlarım doğru hocam 8 mhz hse ile 168 mhz e ayarlı fotosunuda yüklemiştim , fakat mcu ölçebileceğim kadar hızlı bir cihazım yok.birde mikroc ile programladığımda normal koşturuyordu  168 mhzde, keil ile programladığımda 8 mhz hse ile 168 mhz timer2 42mhz ile çalışıyor fakat prescaler ve period değerlerinin neye göre hesaplandığını anlayamadım

mesaj birleştirme:: 22 Nisan 2016, 23:21:59



not:
hocam tamamdır st nin yayınlamış olduğu osilatör ayarları nın yapıldığı exel dosyasından c.dosyası üretip kopyalayınca oldu. Dediğiniz çıktı ben çok eminken frekans ayarlarından yanlışmış, doğruda ayarlamıştım fakat keilde frekans ayarları bu şekilde daha net oluyormuş sorun çözüldü.

__ozgur

Benimde ufak bir sorum olacak konuda,

stm32f429 sistem hızı 180 Mhz. Timer 4 için bu durumda 90 Mhz çıkış alıyoruz. Cubemx kullanıyorum bu durumda Prescaler 45000-1 ayarlarsam 2Khz elde ediyorum doğru mudur? 10Khz ayarlamak için nasıl bir değişiklik yapmalıyım? Cubemx prescaler ayarları için max 65535 değeri alabiliyor.