STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

muhittin_kaplan

@cooldoubtless
ESC sürmeye mi çalışıyorsun ?
Pwm sinyalin 50 hz olması gerek. Başlangıçta Dutylerin 1ms olması gerek (olmazsa escler Ayar moduna girer.)
Esc Sürmek İçin Bu işlemci birkaç boy büyük kaçar.
Sana Tavsiyem Önce bir Servo tester yap.

cooldoubtless

#1036
amaç bir motor sürmek değil tabiki..quadrotor projesinde kullanacağım..elbette ilk adım bir motoru sürebilmek..sonra sensörlerden veri alıp ona göre motorları sürmeye çaıştırmayı başarmak istiyorum..hedeflerim bunlar en azından..daha ilk adımdayım ve de çakıldım..servo tester dan kasıt nedir?

mesaj birleştirme:: 01 Eylül 2012, 22:15:08

gördüm hocam güzel bişeymiş evet sorun programda mı motordamı anlamak için gayet mantıklı bir çözüm..hemen ediniyorum ama yine de programımın yeterli olduğunu düşünmüyorum..

muhittin_kaplan

#1037
Hocam Satın Almayın. Siz Yapın ki Hem RC servo hem ESC Nasıl Kullanılır Çözebilelim. Bu arada PWM de aradan çıkmış olur.

mesaj birleştirme:: 01 Eylül 2012, 23:27:04

Aslında Konu ile ilgili olarak
hobbyrc.com u ziyaret etseniz ve biraz karıştırsanız RC ile alakalı epeyce bilgi bulabilirsiniz.

mesaj birleştirme:: 02 Eylül 2012, 00:05:14

http://www.fatihinanc.com/diger/stm32f4-discovery-gelistirme-kiti-incelemesi/

cooldoubtless

#1038
hocam ben mesela kendimce bir program yazmaya çalıştım..saçma sapan oldu belki ama register ile kitin her hangi bir pininden %20 lik %30 luk her neyse tek kanal bir pwm sinyali çıkaracak bir program yazmak yazabilmek amaç..

Klein

#1039
Alıntı yapılan: cooldoubtless - 01 Eylül 2012, 23:30:05
hocam ben mesela kendimce bir program yazmaya çalıştım..saçma sapan oldu belki ama register ile kitin her hangi bir pininden %20 lik %30 luk her neyse tek kanal bir pwm sinyali çıkaracak bir program yazmak yazabilmek amaç..baktım forumumuzda da bu yok..başka forumlarda zaten hiç yok..keşke bunu yapabilsem ya da uğraşan biri olsa çok iyi olurdu..

mesaj birleştirme:: 02 Eylül 2012, 02:01:06


Ararsan forumda her şey var.
https://www.picproje.org/index.php/topic,37420.0.html
https://www.picproje.org/index.php/topic,37447.0.html

cooldoubtless

@klein hocam teşekkür ederim..forumda emin olun pek çok kişinin vakit geçirdiği zamanların toplamından daha fazla bulunuyorum..sizin verdiğiniz linkler yer imlerimdeydi zaten..bana attığınız özel mesajda da bunlardan bahsetmiştiniz..ben c++ hakkında bir şey bilmiyorum..timer init uygulamalarında ise ben sadece register olayından anladığım için bu garip garip cmsis fonksiyonları bana birşey anlatmadı ve gözümü korkuttu ancak sonra yine sizin register-cmsis dönüşümü yaptığınız uygulamalarla bu eksiğimi giderdim..yani şu anda böle bir sorunum yok ama tabiki yer imlerinde kalmış oldu ne yazıkki..tekrar hatırlattığınız için teşekkür ederim..en kısa zamanda deneyip bilgi vericem burada..

cooldoubtless

#1041
denedim arkadaşlar..olmadı ne yazık ki..yazdığım programı ekliyorum içine delay de ekledim ancak yine tepki yok..50hz lik sinyal istediğimden clock ayarlamaları biraz kafa karıştırdı..bu programla (stm nin kendi örnek kütüphane kodlarıyla) çalıştırmayı beceremedim..4 kanallı bir uygulamaydı ben timer ayarlamalarını fln ona göre yaptım ama sadece birinci kanalın ccr1 değerini girdim çünkü amacım sadece motoru döndürebilmek..daha sonra o kanalları da kullanırım..elinde bir esc motor olan biri bu uygulamayı yapıp da bir sonuç aldıysa lütfen bana nerede hata yaptığımı söyleyebilir mi?
#include "STM32F4xx.h"
#define SysClock 168.0L  //Sistem 168 Mhz de çalışıyor
#define DELAY_uS(A)  _usDelay(((long double) A * ((long double) SysClock)-5.50L) / 21.50L)
void TIM_Config(void);

void SystemInit()
{
	unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim

    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle

    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 

}

void _usDelay(long double Count)
{
  u32 i=0;
 for(i=0;i< (unsigned long)Count;i++);
}



int main(void)
{
    TIM_Config();	
	
    GPIOC->ODR|=0x00C0 ;	
	  GPIOB->ODR|=0x0003 ;
	  
	  DELAY_uS(900);
	
	  GPIOC->ODR|=0x0000 ;	
	  GPIOB->ODR|=0x0000 ;
	
	  DELAY_uS(20000);
	
	  


	
    
    TIM3->CR1=0x0080;             // Otomatik Reload,4.bit 0 old için up counter modunda sayar
    TIM3->PSC=23999  ;             // TIM3_giris=84MHZ,TIM3_çikis=50HZ İÇİN PSC=24000-1 yapip arr yi 700 yapmak zorundaym  
	  TIM3->ARR=700 ;                // böylece periyot 20ms oldu..
	  TIM3->CCR1=350 ;                // Duty Cycle orani %50 oldu
	  TIM3->CCER|=0x0001 ;            // Polarity High yaptik..
	  TIM3->CR1|=0x0001 ;             // TIM3 çalismaya baslasin
	
	while(1)
	{}
	
}

void TIM_Config(void)
{
	RCC->APB1ENR|=0x00000002 ;      // Timer3 CLK'u aktif edelim (84 Mhz)
	RCC->AHB1ENR|=0x00000006 ;      // GPIOC ve GPIOB clocklari devrede
	
/* GPIOC Configuration: TIM3 CH1 (PC6) and TIM3 CH2 (PC7) */
	  GPIOC->MODER|=0x0000A000  ;     // Alternatif fonk secimi
    GPIOC->OSPEEDR|=0xFFFFFFFF ;
    GPIOC->OTYPER|=0x00000000 ;     // Push Pull s.148
    GPIOC->PUPDR|=0x00005000  ;      //  s. 149
	 

/* GPIOB Configuration:  TIM3 CH3 (PB0) and TIM3 CH4 (PB1) */	
    GPIOB->MODER|=0x0000000A  ;
	  GPIOB->OSPEEDR|=0xFFFFFFFF ;
	  GPIOB->OTYPER|=0x00000000 ;
	  GPIOB->PUPDR|=0x00000005 ;
    
	
/* Connect TIM3 pins to AF2 */
    GPIOC->AFR[1]|=0x20000000 ;     // C7.biti AF2 ile bağladık 	
	  GPIOC->AFR[1]|=0x02000000 ;     // C6.biti AF2 ile bağladık
	  GPIOB->AFR[1]|=0x00000002 ;     // B0.biti AF2 ile bağladık
		GPIOB->AFR[1]|=0x00000020 ;     // B1.biti AF2 ile bağladık
}



eğer direk kodların orjinalini çalıştırırsam(yani TIM_PWM_Output örnek projesinden bahsediyorum) şu aşağıdaki hatayı alıyorum..
Build target 'TIM_PWM_Output'

compiling main.c...

..\main.c(24): error:  #5: cannot open source 
input file "stm32f4_discovery.h": No such file or directory 
compiling
 stm32f4xx_it.c...


..\stm32f4xx_conf.h(34): error:  #5: cannot open source input
 file "stm32f4xx_adc.h": No such file or directory
 
compiling system_stm32f4xx.c...


..\stm32f4xx_conf.h(34): error:  #5: cannot open
 source input file "stm32f4xx_adc.h": No such file or directory 
compiling stm32f4_discovery.c...


stm32f4_discovery.c: Error:  #5: cannot open source input file "..\..\..\..\Utilities\STM32F4-Discovery
\stm32f4_discovery.c": No such file or directory 
Target not created

muuzoo

TIM10 kullanarak yaptığım pwm örneğini ve hesaplamalarini anlattığım şu yazıyı bir inceleyin isterseniz. https://www.picproje.org/index.php?topic=41911.0
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

fatih6761

Frekansların Max kullanılması sıkıntı yaratıyor olabilir. Denetleyiciyi yine HSE moduna geçirin ama PLL kullanmayın, sistemi 8 MHz ile besleyip ona göre tekrar ayar yapın. Belkide bölücüler çok büyüktür...

muhittin_kaplan


fatih6761

SystemInit fonksiyonunda HSE moduna alınıp PLL ayarlanıyor. Clock Source ayarlanıp sistem 168 MHz ile besleniyor. PLL yi hiç bulaştırmayın. Sistemi direkt HSE yani 8 MHz ile besleyin. Timer ön bölücülerini vs. tekrar hesaplayıp yazın. 50Hz pwm üretmek için 168 MHz hem fazla büyük hemde fazla güç harcar...

cooldoubtless

#1046
tmm belki güç harcar ama sorun olur mu ki olcağını hiç düşünmemiştim..direk hse ile de denerim olmadı dediğiniz gibi..muuzoo hocam bu örneği inceledim zaten ama 32khz değer..50 hz e düşürmek zaten sıkıntı oluyor..çünkü osiloskop da yok ancak motor dönerse çalıştığını anlayabilirim..bu durumda 50 hz e ayarlamam gerekiyor neyazık ki...

mesaj birleştirme:: 04 Eylül 2012, 22:02:50

bir de pll ile 50 hz e inemedim..o yüzden timer ın periyodunu büyüterek 50 hz e ulaşmaya çalıştım..sizce yanlış mı yaptım acaba? ???

ergen

Burdaki bütün konuları okudum şuan kitimle uygulamalar yapmaya başladım.aklıma bişey takıldı  register a bazen burdaki gibi
RCC->CR |= 0x01000000;

maskeleme ile yazıyoruz; bazen de harhangi bir işleme tabi tutmadan ( &,| gibi operatörler kullanmadan )
FLASH->ACR = 0x00000605;

direk yazıyoruz(gerçi burdaki atama da maskeleme oluyormu bilmiyorum).Bu ikisi arasında ne fark var herikisi de ilgili register a verilen değerleri atamıyormu zaten.Fark var diyelim peki nerden bilcez hangisini ne zman kullancağımızı?

muuzoo

Alıntı yapılan: ergen - 05 Eylül 2012, 22:04:31
Burdaki bütün konuları okudum şuan kitimle uygulamalar yapmaya başladım.aklıma bişey takıldı  register a bazen burdaki gibi
RCC->CR |= 0x01000000;

maskeleme ile yazıyoruz; bazen de harhangi bir işleme tabi tutmadan ( &,| gibi operatörler kullanmadan )
FLASH->ACR = 0x00000605;

direk yazıyoruz(gerçi burdaki atama da maskeleme oluyormu bilmiyorum).Bu ikisi arasında ne fark var herikisi de ilgili register a verilen değerleri atamıyormu zaten.Fark var diyelim peki nerden bilcez hangisini ne zman kullancağımızı?

İlk atamada sadece ilgili saklayıcıdaki istediğiniz biti değiştirmiş oluyorsunuz. Diyelim ki CR saklayıcısının içeriği : 0x00000011 olsun. Siz ilk kullanımdaki gibi veya operatörü ile atama yaparsanız saklayıcının içeriği : 0x01000011 olacaktır. Fakat ikinci kullanımdaki gibi atama yaparsanız önceki değerler değişecek ve son atadığınız değer olacaktır. Peki neden böyle kullanıyoruz? Eğer ilgili saklayıcının içeriğinin tamamını değil de sadece belli bir kısmını değiştirmek istiyorsak bu şekilde çeşitli operatörler kullanrak atama yaparız. Yok değeri olduğu gibi yazacaksak ikinci şekli kullanırız.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

cooldoubtless

kendi adıma ilginç bir şey paylaşmak istiyorum..size de paylaştığım pwm programını karta attığımda (ya da herhangi bir program attığımda) sonra pinlerin gerilimlerini ölçtüğümde pc10, pd5, pb4, pb6, pa15, pe3, pb9, pa9 uçlarından 2.5 V gibi bir değer ölçüyorum.....pa9 pininden de 0.4  V ölçüyorum..bir çoğu serbest I/O pini olmasına rağmen(ve benim programımda bunlara bir değer atamamama rağmen) nasıl olur da bu derece yüksek gerilime sahip olabiliyorlar?