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
Timer hızı = Bus hızı / (prescaler + 1)
Periyot = Timer hızı / (ARR +1)
Hocam formüldeki ARR nedir
C6603 cihazımdan Tapatalk kullanılarak gönderildi
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
Hocam 2 gündür uğraşıyorum timer2 50hz için bir örnek yapabilirmisiniz eksik yaptığım birşey var sanırım
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--)
{}
}
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);
}
}
İşlemci hızından emin misin ?
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
Period = 2000
Prescaler = 420
Denermisin.
denedim 1.59 hz çıkış alıyorum
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
Clock yapılandırma rutinin MCU'yu düşündüğün frekansda koşturuyormu?
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ü.
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.
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.)
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.