Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: micelow - 03 Şubat 2014, 17:38:22

Başlık: stm32f4 pwm ölçme
Gönderen: micelow - 03 Şubat 2014, 17:38:22
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?
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: selimkoc - 03 Şubat 2014, 19:30:59
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/ (http://elektrokod.wordpress.com/2014/01/23/ultrasonik-mesafe-sensoru-uygulamasi-3/)

STMde daha kararlı yapılabilir.
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: micelow - 04 Şubat 2014, 11:03:09
Hocam sinyaldeki değişiklikler için doluluk oranının değişimini mi takip etmeliyim grafik bu orana göre mi çizilmeli?
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: selimkoc - 04 Şubat 2014, 11:15:21
birim zamandaki değişiklik mi? Yoksa değişiklik olduğu zamanını kaydedilmesi şeklinde mi düşünüyorsunuz?
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: micelow - 04 Şubat 2014, 12:10:40
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.
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: Klein - 04 Şubat 2014, 13:08:55
https://www.picproje.org/index.php/topic,49139.0.html (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.
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: micelow - 04 Şubat 2014, 13:51:45
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)
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: Klein - 04 Şubat 2014, 15:04:05
Init_Clock()  fonksiyonunu tamamen kaldırabilirsiniz.  O kısım STM32F103 için internal clock ayarları.  Kullanmanıza gerek yok.
Başlık: Ynt: stm32f4 pwm ölçme
Gönderen: selmanguzel - 07 Nisan 2014, 16:07:49
Arkadaşlar Ben ARM ile SPWM üretmek istiyorum. Bu konuda ACİL..! yardıma ihtiyacım var. Mail Adresim: slmngzl@gmail.com