جستجو
برای جستجو متن مورد نظر وارد کنید و Enter بزنید برای بستن Esc بزنید.
تولید سیگنال مثلثی و سینوسی بخاطر ماهیت و شکل ساختاری خود توسط میکروکنترلر سخت بوده و زمان و منابع زیادی را خصوصا در میکروکنترلرهای 8 بیتی و فرکانس پایین به خود اختصاص می دهد و با افزایش فرکانس سیگنال خروجی ما تولید ان سخت تر و ناممکن می شود.
چون تولید سیگنال بصورت نرم افزاری انجام می شود وقت زیادی از پردازنده درگیر این امر می شود حتی برای تولید پالس مربعی که راحتترین نوع تولید پالس می باشد. (کافی است کاربر یک پایه خروجی را طبق فرکانس سیگنال خود در یک بازه زمانی Toggle نماید.)
برای مثال اگر بخواهیم یک پالس مربعی با فرکانس 50 کیلوهرتس تولید نماییم نیاز داریم در نصف تناوب فرکانس سیگنال عمل صفر و یک کردن پایه خروجی را انجام بدهیم (هر پالس مربعی شامل 50 درصد سطح یک منطقی و 50 درصد سطح صفر منطقی می باشد) تا یک پالس مربعی در خروجی میکروکنترلر ما تولید شود.
طبق فرمولی ساده تناوب از تقسیم عدد یک بر فرکانس ما حاصل می شود که در اینجا عدد 20 میکروثانیه بدست می آید.در نتیجه نصف تناوب ما عدد 10 میکروثانیه بدست می اید که ما باید هر 10 میکروثانیه وضعیت پایه را toggle نماییم.
حال اگر بخواهیم سیگنال مربعی با فرکانس 1 مگاهرتس تولید نماییم نیاز به زمان 0.5 میکروثانیه خواهیم داشت.
قرار دادن میکروکنترلر در یک حلقه بی نهایت برای تولید پالس باعث می شود میکروکنترلر نتواند به کارهای پردازشی دیگر برسد.با وجود تایمرهای داخلی میکروکنترلر نیازی به تولید پالس مربعی به روش نرم افزاری نخواهیم داشت و در اینجا فقط برای تشریح روند کار توضیحات داده شده است.برای تولید سیگنال سینوسی و مثلثی کار به مراتب سخت تر است(مجبور هستیم سیگنال سینوسی و مثلثی را نر مافزاری ).بیایید روند تولید یک موج سینوسی 50 کیلوهرتسی را بررسی نماییم:
برای تولید سیگنال سینوسی ما باید از مبدل دیجیتال به انالوگ (DAC) داخلی میکروکنترلر (در صورت موجود بودن) یا مبدل خارجی یا به روش مدولاسیون عرض پالس (PWM) اقدام نماییم. فرض کنیم دقت تولید سیگنال سینوسی را 8 بیتی که یک دقت متوسط حساب می شود در نظر بگیریم.یعنی ما برای تولید یک سیگنال سینوسی نیاز داریم 256 بار در یک تناوب DAC یا واحد PWM را مقدار دهی نماییم.
چون فرکانس سیگنال خود را 50 کیلوهرتز در نظر گرفتیم فرکانس مورد نیاز تایمر(تایمر برای تولید زمان دقیق برای مقدار دهی PWM یا DAC نیاز است) ما ( 50 کیلوهرتس ضرب در 256 ) برابر 12.8 مگاهرتس خود شد ! که در یک میکروکنترلر AVR با فرکانس حداکثر 16 مگاهرتسی 80 درصد از وقت پردازش را به خود اختصاص می دهد.
شاید راه حلی که به ذهن برسد استفاده از میکروکنترلر قوی تر باشد ولی صرف هزینه بیشتر برای تولید یک سیگنال مثلا 50 کیلوهرتسی منطقی به نظر نمی رسد. راه حل دیگر استفاده از مدارات انالوگ می باشد که از معایب این روش می توان به دقیق نبودن (بخاطر تلرانس قطعات) , پایدار نبودن و افزایش سایز PCB و افزایش قطعات مدار اشاره نمود.
اما بهترین راه حل استفاده از آی سی های مولد سیگنال که بصورت ماژول در دسترس هستند می باشد.
ماژول AD9833 یک ماژول مولد سیگنال های سینوسی , مثلثی و مربعی قابل کنترل توسط میکروکنترلر از طریق اینترفیس SPI می باشد.
محدوده ولتاژ کاری بین 2.3 تا 5.5 ولت
محدوده دمایی کاری وسیع از منفی 40 درجه سانتی گراد تا مثبت 105 درجه سانتی گراد
تولید سیگنال خروجی تا 12.5 مگاهرتس
گام فرکانسی با دقت 0.1 هرتس
پشتیبانی از رابط SPI سه سیمه
بدون نیاز به اضافه کردن قطعه خارجی
توان مصرفی پایین
وجود کتابخانه نرم افزاری آردوینو برای راه اندازی سریع تر ماژول
برای راه اندازی ماژول باید ابتدا کتابخانه AD9833 را از لینک زیر دانلود نماییم:
پوشه داخل فایل Zip باید درون پوشه libraries Arduino کپی شود.
پوشه libraries آردوینو در مسیر Documents\Arduino\libraries واقع شده است.
در زیر ترتیب پایه های ماژول را مشاهده می نمایید :
ابتدا در برنامه کتابخانه ماژول را فراخوانی می کنیم
#include <AD9833.h>
#define FNC_PIN 4
FNC_PIN نقش پایه SS را در ارتباط SPI ایفا می کند که می توان ان را به هر پایه ای در آردوینو متصل نمود.
AD9833 gen(FNC_PIN);
در بالا یک شیء از کلاس AD9833 ایجاد می نماییم.
gen.Begin();
توسط این تابع ابتدا ماژول را راه اندازی می نماییم تا اماده بکار شود.
gen.SetPhase(REG0,360);
توسط این تابع می توانیم فاز سیگنال خود را از 0 تا 360 درجه برای فاز افست اول یا دوم تنظیم نماییم.
gen.ApplySignal(SQUARE_WAVE, REG0, Frequency);
توسط تابع ApplySignal می توانیم سیگنال دلخواه خود را برای تولید اعمال نماییم که این تابع سه ورودی دریافت می کند.اولین ورودی تابع نوع سیگنال تولیدی ما را مشخص می کند.که می تواند یکی از حالت های زیر باشد :
SINE_WAVE
TRIANGLE_WAVE
SQUARE_WAVE
ماژول دارای دو رجیستر فاز افست برای تنظیم فاز خروجی سیگنال می باشد که ما در اینجا از REG0 یا فاز افست اول در ورودی دوم تابع استفاده نموده ایم.و در ورودی سوم تابع فرکانس دلخواه خود را به هرتز وارد می نماییم.
gen.EnableOutput(true);
توسط این تابع می توانیم خروجی ماژول را فعال یا غیر فعال نماییم.که ورودی تابع می تواند true (فعال کردن خروجی ماژول) یا false (غیرفعال کردن خروجی ماژول) باشد.
در زیر نمونه ای کامل از برنامه تست را مشاهده می کنید :
#include <AD9833.h>
#define FNC_PIN 4
AD9833 gen(FNC_PIN);
void setup() {
gen.Begin();
gen.ApplySignal(SQUARE_WAVE, REG0, 1000);
gen.EnableOutput(true); // Turn ON the output - it defaults to OFF
}
void loop() {
}