Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: görkem - 19 Nisan 2016, 23:52:41

Başlık: Stm32f4 disco timer hesabı
Gönderen: görkem - 19 Nisan 2016, 23:52:41
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

Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: Klein - 20 Nisan 2016, 02:26:43
Timer hızı  = Bus hızı / (prescaler + 1)
Periyot = Timer hızı / (ARR +1)
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 20 Nisan 2016, 13:11:40
Hocam formüldeki  ARR nedir

C6603 cihazımdan Tapatalk kullanılarak gönderildi

Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 20 Nisan 2016, 13:14:12
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

Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 21 Nisan 2016, 22:10:29
Hocam 2 gündür uğraşıyorum timer2 50hz için bir örnek yapabilirmisiniz eksik yaptığım birşey var sanırım
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: SysTick - 22 Nisan 2016, 10:06:33
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--)
{}
}

Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 22 Nisan 2016, 12:54:12
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);


}

}                         

Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: SysTick - 22 Nisan 2016, 14:59:07
İşlemci hızından emin misin ?
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 22 Nisan 2016, 17:11:23

ayarlarım aşağıdaki gibi


(http://s31.postimg.cc/k1jekoinr/frekans_de_eri.jpg) (http://postimg.cc/image/k1jekoinr/)

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

(http://s31.postimg.cc/7v78dkl13/50_hz.jpg) (http://postimg.cc/image/7v78dkl13/)


mikroelektronika nın timer programı var onunlada hesaplattığımda sorun aynı hatam nerde anlayamadım
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: mdargut - 22 Nisan 2016, 19:05:27
Period = 2000       
Prescaler = 420

Denermisin.
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 22 Nisan 2016, 19:20:30
denedim 1.59 hz çıkış alıyorum
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 22 Nisan 2016, 21:43:37
 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
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: z - 22 Nisan 2016, 21:45:18
Clock yapılandırma rutinin MCU'yu düşündüğün frekansda koşturuyormu?

Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: görkem - 22 Nisan 2016, 22:24:34
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ü.
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: __ozgur - 11 Kasım 2016, 14:56:46
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.
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: Cemre. - 11 Kasım 2016, 15:11:04
Alıntı yapılan: __ozgur - 11 Kasım 2016, 14:56:46
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.

Teorik olarak doğru ama pratikte hatanız var.

Prescaler tek başına frekans belirlemek için kullanılmaz. Aslında bu Timer biriminin sayması için gereken clock sinyalini bölme işlemine tabi tutmak için vardır.

Tam tersi Prescaler 1 alınıp Preload (ARR) değeri 44999 alınırsa 0'dan 44999'a kadar sayan bir sayıcınız olur ve bu sayma işlemi 500us'de (2kHz) tamamlanır.

Örneğin 12 bit çözünürlüklü PWM sinyali oluşturmak istiyorsunuz. Preload değeri 4096 olmalı. Bu durumda ters işlem yaparak Prescaler değeri 21972 olursa çok yaklaşık olarak 2kHz sinyali 4096 parçada elde etmiş oluruz.

Örnekler çoğaltılabilir.

(Hata yapmış olabilirim ancak genel mantık bu şekilde.)
Başlık: Ynt: Stm32f4 disco timer hesabı
Gönderen: __ozgur - 11 Kasım 2016, 15:16:15
Teşekkür ederim, 4 işlem yanlışı yapmışım sanırım :) 450-1 prescaler değeri ile osiloskopta 100 mikrosaniye saniye periyot boyunu gözlemleyebildim.