NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2176 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 3 از 3

موضوع: مشکل در ایجاد تاخیر 1 ثانیه با stm32f103 و کلاک 72mhz

  1. #1
    تازه وارد
    تاریخ عضویت
    Apr 2018
    نوشته ها
    1
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض مشکل در ایجاد تاخیر 1 ثانیه با stm32f103 و کلاک 72mhz

    لطفا یک راهنمایی در مورد فرمول ایجاد تاخیر در کیل بهم بدین.
    این عدد تو حلقه for چه طوری محاسبه میشه.
    راه حل بهتری هم هست

    کد:
        while (1)
          {
          GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);
                GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_RESET);
              
    
      for (i = 0; i < 2200000; i++);
           
    
    GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);
          GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);
              
    
    
      for (i = 0; i < 2200000; i++);
    
          }
    }
    ویرایش توسط mzarkoob : 04-05-2018 در ساعت 13:21

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    عضو جدید
    تاریخ عضویت
    Aug 2016
    نام
    موسی مختاری
    نوشته ها
    17
    تشکر
    8
    تشکر شده 4 بار در 3 پست

    پیش فرض

    } (void _delay_ms(uint16_t ms
    ;uint32_t j=0
    ;j = ms * 14400
    ;( --while( j
    {
    سلام این تابع برای فرکانس 72 مگا هرتز استفاده میشه چک کنید که تقریبش خوب هست یا نه؟ فرمولش هم اینطوره که برای ایجاد یک ثانیه احتیاج به 72000000 کلاک (72 MHz) دارید و از اونجا که هر بار اجرای حلقه while احتیاج به 5 کلاک دارد پس برای ایجاد یک ثانیه حلقه while باید (72000000/5) = 14400000 اجرا شود و اگر بخواهیم تاخیر میلی ثانیه ای ایجاد کنیم احتیاج به یک هزارم این مقدار داریم یعنی (14400000/1000) = 14400 بار اجرای حلقه while. امیدوارم منظورم رو رسونده باشم.
    ویرایش توسط mm_g10 : 04-05-2018 در ساعت 17:02

  4. تشکرها از این نوشته :


  5. #3
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    سلام
    برای تاخیر دقیق از systemtick می توانید استفاده کنید :
    شرح رجیسترهای systemtick
    شرح مثال systemtick - 1

    ------------------------------------------------------
    در برنامه نویسی لازم است در مواقعی از تابع تاخیر استفاده شود. مثلا بین هر ارسال در ال سی دی کاراکتری یا ارسال روی ماژول sim900 و زیروال وقفه و ... (هر چند این موارد می تواند بدون تاخیر delay هم انجام داد) این delay میتواند یک تاخیر دقیق یا تخمینی (تاخیر کیلویی !) باشد. حال در نظر بگیرید برنامه را به میکروی دیگری با سرعت بیشتر یا کمتر منتقل کرده اید. طبیعتا تاخیر کیلویی متناسب با سرعت آن پردازنده عمل می کند و این ممکن است کار را خراب کند. استفاده از تاخیر دقیق با systemtick

    باعت می شود با تنظیم کلاک در ابتدا زمان تاخیر تغییر نکند.

    -----------------------------
    نحوه استفاده از تاخیر delay با استفاده از systemtick بدین صورت می باشد :
    کد:
    void SysTick_Handler (void)
    {
    SysTickCnt++;
    }
    /***************************/
    void Delay (unsigned long tick)
    {
    unsigned long systickcnt;
    systickcnt = SysTickCnt;
    while ((SysTickCnt – systickcnt) < tick);
    }
    /*———————————–*/
    /*———————————–*/
    int main(void)
    {
    SysTick_Config(SystemFrequency/1000 – 1);
    while (1)
    {
    //……
    printf(“www.arm-education.ir”);
    Delay (1000);
    }
    }
    -----------------------------
    تاخیر تخمینی که با تغییر عدد در حلقه for زمان تاخیر را می توان تغییر داد ،می تواند بدین صورت باشد:
    کد:
    void delay_ms (uint32_t Time)
    {
        uint32_t i;
       
        i = 0;
        while (Time--) {
            for (i = 0; i < 16666; i++);
        }
    }
    عدد 16666 برای کلاک 100 مگاهرتز زمان حدود یک میلی ثانیه را تاخیر ایجاد خواهد کرد. با یک تایمر می توان این عدد را دقیق انتخاب کرد
    این مدل تاخیر باعث اتلاف زمان پردازنده در مواردی که پردازنده بایستی کارهای دیگری را به صورت polling انجام دهد، خواهد شد.

    ------------------------------------------------
    برای محاسبه زمان دقیق یک پروسه می توان از تایمر استفاده کرد.
    در نظر بگیرید در ابتدای کار تایمر را فعال و در انتها آن را متوقف می کنید. عددی در شمارنده تایمر وجود دارد که از این عدد بایستی زمان پروسه را محاسبه کنید. این کار به سادگی بر اساس کلاک اعمالی به تایمر (و با محاسبات پیش دبستانی!) انجام می شود.
    اگر کلاک اعمالی به تایمر CLOCK باشد بنابراین در 1 ثانیه شمارنده تایمر به عدد CLOCK می رسد. پس اگر عدد شمارنده تایمر SH شده باشد زمان پروسه به ثانیه با یک طرفین وسطین ساده بدست می آید :
    Time = SH * 1 / CLOCK
    حال اگر پروسه کمی طولانی بود و شمارنده تایمر سرریز داشت چگونه این زمان محاسبه می شود؟

    ---------------------------------

موضوعات مشابه

  1. [سوال] وقفه I2C در stm32f103
    توسط mm_g10 در انجمن stm32
    پاسخ: 4
    آخرين نوشته: 04-04-2018, 22:28
  2. مشاوره خرید برد مینی stm32f103
    توسط paradox7 در انجمن معرفی خدمات و محصولات شرکت کویرالکترونیک
    پاسخ: 14
    آخرين نوشته: 30-10-2014, 15:42
  3. [سوال] برد stm32f103
    توسط mahtab68 در انجمن stm32
    پاسخ: 10
    آخرين نوشته: 27-07-2014, 19:19
  4. اشکال در پروگرم stm32f103
    توسط mrezakhd در انجمن stm32
    پاسخ: 2
    آخرين نوشته: 25-05-2014, 11:26
  5. میکروهای arm stm32f103
    توسط hello در انجمن گفت و گوي آزاد
    پاسخ: 1
    آخرين نوشته: 18-06-2013, 15:58

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •