stm32f4 pwm ölçme

Başlatan micelow, 03 Şubat 2014, 17:38:22

micelow

Merhabalar
stm32f4 kite dışarıdan pwm uygulayıp bu sinyaldeki değişimleri ölçmek istiyorum. Daha sonra ise eş zamanlı olarak bir grafik çizdircem. Forumda pwm input ile çalışmış bir kaç konu var ama sağlıklı nihayetlenmemiş sanırım. Datasheette pwm input için şöyle diyor "For example, you can measure the period (in TIMx_CCR1 register) and the duty cycle (in TIMx_CCR2 register) of the PWM applied on TI1 using the following procedure (depending on CK_INT frequency and prescaler value)" fakat input capture ile de uygulama yapılabilir mi?
"Bir tek şeye ihtiyacımız var çalışkan olmak."

selimkoc

Sinyalin doluluk oranını ölçmek istiyorsunuz anladığım kadarıyla. Register değerlerini değiştirerek bunu sağlayabilirsin.

PIC'te böyle bir uygulama yaptım. Gayet kararlı çalışıyor.

http://elektrokod.wordpress.com/2014/01/23/ultrasonik-mesafe-sensoru-uygulamasi-3/

STMde daha kararlı yapılabilir.

micelow

Hocam sinyaldeki değişiklikler için doluluk oranının değişimini mi takip etmeliyim grafik bu orana göre mi çizilmeli?
"Bir tek şeye ihtiyacımız var çalışkan olmak."

selimkoc

birim zamandaki değişiklik mi? Yoksa değişiklik olduğu zamanını kaydedilmesi şeklinde mi düşünüyorsunuz?

micelow

Selim hocam çıkışı pwm sinyal olan sensörü stm kite bağlıcam ve değişikliklerini eş zamanlı olarak görmek istiyorum inşallah olursa c# ta küçük bir arayüz ile bu değişikleri hemen grafikte göstermek istiyorum aynı ekg projeleri gibi anlık değişiklikler.
Şöyle bir örnek buldum
volatile int IC3ReadValue1 = 0;
volatile int IC3ReadValue2 = 0;
volatile int Capture = 0;
volatile int CaptureNumber = 0;
volatile int dataCaptureReady = 0;

void tim3ConfigRising()
{
    TIM_ICInitTypeDef timICStruct;
    timICStruct.TIM_Channel = TIM_Channel_2;
    timICStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
    timICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    timICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    timICStruct.TIM_ICFilter = 0x0;
    TIM_ICInit(TIM3, &timICStruct);
}

void tim3ConfigFalling()
{
    TIM_ICInitTypeDef timICStruct;

    timICStruct.TIM_Channel = TIM_Channel_2;
    timICStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
    timICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    timICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    timICStruct.TIM_ICFilter = 0x0;

    TIM_ICInit(TIM3, &timICStruct);

}

void initTimers()
{
	TIM_TimeBaseInitTypeDef base_timer;
	NVIC_InitTypeDef NVIC_InitStructure;
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
     TIM_TimeBaseStructInit(&base_timer);
     base_timer.TIM_Prescaler = SystemCoreClock / 1000 - 1;
     base_timer.TIM_Period = 2000;
     base_timer.TIM_ClockDivision = 0;
     base_timer.TIM_CounterMode = TIM_CounterMode_Up;
     TIM_TimeBaseInit(TIM3, &base_timer);
     tim3ConfigRising();
     // TIM enable counter
  	 TIM_Cmd(TIM3, ENABLE);
     // Enable the CC2 Interrupt Request
     TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);

     

     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
}

void initGpio()
{
	GPIO_InitTypeDef gpioStruct;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    gpioStruct.GPIO_Mode = GPIO_Mode_IN;
    gpioStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpioStruct.GPIO_Speed = GPIO_Speed_50MHz;
    gpioStruct.GPIO_Pin = GPIO_Pin_7;

    GPIO_Init(GPIOA, &gpioStruct);
}

int main(void)
{
		char buffer[20];
		int TIM3Freq;
    initGpio();
    initTimers();

    while(1)
    {
        if (dataCaptureReady)
        {
            /* Capture computation */
                if (IC3ReadValue2 > IC3ReadValue1)
                {
                Capture = (IC3ReadValue2 - IC3ReadValue1);
                }
                else
                {
                Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
                }
                /* Frequency computation */
                TIM3Freq = (uint32_t) SystemCoreClock / Capture;

            dataCaptureReady = 0;
            //
        }

    }

}


    void TIM3_IRQHandler()
    {

        if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
        {
            /* Clear TIM3 Capture compare interrupt pending bit */
            TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
            if(CaptureNumber == 0)
            {
                /* Get the Input Capture value */
                IC3ReadValue1 = TIM_GetCapture2(TIM3);
                CaptureNumber = 1;

                tim3ConfigFalling();

            }
            else if(CaptureNumber == 1)
            {
                /* Get the Input Capture value */
                IC3ReadValue2 = TIM_GetCapture2(TIM3);

                dataCaptureReady = 1;
                CaptureNumber = 0;

                tim3ConfigRising();

            }
        }
    }

main deki Capture değişkeninin tuttuğu değere göre grafik çizdirebilirim sanırım.
"Bir tek şeye ihtiyacımız var çalışkan olmak."

Klein

https://www.picproje.org/index.php/topic,49139.0.html

Örnek CM3 için. ancak CM4 ile çalışmaması için bir neden yok. en fazla bir iki register ve port aarları değişir.

micelow

Hocam konuyu incelemiştim fakat işlemcim f4 diye pek bakmamıştım. Gerekli değişiklikleri yaptım ancak
RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_Div2,RCC_CFGR_PLLMULL12);
fonksiyon satırında
error:  #20: identifier "RCC_CFGR_PLLSRC_HSI_Div2" is undefined
error:  #20: identifier "RCC_CFGR_PLLMULL12" is undefined
error:  #165: too few arguments in function call
şeklinde hata alıyorum
stm32f4xx.rcc kütüphanesinde bulunan fonksiyon ile parametreler tutmuyor.
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
"Bir tek şeye ihtiyacımız var çalışkan olmak."

Klein

Init_Clock()  fonksiyonunu tamamen kaldırabilirsiniz.  O kısım STM32F103 için internal clock ayarları.  Kullanmanıza gerek yok.

selmanguzel

Arkadaşlar Ben ARM ile SPWM üretmek istiyorum. Bu konuda ACİL..! yardıma ihtiyacım var. Mail Adresim: slmngzl@gmail.com