آموزش STM32 با توابع LL قسمت بیست و هفتم: کالیبره کردن RTC

آموزش STM32 با توابع LL قسمت بیست و هفتم: کالیبره کردن RTC

آموزش STM32 با توابع LL قسمت بیست و هفتم: کالیبره کردن RTC
آموزش STM32 با توابع LL قسمت بیست و هفتم: کالیبره کردن RTC

در بخش قبلی RTC را راه‌اندازی کردیم و زمان و تاریخ را به‌وسیله آن نگهداری کردیم. نکته‌ای که به آن اشاره نشد دقت اندازه‌گیری زمان است. دقت اندازه‌گیری ما به فرکانس منبع کلاک RTC وابسته است. همان‌طور که دیدیم از منبع LSE به‌عنوان کلاک RTC استفاده شد. اما باید بدانیم که فرکانس نامی این نوسان کننده (یعنی 32.768) لزوماً همیشه دقیق و ثابت نیست. یک عامل مهم در تغییر این فرکانس تغییرات دما است و عامل دیگر تغییرات خود کریستال. در ادامه درباره‌ی این وابستگی و روش کالیبره کردن خودکار RTC برای جبران خطای تغییر فرکانس صحبت خواهیم کرد.

با سیسوگ همراه باشید.

در شکل بالا می‌بینید که برای یک نوسان کننده خاص در بازه دمایی 20 تا 30 درجه سانتی‌گراد، بیشترین دقت وجود دارد و با کاهش یا افزایش دما نسبت به این محدوده دقت کاهش می‌یابد. واحد اندازه‌گیری این دقت همان‌طور که در نمودار دیده می‌شود، ppm است که خطای فرکانس را در هر 1 مگاهرتز نشان می‌دهد. یا به عبارتی نسبت تغییر فرکانس به فرکانس مرجع ضرب‌در یک‌میلیون می‌شود. رابطه ریاضی مربوط به منحنی بالا به‌صورت زیر نوشته می‌شود:

 

که در آن To برابر است با:

 

همچنین ثابت k که وابسته به کریستال مورداستفاده است در این مورد خاص این‌گونه تعریف می‌شود:

 

همان‌طور که در ابتدا اشاره شد، منبع کلاک مورداستفاده برای RTC، یعنی LSE فرکانس نامی 32.768 KHz دارد. البته دو منبع کلاک HSE/128 و LSI نیز قابل انتخاب هستند اما برای استفاده از حالت توان پایین و نیز داشتن دقت مناسب از منبع LSE استفاده می‌شود. به‌منظور جبران خطا در فرکانس کلاک، به‌جز استفاده از خازن (که اشکالات خودش را دارد، ازجمله جریان کشی بیشتر) راه دیجیتالی در نظر گرفته شده است. بدین منظور استفاده از مسیری است که از خروجی انتخاب کلاک RTC به پایه‌های میکرو وجود دارد:

در این شکل می‌بینیم که با تنظیم رجیستر BKP_RTCCR می‌توانیم کلاک RTC تقسیم‌بر 64 را روی پین TAMP داشته باشیم. با مقایسه این کلاک با مقدار مرجع آن (32768Hz/64=512Hz) می‌توان عمل کالیبره کردن را انجام داد. عمل کالیبره کردن RTC درواقع به این صورت است که در هر مرحله از آن‌یک سیکل اسیلاتور به ازای هر 1048576 (220) سیکل آن، حذف خواهد شد. به‌عبارت‌دیگر در هر قدم کالیبراسیون 0.954ppm(1000000/220) خطا تصحیح خواهد شد. درنتیجه امکان آهسته کردن کلاک اسیلاتور از 0 تا 121ppm وجود دارد.

برای اینکه بدانیم تأثیر هر ppm در زمان‌سنجی چقدر است، می‌توانیم به جدولی مراجعه کنیم که توسط سازنده میکرو یا اسلاتور منتشر می‌شود. نکته مهم این است که معمولاً این تغییرات بسیار کوچک هستند و فقط در بازه‌های بزرگ زمانی دیده می‌شوند، به‌طوری‌که واحد اندازه‌گیری آن تعداد ثانیه در ماه است.

 

اشاره کردیم که عمل کالیبره کردن با حذف کردن کلاک‌های کریستال صورت می‌گیرد. با توجه به اینکه مقدار تقسیم‌کننده کلاک (برای شمارش یک ثانیه) روی 32768 تنظیم می‌شود، تنها خطای مربوط به فرکانس‌های سریع‌تر (بیشتر از 32768Hz) قابل جبران هستند و فرکانس‌های آهسته‌تر را نمی‌توان جبران کرد. پس یک راه‌حل برای این مشکل تنظیم مقدار تقسیم‌کننده روی 32766 است. به این طریق فرکانس‌های کلاک در بازه 32766 تا 32770 هرتز قابل جبران سازی هستند.

در ادامه روش ما برای کالیبره کردن RTC نیز بر همین اساس خواهد بود.

 

ایجاد پروژه

این پروژه را مانند پروژه قبل تنظیم می‌کنیم، با این تفاوت که دیگر نیازی به پین خروجی تعریف‌شده در آن پروژه نداریم و همچنین در بخش مربوط به تنظیم RTC، کلاک را به خروجی می‌فرستیم:

تایمر1 را نیز برای اندازه‌گیری فرکانس، در حالت input capture تنظیم می‌کنیم و وقفه capture compare آن را فعال می‌کنیم؛

اکنون پروژه را ایجاد می‌کنیم و وارد بخش کد نویسی می‌شویم.

 

نوشتن کد پروژه

کد این پروژه را نیز مثل پروژه قبل می‌نویسیم، با این تفاوت که دیگر نیازی به تنظیم هشدار و نوشتن وقفه مربوط به آن نداریم. در فایل stm32f1xx_it.c توابع زیر را اضافه و ثابت فرکانس کلاک را تعریف می‌کنیم؛

متغیرهای مورد نیاز برای اندازه‌گیری فرکانس و خطا را تعریف می‌کنیم؛

در بدنه تابع وقفه‌ی تایمر کد زیر را می‌نویسیم :

حالا به سراغ تابع به روزرسانی تاریخ می‌رویم و به صورت زیر آن‌را برای کالیبره کردن به روز می‌کنیم؛

همان‌طور که اشاره کردیم مقدار تقسیم‌کننده کلاک برای کالیبراسیون باید تغییر کند:

حالا قبل از حلقه while(1) کد مربوط به فعال‌سازی تایمر1 و وقفه آن را بنویسیم، همچنین کد مربوط به فرستادن کلاک RTC به پایه خروجی را می‌نویسیم؛

حالا باید پایه خروجی کلاک RTC را به ورودی capture تایمر متصل کنیم.

همان‌طور که می‌بینیم، کالیبراسیون و جبران خطا در هرروز یک بار اتفاق می‌افتد. در همین راستا، باید به چند نکته توجه کنیم.

  • نکته1: به دلیل اینکه محدودیت جبران سازی در این روش، تا 121ppm است، خطاهای بالاتر به همین مقدار تقریب زده‌شده‌اند.
  • نکته2: ازآنجایی‌که کالیبراسیون RTC بر اساس حذف سیکل کلاک‌های کریستال عمل می‌کند، برای بالا بردن دقت، در شمارش‌های کم، کارایی ندارد و تنها برای مدت‌زمان‌های طولانی مؤثر است. بنابراین برای مدت‌زمان‌های کوتاه، دقت شمارش بدون کالیبراسیون از شمارش با کالیبراسیون بیشتر است. پس باید حتماً با کاربرد توجه شود.
  • نکته3: اگرچه روش کالیبره کردن خودکار گفته‌شده، نسبت به روش آنالوگ (اضافه کردن خازن) مزیت‌هایی دارد و می‌تواند دقت اندازه‌گیری زمان را بالا ببرد، اما خالی از اشکال هم نیست. زیرا برای اندازه‌گیری فرکانس از تایمر استفاده کردیم که خود وابسته به فرکانس کریستال سرعت‌بالا است و می‌تواند دچار خطا شود. به‌عنوان‌مثال در پروژه‌ای که انجام دادیم فرکانس RTC (تقسیم‌بر 64) به‌وسیله فرکانس متر دقیق، مقدار 512.172 اندازه‌گیری شد که با مقدار اندازه‌گیری شده به‌وسیله تایمر اختلاف دارد. افزایش دقت در این عمل مستلزم استفاده از رزوناتور با دقت بالا (تا 3 رقم اعشار یا بیشتر) است.

 

   لینک این پروژه در گیت‌هاب

حمایت از سیاوش

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

سیاوش
سیاوش

کارشناس ارشد الکترونیک دیجیتال، علاقه‌مند به یادگیری

دیدگاه ها

5 دیدگاه

  • مهدی
    ۶ تیر ۱۴۰۱

    برای من که خیلی به این مشکل بوده بالاخص stm32h743 های در بازار ایران که برای بقیه هم پرسیدم مشکل داره اینهم که جلو میره یا عقب میمونه یک چیز ثابت نیست یعنی یکبار جلو میفته یکبار عقب میفته برنامه را هم من ننوشسم خود کیوب ام ایکس کدش را مینویسه و این مشکل هم اغلب روی میکروهای جنس چین پیش میاد ولی مالزی هم بعضا میشد

    • Sisoog Os
      Sisoog Os
      ۷ تیر ۱۴۰۱

      برای بدست اوردن دقت خیلی بالا نیاز هست هر عدد برد را با کریستال قرار داده شده کالیبره کنید

    • Zeus ‌
      Zeus ‌
      ۷ تیر ۱۴۰۱

      درسته دوست عزیز
      به نظر من دقیقا مشکل همینه که برنامه رو خودتون ویرایش نمیکنید، کیوب ام اکس بر اساس یه سری پیشفرض این کار رو انجام میده و حالا اگر پیش فرض ها رعایت نشده باشه چی ؟
      اون موقع است که مشکل پیش میآد دیگه، برای همینه که نیازه برنامه رو خودتون هم تغییر بدید بسته به شرایطی که دارید.

  • مهدی
    ۶ تیر ۱۴۰۱

    سلام خسته نباشید البته این میکرو که استفاده کردید اگر در تنظیماتش توجه کنید خودش کالیبره خودکار داره ولی میکروهای جدیدتر متاسفانه ندارن ولی مشکل دیگه ای هم که هست اکثر میکروهای در بازار rtc آنها مشکل دارد و اگر کریستال خارجی بگذارید در خیلی از موارد میکرو موقع بالا اومدن قفل میکنه و مشکل دیگه ای هم که هست با تغییر مقدار دو تقسیم کننده اغلب مشکل حل نمیشه چون چیزی که من در عمل دیدم مثلا در میکرو stm32h743 بعضی وقتها یواش میشماره بعضی اوقات هم تند میشماره بهترین راه برای بیشترین دقت که برای این میکروها دیدم اینه که فرکانس rtc را از تقسیم کننده کریستال اصلی بگیریم و بعد با تقسیم کننده ها یک هرتز را تولید کنیم ولی برای این میکرو که شما گذاشتید هم کالیبره اتومات خودش جواب میده ولی همونم نباید از کریستال ساعت خارجی استفاده کرد چون دقت داره ولی خیلی اوقات میکرو هنگ میکنه

    • Zeus ‌
      Zeus ‌
      ۶ تیر ۱۴۰۱

      سلام و درود دوست عزیز
      این مشکلی که ازش حرف میزنید من تا حالا ندیدم، مدتی زیاد با RTC کار میکردم و کریستال خارجی وصل میکردم، احتمالا مشکل از برنامه ای نوشتید باشد، مثلا اگر برنامه شما موفق به راه اندازی LSE نشه اون موقع ممکنه بره توی هاردفالت یا یه جا گیر کنه و اینطور به نظر برسه که میکرو بالانمیآد
      البته تجربه این که کریستال کیفیت مناسبی نداشته باشه رو داشتم و همین باعث میشده که این اتفاق بیفته ، برای تریم کردن فرکانس هم ما یکی از خازن های کریستال رو به شکل تریمر میذاشتم و با فرکانس متر اسیلاتور رو تنظیم می کردیم و عملا مشکل عقب افتادن یا جلو افتادن حل میشد

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 9 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک