فهرست مطالب:

فرکانس با وضوح بالا: 5 مرحله (همراه با تصاویر)
فرکانس با وضوح بالا: 5 مرحله (همراه با تصاویر)

تصویری: فرکانس با وضوح بالا: 5 مرحله (همراه با تصاویر)

تصویری: فرکانس با وضوح بالا: 5 مرحله (همراه با تصاویر)
تصویری: سه کاری که زنان آرزو می کنند مردان در رختخواب انجام دهند | حقیقت روانشناسی درروابط زن و مرد 2024, نوامبر
Anonim

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

ویرایش: کد اکنون در GitLab در دسترس است:

gitlab.com/WilkoL/high-resolution-frequency-counter

مرحله 1: شمارش فرکانس مدرسه قدیمی

شمارش فرکانس مدرسه قدیمی
شمارش فرکانس مدرسه قدیمی
شمارش فرکانس مدرسه قدیمی
شمارش فرکانس مدرسه قدیمی

روش قدیمی برای اندازه گیری فرکانس سیگنال ، استفاده از یک دروازه AND منطقی ، تغذیه سیگنال اندازه گیری شده در یک پورت و یک سیگنال با زمان دقیق 1 ثانیه به پورت دیگر و شمارش خروجی است. این برای سیگنال های چند کیلوهرتزی به خوبی در گیگاهرتز بسیار خوب عمل می کند. اما اگر می خواهید سیگنال فرکانس پایین را با وضوح خوب اندازه گیری کنید ، چه می کنید؟ بگویید می خواهید فرکانس شبکه (در اینجا 50 هرتز) را اندازه گیری کنید. در صورت خوش شانس بودن با روش قدیمی مدرسه ، 50 ثابت را روی صفحه نمایش خود مشاهده خواهید کرد ، اما به احتمال زیاد صفحه نمایش را از 49 به 50 یا 50 به 51. تغییر می دهید. رزولوشن 1 هرتز است و بس. شما هرگز 50.002 هرتز را مشاهده نخواهید کرد مگر اینکه مایل باشید زمان دروازه را به 1000 ثانیه افزایش دهید. این بیش از 16 دقیقه است ، برای یک اندازه گیری واحد!

یک روش بهتر برای اندازه گیری سیگنال های فرکانس پایین اندازه گیری دوره آن است. با درنظر گرفتن مجدد شبکه اصلی ، مدت زمان آن 20 میلی ثانیه است. همان منطق AND-gate را در نظر بگیرید ، آن را با مثلاً 10 مگاهرتز (0.1 پالس ما) تغذیه کنید و سیگنال شما در درگاه دیگر خارج و از 200000 پالس خارج می شود ، بنابراین زمان بازه زمانی 20000.0 uS است و به 50Hz تبدیل می شود. وقتی فقط پالس های 199650 را اندازه گیری می کنید ، فرکانس 50.087 هرتز است ، این بسیار بهتر است و فقط در یک زمان اندازه گیری ثانیه است. متاسفانه این با فرکانس های بالاتر خوب کار نمی کند. برای مثال ، اکنون می خواهیم 40 کیلوهرتز را اندازه گیری کنیم. با همان فرکانس ورودی 10 مگاهرتز به عنوان مرجع ، ما اکنون فقط 250 پالس را اندازه گیری می کنیم. وقتی ما فقط 249 پالس را شمارش می کنیم ، محاسبه 40161 هرتز و با 251 نتیجه 39840 هرتز می شود. این قطعنامه قابل قبول نیست. البته افزایش فرکانس مرجع نتایج را بهبود می بخشد ، اما محدودیتی برای استفاده از میکروکنترلر وجود دارد.

مرحله 2: راه متقابل

راه متقابل
راه متقابل
راه متقابل
راه متقابل

راه حلی که برای فرکانسهای پایین و بالاتر کار می کند ، شمارنده فرکانس متقابل است. سعی می کنم اصل آن را توضیح دهم. شما با یک زمان اندازه گیری شروع می کنید که تقریباً 1 ثانیه است ، لازم نیست خیلی دقیق باشد ، اما زمان مناسبی برای اندازه گیری است. این سیگنال 1 هرتز را در ورودی D به یک flipflop D وارد کنید. هنوز هیچ چیزی در خروجی (ها) اتفاق نمی افتد. سیگنالی را که می خواهید اندازه گیری کنید به ورودی CLOCK D-flipflop وصل کنید.

به محض اینکه این سیگنال از LOW به HIGH می رود ، خروجی D-flipflop حالت ورودی D را به خروجی (Q) منتقل می کند. این سیگنال RISING برای شروع شمارش سیگنال ورودی و همچنین یک سیگنال ساعت مرجع استفاده می شود.

بنابراین شما دو سیگنال را دقیقاً همزمان شمارش می کنید ، سیگنالی که می خواهید اندازه گیری کنید و یک ساعت مرجع. این ساعت مرجع باید دارای مقدار دقیق و پایدار باشد ، یک نوسان ساز کریستالی معمولی خوب است. مقدار تا زمانی که فرکانس بالایی داشته باشد و مقدار آن به خوبی شناخته شده باشد اهمیت چندانی ندارد.

بعد از مدتی ، چند میلی ثانیه ، ورودی D را از D-flipflop دوباره کم می کنید. در ورودی CLOCK بعدی خروجی Q وضعیت ورودی را دنبال می کند ، اما هیچ چیز دیگری اتفاق نمی افتد زیرا میکروکنترلر تنظیم شده است که فقط به یک سیگنال RISING واکنش نشان دهد. سپس ، پس از اتمام زمان اندازه گیری (تقریبا 1 ثانیه) ، ورودی D را HIGH می کنید.

مجدداً در ورودی CLOCK بعدی خروجی Q دنبال می شود و این سیگنال RISING میکرو کنترلر را فعال می کند ، این بار شمارش هر دو شمارنده را پایان می دهد.

نتیجه دو عدد است. اولین عدد تعداد پالس های شمارش شده از مرجع است. همانطور که فرکانس مرجع را می شناسیم ، زمان شمارش آن پالس ها را نیز می دانیم.

عدد دوم ، تعداد پالس های سیگنال ورودی است که ما اندازه گیری می کنیم. همانطور که ما دقیقاً از لبه های در حال ظهور این سیگنال شروع کردیم ، در مورد تعداد پالس های این سیگنال ورودی بسیار مطمئن هستیم.

اکنون فقط محاسبه ای برای تعیین فرکانس سیگنال ورودی است.

به عنوان مثال ، فرض کنید ما این سیگنال ها را داریم و می خواهیم ورودی f را اندازه گیری کنیم. مرجع 10 مگاهرتز است که توسط یک نوسان ساز بلوری کوارتز تولید می شود. f_input = 31.416 هرتز f_reference = 10000000 هرتز (10 مگاهرتز) ، زمان اندازه گیری تقریبی است. 1 ثانیه

در این زمان ما 32 پالس را شمارش کردیم. اکنون ، یک دوره از این سیگنال 1 / 31.416 = 31830.9 uS طول می کشد. بنابراین 32 دوره 1.0185892 ثانیه برای ما طول کشید که کمی بیش از 1 ثانیه است.

در این 1.0186 ثانیه ما همچنین 10185892 پالس سیگنال مرجع را شمارش کرده ایم.

این اطلاعات زیر را به ما می دهد: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

فرمول محاسبه فرکانس بدست آمده این است: freq = (input_count * f_reference) / ref_count

در مثال ما عبارت است از: f-input = (3200 * 10000000) / 10185892 = 31.416 هرتز

و این برای فرکانسهای پایین و همچنین فرکانسهای بالا خوب عمل می کند ، تنها زمانی که سیگنال ورودی به فرکانس مرجع نزدیک (یا حتی بالاتر از) می شود ، بهتر است از روش اندازه گیری استاندارد "دروازه دار" استفاده کنید. اما سپس می توانیم به سادگی یک تقسیم فرکانس را به سیگنال ورودی اضافه کنیم زیرا این روش متقابل دارای رزولوشن یکسانی برای هر فرکانسی است (تا دوباره مرجع). بنابراین اگر شما 100 کیلوهرتز را مستقیماً بر تقسیم بر تقسیم کننده 1000x خارجی اندازه گیری کنید ، وضوح تصویر یکسان است.

مرحله 3: سخت افزار و شماتیک آن

سخت افزار و شماتیک آن
سخت افزار و شماتیک آن
سخت افزار و شماتیک آن
سخت افزار و شماتیک آن

من تعدادی از این نوع شمارنده های فرکانس را ساخته ام. مدتها پیش من یک دستگاه با ATMEGA328 (همان کنترلر موجود در Arduino) ، بعداً با میکروکنترلرهای ARM از ST ساختم. آخرین دستگاه با STM32F407 با سرعت 168 مگاهرتز ساخته شد. اما حالا فکر کردم اگر این کار را با یک * بسیار * کوچکتر انجام دهم چه می شود؟ من ATTINY2313 را انتخاب کردم که فقط 2 کیلوبایت حافظه FLASH و 128 بایت RAM دارد. صفحه نمایش من MAX7219 است که دارای 8 صفحه نمایش هفت قسمتی است ، این نمایشگرها تنها با 2 یورو در Ebay در دسترس هستند. یک ATTINY2313 را می توانید با قیمتی در حدود 1.5 یورو خریداری کنید و بقیه قطعاتی که استفاده کردم فقط یک سنت برای هر قطعه هزینه دارد. گران ترین احتمالاً جعبه پلاستیکی پروژه بود. بعداً تصمیم گرفتم آن را با باتری لیتیوم یونی کار کنم ، بنابراین باید یک تثبیت کننده ولتاژ 3.3V (LDO) یک ماژول شارژ باتری و خود باتری را اضافه کنم. این تا حدودی قیمت را افزایش می دهد ، اما من حدس می زنم که می توان آن را با کمتر از 20 یورو ساخت.

مرحله 4: کد

کد
کد
کد
کد

کد به زبان C با Atmel (Microchip) Studio 7 نوشته شده و با استفاده از OLIMEX AVR_ISP (کلون؟) در ATTINY2313 برنامه ریزی شده است. اگر می خواهید توضیحات را در اینجا دنبال کنید (main.c) را در فایل zip زیر باز کنید.

مقداردهی اولیه

ابتدا ATTINY2313 تنظیم شد که از کریستال خارجی استفاده کند زیرا نوسان ساز RC داخلی برای اندازه گیری هر چیزی بی فایده است. من از کریستال 10 مگاهرتز استفاده می کنم که با یک خازن متغیر کوچک ، فرکانس صحیح 10 000 000 هرتز را تنظیم می کنم. مقداردهی اولیه تنظیم تنظیم پورت ها برای ورودی ها و خروجی ها ، تنظیم زمان سنج ها و فعال کردن وقفه ها و راه اندازی MAX7219 را بر عهده دارد. TIMER0 برای شمارش یک ساعت خارجی ، TIMER1 ساعت داخلی و همچنین برای شمارش مقدار شمارنده در لبه در حال افزایش ICP ، که از D-flipflop آمده است ، تنظیم شده است.

من آخرین برنامه اصلی را بحث خواهم کرد ، بنابراین برنامه های بعدی وقفه بعدی هستند.

TIMER0_OVF

همانطور که TIMER0 تا 255 (8 بیت) شمارش می کند و سپس روی 0 می چرخد ، برای شمارش تعداد سرریزها به وقفه نیاز داریم. این تنها کاری است که TIMER0_OVF انجام می دهد ، فقط تعداد سرریز را بشمارید. بعداً این عدد با مقدار خود شمارنده ترکیب می شود.

TIMER1_OVF

TIMER1 می تواند تا 65536 (16 بیت) شمارش کند ، بنابراین TIMER1_OVF وقفه نیز تعداد سرریزها را شمارش می کند. اما بیشتر انجام می دهد. همچنین از 152 به 0 کاهش می یابد که حدود 1 ثانیه طول می کشد و سپس یک پین خروجی تنظیم می کند و به ورودی D فلیپ فلاپ می رود. و آخرین کاری که در این روال وقفه انجام می شود ، کاهش زمان شمار است ، از 765 به 0 ، که حدود 5 ثانیه طول می کشد.

TIMER1_CAPT

این وقفه TIMER1_CAPT است که هر زمان که سیگنال D-flipflop برای آن سیگنالی ارسال می کند ، در لبه بالایی سیگنال ورودی (همانطور که در بالا توضیح داده شد) فعال می شود. منطق ضبط مراقبت از ذخیره مقدار شمارنده TIMER1 در لحظه ضبط ، ذخیره می شود و همچنین شمارنده سرریز. متأسفانه TIMER0 عملکرد ضبط ورودی ندارد ، بنابراین در اینجا مقدار فعلی و مقدار فعلی شمارنده سرریز خوانده می شود. یک پیام متغیر روی برنامه اصلی تنظیم می شود تا به آن بگوید این داده های جدید است.

در مرحله بعد دو عملکرد برای کنترل MAX7219 وجود دارد

SPI

در حالی که یک رابط سریال جهانی (USI) در تراشه موجود است که من از آن استفاده نکردم. صفحه نمایش MAX7219 باید از طریق SPI کنترل شود و این با USI امکان پذیر است. اما bitbanging SPI آنقدر ساده است که من برای انجام آن با USI وقت نگذاشتم.

MAX7219

پروتکل تنظیم MAX7219 نیز پس از مطالعه دفترچه راهنمای آن بسیار ساده است. برای هر رقمی که شامل 8 بیت برای عدد رقمی (1 تا 8) است ، به دنبال آن 16 بیت و برای عددی که باید نمایش داده شود 8 بیت است.

MAIN-PROG

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

وقتی پیغام متغیر روی یک تنظیم می شود ، اولین کاری که باید انجام دهید این است که زمان شمار را تنظیم مجدد کنید ، پس از همه ما می دانیم که یک سیگنال وجود دارد. D-flipflop بازنشانی می شود تا برای محرک بعدی که بعد از زمان اندازه گیری (یک ثانیه صبر کنید) آماده می شود آماده شود.

اعداد ثبت شده در وقفه ضبط اضافه می شوند تا تعداد مرجع و شمارش فرکانس ورودی به دست آید. (ما باید مطمئن شویم که مرجع هرگز صفر نمی شود زیرا بعداً بر آن تقسیم می کنیم)

بعد محاسبه فرکانس واقعی است. من مطمئناً نمی خواهم از اعداد شناور روی میکروکنترلر با فقط 2 کیلوبایت فلاش و تنها 128 بایت رم از اعداد صحیح استفاده کنم. اما فرکانس ها می توانند مانند 314.159 هرتز با چندین عدد اعشاری باشند. بنابراین من فرکانس ورودی را نه تنها با فرکانس مرجع بلکه با یک ضرب ضرب می کنم ، و سپس عددی را به نقطه اعشار اضافه می کنم. وقتی این کار را انجام دهید ، این اعداد بسیار بسیار بزرگتر می شوند. به عنوان مثال. با ورودی 500 کیلوهرتز ، مرجع 10 مگاهرتز و ضرب 100 ، این 5 10 10^14 را می دهد ، این واقعاً بزرگ است! آنها به هیچ وجه در یک عدد 32 بیتی قرار نمی گیرند ، بنابراین من از اعداد 64 بیتی استفاده می کنم که تا 1.8 x 10^19 افزایش می یابد (که در ATTINY2313 خوب کار می کند)

و آخرین کاری که باید انجام دهید این است که نتیجه را به صفحه MAX7219 ارسال کنید.

کد در حدود 1600 بایت جمع آوری می شود ، بنابراین در فلش 2048 بایت موجود در ATTINY2313 جا می گیرد.

ثبت فیوزها باید به این صورت باشد:

0xFF تمدید شد

0xDF بالا

پایین 0xBF

مرحله 5: دقت و دقت

دقت و صحت
دقت و صحت
دقت و صحت
دقت و صحت
دقت و صحت
دقت و صحت

دقت و دقت دو جانور مجزا هستند. دقت در اینجا هفت رقم است ، میزان دقت واقعی بستگی به سخت افزار و کالیبراسیون دارد. من 10 مگاهرتز (5 مگاهرتز در نقطه آزمایش) را با یک شمارنده فرکانس دیگر که دارای یک نوسان ساز منظم GPS است ، کالیبره کردم.

و بسیار خوب کار می کند ، کمترین فرکانسی که من امتحان کردم 0.2 هرتز ، بالاترین 2 مگاهرتز است. نقطه ای است بیش از 2 مگاهرتز کنترل کننده شروع به قطع وقفه می کند ، واقعاً تعجب آور نیست وقتی بدانید که در سیگنال ورودی 2 مگاهرتز TIMER0 بیش از 7800 وقفه در ثانیه ایجاد می کند. ATTINY2313 باید کارهای دیگری نیز انجام دهد ، وقفه های TIMER1 ، 150 وقفه دیگر در ثانیه و البته محاسبات را انجام می دهد ، صفحه نمایش و D-flipflop را کنترل می کند. وقتی به دستگاه واقعی نگاه می کنید می بینید که من فقط از هفت رقم از هشت رقم صفحه نمایش استفاده می کنم. من این کار را به چند دلیل انجام می دهم.

اول این که محاسبه فرکانس ورودی یک تقسیم است ، تقریباً همیشه باقیمانده ای دارد که شما آن را به عنوان یک تقسیم صحیح نمی بینید. دوم اینکه نوسان ساز کریستال کوارتز در دما تثبیت نشده است.

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

توصیه شده: