input capture

Başlatan muhittin_kaplan, 16 Eylül 2013, 18:26:23

muhittin_kaplan

Hocam Problemi Çözmeye Çalışıyorum. Bir türlü INPUT PWM uygulaması yapamadım. gerçi 30HZ ile 1KHZ  ve hatta 100khz de de denedim.

muhittin_kaplan

#46
Şüpheleniyordum, Kendisine ürettiriyordum pwm i, stm32f4disco ile üretince ölçü abi. garip ama debugda bile ölçüyor.
şimdi düşük freq ile deneyeceğim.

mesaj birleştirme:: 01 Ekim 2013, 20:37:15

200hz i denedim. ama ölçtüğüm deger devamlı 1180hz oldu. 24Mhz de

muhittin_kaplan

HC-SR04 sensörü ile o freq ulaşılamıyor dolayısıyla input pwm i kullanamayacağım.

önceki sorumu tekrar edeyim,
timer, exti ile tetiklenip durdurulabilir mi ?

Klein

Exti ile açıp kapatmaktan kasıt, kesme içinde kod işletmeden, doğrudn pin durumu ile açıp kapatmak sanırım. eğer öyle ise malesef öyle bir ağlantı görmedm datasheetlerde. 
Senin sorununa şöyle bir çözüm önerebilirim.
Timer darbe kaynağı olarak harici bir kaynak veya başka bir timer çıkışını seçersin. Böylece çok daha düşük frekanslara inebilirsin.

muhittin_kaplan

#49
Hocam Şöyle EXTI yi yükselen yada düşen kenar yapabiliyoruz EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
buradan yola çıkarak
Yükselen Kenarda Saymaya Başlayan Timer Düşen Kenarda Durursa Ben Duty i almış olurum.


mesaj birleştirme:: 02 Ekim 2013, 20:34:26

şurada ne yapmaya çalıştığını anlamadım.
https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/STM32Discovery/incrementation%20of%20a%20timer%20%20problem&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F&currentviews=296

Klein

#50
EXTI yükselen veya düşen kenar olarak ayarlanabiliyor. Ama EXTI ile doğrudan Timer tetikleyeceğin bir bağlantı ben görmedim. Exti ile kesmeye girip kendin aç kapat yapman gerek.
Diğer önerimi düşün bence.

Verdiğin örnek, TIMx_ETR pininden harici darbe ygulayarak, zamanlayıcıyı tetikleme üzerine.

muhittin_kaplan

hocam pire için (ultrasonic mesafe sensörü) yorgan yakmak istemiyorum. iki adet timer ı bu iş için heba etmek istemiyorum.
exti ile timer ı (gerekirse kod yazarak) başlatıp durduracağım, EXTI nin yükselen yada düşen kenar olduğunu anlayan bit var mı ? EXTI_IRQ da, kütüphanede böyle bir fonksiyon varmı ?

muhittin_kaplan

Şu Şekil Bir Kod Yazsam Yükselen ve düşen kenarı yakalayabilir miyim acaba ? okuyacağım Puls süresi min 150us. 

void EXTI0_IRQHandler(void)
{

    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {

    	if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){
    		GPIO_SetBits(GPIOC,GPIO_Pin_8);
    		GPIO_ResetBits(GPIOC,GPIO_Pin_9);
    	}
    	else {
    		GPIO_SetBits(GPIOC,GPIO_Pin_9);
    		GPIO_ResetBits(GPIOC,GPIO_Pin_8);
    	}
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

muhittin_kaplan


Klein

#54
Bu projede Timer'ler çok mu kıymetli? Eğer bu iş için 1 tane ekstra timer kullanırsan , başka işler için timer eksiğin mi kalıyor?

mesaj birleştirme:: 04 Ekim 2013, 15:55:22

Ayrıca, emin olmamakla birlikte , diğer Timer'lara giriş kaynağı olarak kullanacağın bu Timer aynı zamanda kesme de üretebilir. Yani başka işler için de kullanabilirsin aynı zamanda.

muhittin_kaplan

Projenin tam gereksinimini bilmiyorum. mümkün olan en az donanımla yapayım isteği var. 
eski Usul Döngü zamanını hesaplayarak ile yapsam mı :)
bana göndereceği sinyal min 150us, max 25ms.
buda 25ms boyunca cpu yu kitleyeceğim anlamına geliyor.
(gelinlik kızlara döndüm, ne kadar kararsızım)

Klein

Bence yan yollara sapma.
Sonradan çıkacak ihtiyacı o zaman düşünürsün.  Belki o sorunu çözmek bundan kolay olacak.

muhittin_kaplan

#57
onepulse un mantığı nedir hocam timer da.

mesaj birleştirme:: 04 Ekim 2013, 18:37:03

şöyle bir örnek var.
ama her seferinde tmer ı tekrar mı kurmak gerekiyor. basit bir PULS komutu yokmu kütüphanede.
void tim3ch3onePulse()
{

	/*Please set RCC before to 24mhz (or calculate new prescalers for your
	 * desired values)
	 * */
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	//set clock to TIM3
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

		//enable port B and alternate function
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE);

		GPIO_InitTypeDef GPIO_InitStructure;

		//init port B pin 0 = TIM3 channel 3 to alternate function push-pull

		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
			GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
			GPIO_Init(GPIOB, &GPIO_InitStructure);

			//timer basestructure 24mhz/(0+1)/(0+1) ~ 2,72mS (655353/24000000)s for full period
		 TIM_TimeBaseStructure.TIM_Prescaler = 0 ;
		TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
		 TIM_TimeBaseStructure.TIM_Period = 65535 ;
		TIM_TimeBaseStructure.TIM_ClockDivision = 0;
		 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


		 /* TIM3 PWM2 Mode configuration: Channel1 */
		 //for one pulse mode set PWM2, output enable, pulse (1/(t_wanted=TIM_period-TIM_Pulse)), set polarity high
		   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
		   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		   TIM_OCInitStructure.TIM_Pulse = 48000;
		   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

		   TIM_OC3Init(TIM3, &TIM_OCInitStructure);

		   TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

		   /* OPM Bit -> Only one pulse */
		   TIM3->CR1 |= (1 << 3);
		   /* TIM3 enable counter */
		   TIM_Cmd(TIM3, ENABLE);

Klein

#58
Timer'i yeniden kurmaktan kasıt tüm ayarları tekrar yapmak ise; hayır. Tüm ayarları yeniden yapmana gerek yok. Bir kez ayarlarsın. Timer'i başlatırsın, taşma olunca durur. Sen yeniden başlatırsın.

mesaj birleştirme:: 04 Ekim 2013, 19:22:34

Genel zamanlama için Tick Timer kullanmıyor musun? Muhtemelen kullanıyorsun.
Tick kesmesi içinde bir pini toggle yap. Bu pini de Input Capture için kullanacağın zamanlayıcının CLK girişine bağla. Hem ekstra timer harcamazsın, hem de oldukça düşük frekanslara inersin.

muhittin_kaplan

Çokmu soruyorum.
TIMx->CNT o anki sayıcı degerini veriyor. ben bunu nasıl 0 larım .