STM32F10X Çalışmalarım

Başlatan Mucit23, 12 Mart 2012, 11:17:48

Icarus

#180
200MHz Scope, 300Mhz X10 Probe
Not: overshot ve ringing'in nedeni biraz uzun bıraktığım ground kablosu



Mucit23

Merhaba arkadaşlar.

P10 paneller ile uğraşırken ekran parlaklığını ayarlamak için display enable sinyalini 10khz pwm sinyali ile module edip öyle kullanıyordum.  Bunu pic ile yapabilmek için enable sinyali ve pwm sinyalini ve kapısıyla üst üste bindirip display'e gönderiyorum.

Aynı işlemi stm32de harici kapı kullanmadan direk donanımsal olarak yapabilirmiyim. Pwm sinyali zaten alabiliyorum. Şimdi istedigim zaman çok hızlı bir şekilde bu sinyali açıp kapamam lazım. Bu nasıl olur?

Mucit23

DGS araya girince unuttum.

Bir örnekte gördüm. PWM sinyalini açıp kapamak için ilgili pini giriş yapıyordu. Tekrar açmak içinse Çıkış yapıyordu.

Benim gerektiğinde 10uS Hatta daha kısa aralıklarla açıp kapamam gerekecek. Bu mantığı uygulayabilirmiyim?

camby

Hocam tam anlamamis olabilirim ama pwm i acip kapatmaya mi calisiyorsun?  Bunun icin pwm in timer ini durdurabilirsin

Mucit23


gif upload

Bana böyle bir sinyal lazım. Normalde Pic ile Bu sinyali alabilmek için Sabit 10Khz pwm sinyali ile jojik durumunu açıp kapayabileceğim başka bir bini 7408 VE kapı sı ile birleştirip kullanıyordum. Şimdi VE kapısı kullanmayayım diyorum.

Sizin dediğinizide bir deniyeyim. PWM frekansını 10Khz ye ayarlayıp Timeri veya RCC den Timerin Clock Kaynağını kapatıp açayım.

camby

Hocam rcc den kapamana gerek yok. Sadece start stop yapsan yeterli. Bu start stop islemini istersen baska bir timerin kesmesinde kodla kendin yapabilirsin.

Hatta timerlari master slave calistirma imkanimiz var.

Tabi uygulamanizda start stop yapmak daha pratik olur.

Mucit23

@camby,

Hocam Timeri durdurmak işe çözüm olmadı. Yaptığım işlem çalışıyor fakat kontrolsüz bir şekilde açma kapama işlemi gerçekleşiyor.

Ben PWMi kapattığım zaman çıkışın lojik0 da kalmasını istiyorum ama gerçekte öyle olmuyor. Ben Timeri Durdurduğum zaman, O anda Gpio Çıkışı hangi konumdaysa orda kalıyor. Bu olmaması gerekir.

Aldığım sonuç böyle.

resİm yÜkleme

ErsinErce


Mucit23

Ersin Hocam Teşekkür ederim.

Referance Manual'in 340. sayfasında Output State ile ilgili birçok bilgi var. Std_Lib'de Timer Output State ile ilgili bazı tanımlamalar yapılmış. Ama bu iş içinmi emin değilim. Tam olarak ne yapmam gerekiyor?

Bir Sorum daha olacak.

STM32 de bir donanımı ilgili pinlere nasıl yönlendiriyoruz. Örnek vermek gerekirse, Şuanda istediğim PWM sinyalini Tim4'ün 2. Kanalından alıyorum (PB7). Bu pinde Ayrıca I2C donanımı var. I2C lazım olursa engel olabilir diye Tim4 ün 3. Kanalından(PB8) veya  4. Kanaldan alayım. (PB9)

PWM i Ayarlamak için aşağıdaki kodları kullanıyorum.

TIM_OCInitTypeDef  TIM_OCInitStructure;

void PWM_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	/* TIM4 clock enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE );
	
	/* GPIOB Configuration:TIM4 Channel 2 as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	 // PB7
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	/* Time base configuration */
	/* PWM frequency = 72MHz / [Period*(Prescaler+1)]  */

	TIM_TimeBaseStructure.TIM_Period = 999;	  
 	TIM_TimeBaseStructure.TIM_Prescaler = 35;
 	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	

	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

	/* PWM1 Mode configuration: Channel2 */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

	
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 500;	//CCR2 Value;	 duty cycle =  CCR/Period
 	TIM_OC2Init(TIM4, &TIM_OCInitStructure);

 	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM4, ENABLE);
	/* TIM4 enable counter */
	TIM_Cmd(TIM4, ENABLE);

}


Burada kodları incelediğimde İlk Önce GPIO'un Timer4 Kanal2 ye denk gelen pini(PB7) AF_PP moduna sokuluyor. Bunun dışında PWM sinyalinin PB7 den çıkmasını sağlayacak Herhangi bir Yönlendirme göremiyorum.

Bu durumda Ben GPIO_Pin7 Yerine Pin8 için aynı işlemi yaptığımda PWM sinyali 8. Pinden çıkmıyor. Bu durumda Başka bir yerden yönlendirme yapıldığını düşünüyorum ama bulamıyorum.

ARM uğraşırken Bu çok fazla karşıma çıkıyor. Sadece pwm için değil bu başka bir donanımda olabilir.

Bu konuyu açıklarsanız gerçekten sevinirim. Özellikle bunu öğrenmem lazım.

blacklogic

Alıntı yapılan: Mucit23 - 04 Ağustos 2013, 13:59:03

gif upload

Bana böyle bir sinyal lazım. Normalde Pic ile Bu sinyali alabilmek için Sabit 10Khz pwm sinyali ile jojik durumunu açıp kapayabileceğim başka bir bini 7408 VE kapı sı ile birleştirip kullanıyordum. Şimdi VE kapısı kullanmayayım diyorum.

Sizin dediğinizide bir deniyeyim. PWM frekansını 10Khz ye ayarlayıp Timeri veya RCC den Timerin Clock Kaynağını kapatıp açayım.
Pic ile bu sinyali pic dışında herhangi bir şey kullanmadan elde etmek gayet kolay. Microchip motor control ve power control pwm diye iki uygulama yerleştirdi chiplerine.

camby

Alıntı yapılan: blacklogic - 04 Ağustos 2013, 19:37:38
Pic ile bu sinyali pic dışında herhangi bir şey kullanmadan elde etmek gayet kolay. Microchip motor control ve power control pwm diye iki uygulama yerleştirdi chiplerine.
picte nasil oluyor bu is peki ?

kantirici

Pwm kapatıldıktan sonra lojik durumu o yapmak için ilgili pin registerden 0 çeksen olmuyormu?

camby

@mucit hocam,

evet öyle bir durum var,

Timer'ı kapattıktan sonra pin'i 0'a çekmeniz gerekli.

Yada timer'ı hiç kapatmayın sürekli olarak açık kalsın , kapatmak yada açmak istediğinizi sırada pinin durumunu AF modundan normale geçirip logic 0 yapın , açmak istediğiniz sırada da tekrar AF moduna döndürün.

ErsinErce

#193
TIM_CCxCmd(TIM4, TIM_Channel_2, TIM_CCxN_Enable);
TIM_CCxCmd(TIM4, TIM_Channel_2, TIM_CCxN_Disable);


komutları direk istediğinizi yapar,

diğer sorunuz için aynı pdf 154. ve 174. sayfasını inceleyin remapping olarak geçiyor.
stm32f4xx_tim.c yi incelerseniz detaylara ulaşmış olursunuz.

Mucit23

Teşekkür ederim Arkadaşlar bakayım