تولید سیگنال AM بصورت نرم افزاری توسط آردوینو

مدولاسیون AM در واقع رابطه تغییرات دامنه سیگنال حامل توسط سیگنال پیام ما می باشد.سیگنال حامل یک سیگنال سینوسی با فرکانس چند برابر بزرگتر از سیگنال پیام می باشد که بسته به مقدار دامنه سیگنال پیام , دامنه سیگنال حامل ممکن است کاهش یا افزایش یابد.دلیل استفاده از سیگنال حامل افزایش برد ارسالی سیگنال پیام می باشد بنابراین نیاز داریم یکی از پارامترهای سیگنال حامل (دامنه – فاز و فرکانس) توسط سیگنال پیام تغییر نماید.

میکروکنترلرهای اردوینو سری AVR فاقد واحد مبدل دیجیتال به انالوگ می باشند بنابراین برای تولید ولتاژ انالوگی دو راه پیش رو خواهیم داشت , اول استفاده از سیگنال مدولاسیون عرض پالس یا همان PWM و دوم استفاده از مبدل های انالوگ به دیجیتال خارجی.

روش دوم بخاطر تولید سیگنال تمیز تر در روشهای تولید سیگنال نرم افزاری برتری دارد بنابراین ما از ای سی معروف DAC0800 برای تولید سیگنال انالوگ توسط اردوینو استفاده خواهیم کرد این ای سی از رابط موازی برای ارتباط با میکروکنترلر استفاده می کند و ما به راحتی می توانیم با دادن دیتای دیجیتالی به ان در خروجی ان ولتاژ انالوگ دریافت نماییم.

 

از فرمول زیر برای تنظیم مقاومت های متصل به DAC استفاده می کنیم:

ولتاژ رفرنس را برابر با 5 ولت قرار داده ایم و همچنین مقاومت R1 برابر با 1 کیلو اهم و بنابراین جریان خروجی ما برابر با 5 میلی امپر خواهد بود تا اینجا ضریب K بدست امده است حال اگر تمام پایه های ورودی مبدل برابر با یک منطقی قرار گیرند حاصل ضرب ضریب k در عبارات داخل مجموعه تقریبا برابر با عدد 5 میلی امپر خواهد شد و با قرار دادن یک مقاومت 1 کیلو اهم در پایه خروجی ای سی (IOUT) جریان را به ولتاژ 5 ولت تبدیل می نماییم.

و اگر تمام پایه های ورودی دیجیتالی ای سی را برابر با صفر قرار دهیم در خروجی ولتاژ صفر ولت را دریافت خواهیم کرد.

آپ امپ خروجی دو کار را انجام می دهد : اول تقویت سیگنال خروجی و تنظیم افست سیگنال در صورت نیاز و دوم تغییر فاز سیگنال تولید شده به اندازه 180 درجه (زیرا خروجی ای سی یک مقدار منفی شده از مقادیر ورودی می باشد)

در زیر شکل موج تولیدی را مشاهده می کنید:

 

در ادامه برنامه تولید سیگنال را شرح می دهیم.

unsigned char sine[256] = {
  131 , 134 , 137 , 140 , 144 , 147 , 150 , 153 , 156 , 159 , 162 , 165 , 168 , 171 , 174 , 177 ,
  180 , 183 , 185 , 188 , 191 , 194 , 196 , 199 , 201 , 204 , 206 , 209 , 211 , 214 , 216 , 218 ,
  220 , 222 , 225 , 227 , 229 , 230 , 232 , 234 , 236 , 237 , 239 , 240 , 242 , 243 , 245 , 246 ,
  247 , 248 , 249 , 250 , 251 , 252 , 252 , 253 , 254 , 254 , 255 , 255 , 255 , 255 , 255 , 255 ,
  255 , 255 , 255 , 255 , 255 , 254 , 254 , 253 , 252 , 252 , 251 , 250 , 249 , 248 , 247 , 246 ,
  245 , 243 , 242 , 240 , 239 , 237 , 236 , 234 , 232 , 230 , 229 , 227 , 225 , 222 , 220 , 218 ,
  216 , 214 , 211 , 209 , 206 , 204 , 201 , 199 , 196 , 194 , 191 , 188 , 185 , 183 , 180 , 177 ,
  174 , 171 , 168 , 165 , 162 , 159 , 156 , 153 , 150 , 147 , 144 , 140 , 137 , 134 , 131 , 128 ,
  125 , 122 , 119 , 116 , 112 , 109 , 106 , 103 , 100 , 97  , 94  , 91  , 88  , 85  , 82  , 79  ,
  76  , 73  , 71  , 68  , 65  , 62  , 60  , 57  , 55  , 52  , 50  , 47  , 45  , 42  , 40  , 38  ,
  36  , 34  , 31  , 29  , 27  , 26  , 24  , 22  , 20  , 19  , 17  , 16  , 14  , 13  , 11  , 10  ,
  9   , 8   , 7   , 6   , 5   , 4   , 4   , 3   , 2   , 2   , 1   , 1   , 1   , 1   , 1   , 1   ,
  1   , 1   , 1   , 1   , 1   , 2   , 2   , 3   , 4   , 4   , 5   , 6   , 7   , 8   , 9   , 10  ,
  11  , 13  , 14  , 16  , 17  , 19  , 20  , 22  , 24  , 26  , 27  , 29  , 31  , 34  , 36  , 38  ,
  40  , 42  , 45  , 47  , 50  , 52  , 55  , 57  , 60  , 62  , 65  , 68  , 71  , 73  , 76  , 79  ,
  82  , 85  , 88  , 91  , 94  , 97  , 100 , 103 , 106 , 109 , 112 , 116 , 119 , 122 , 125 , 128
};

مجموعه ای از مقادیر بدست امده توسط نرم افزار متلب برای تولید یک سیگنال سینوسی تمام موج که درون ارایه قرار داده ایم.از انجا که میکروکنترلر قادر به تولید سیگنال منفی نمی باشد شکل موج به همراه مقدار افست در نظر گرفته شده است.چون سیگنال ما توسط کدهای 8 بیتی تولید می شود و کمترین مقدار ان یعنی کد صفر باینری و بیشترین مقدار ان یعنی کد 255 باینری و بنابراین افست خود را در حد وسط یعنی کد باینری 128 تنظیم می کنیم.از کد 128 به بالا مقادیر برای نیم سیکل مثبت و از کد 128 به پایین برای مقادیر منفی سیگنال می باشد.

void setup() {

  DDRD = 0xFF;

همه ی پایه های پورت D را در حالت خروجی قرار می دهیم

  PORTD = 0x00;

و مقدار صفر را بعنوان مقدار پیش فرض در نظر می گیریم.

بخاطر افزایش سرعت در ارسال دیتا بجای تغییر وضعیت تک تک پایه ها می توانیم با پورت کار کنیم بنابراین تمام پایه های ای سی باید به به ترتیب به پایه های یک پورت 8 بیتی در میکروکنترلر متصل شوند.در اردوینو UNO فقط پورت D به صورت کامل در دسترس می باشد.

}

void loop() {

اگر به سیگنال مدولاسیون AM توجه شود می بینید که چند سیکل دامنه انها از کم شروع به زیاد شدن می کنند و سپس چند سیکل بعد مقدار دامنه ها انها ازمقدار حداکثری به تدریج شروع به کاهش می نمایند و همین روال دوباره تکرار می شود.

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

for (uint8_t t = 9; t > 2; t--) {

تکرار به تعداد سیکلهای دلخواه خود

    for (uint16_t i = 0; i < 256; i++) {

هر سیکل 256 مقدار باینری را داراست تا یک موج سینوسی تمام موج حاصل شود.

      PORTD = (sine[i] / t) + (128 -(128 / t));

      delayMicroseconds(78);

تاخیر برای تولید سیگنال حامل با فرکانس دلخواه

ما برای هر سیکل باید 256 بار مقداردهی انجام دهیم (دیتای خانه های ارایه را از خانه صفر تا خانه 255 به پورت D ارسال نماییم)

حال اگر بخواهیم سیگنال حامل ما 50 هرتسی باشد تناوب فرکانس ما 20 میلی ثانیه بدست می اید که با تقسیم ان بر عدد 256 تقریبا باید هر 78 میکروثانیه یکی از مقادیر خانه ارایه را به پورت ارسال نماییم تا سیگنال شکل کامل به خود بگیرد.

}

  }

  for (uint8_t t = 2; t < 10; t++) {

تکرار برای چند سیکل کاهشی

for (uint16_t i = 0; i < 256; i++) {

      PORTD = (sine[i] / t) + (128 - (128 / t));

      delayMicroseconds(78);
    }

  }



}

در حلقه تکرار متغییر t علاوه بر مشخص کردن تعداد سیکلها برای افزایش یا کاهش دامنه سیگنال سینوسی حامل بصورت نمادین نیز استفاده می شود

for (uint16_t i = 0; i < 256; i++) {

      PORTD = (sine[i] / t) + (128 - (128 / t));

بنابراین با تقسیم مقادیر ارایه بر عدد t می توانیم دامنه ان را بزرگتر یا کوچکتر نماییم.هر چقدر عدد t به یک نزدیکتر دامنه بزرگتر و هر چقدر عدد t بیشتر شود مقدار دامنه کاهشی تر خواهد بود.

{

یکی از مشکلات این باشد که با تقسیم مقادیر ارایه بر عدد t مقدار افست نیز تغییر می کند و حتی مقدار افست هر سیکل تولیدی با سیکل بعدی متفاوت خواهد بود (نا متقارنی و بهم ریختگی سیگنال) برای رفع این مشکل مقدار ارایه باید دوباره با مقدار افست جمع شود ولی این بار مقدار افست بجای عدد ثابت 128 به نسبت مقدار تضعیف شده (مقدار تضعیف شده بخاطر عدد t) به سیگنال اصلی اضافه می شود.

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

 

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

 

حال می خواهیم بصورت واقعی تر جلو برویم و سیگنال پیام خود را توسط ADC میکروکنترلر بخوانیم و تغییرات ان را روی دامنه سیگنال حامل اعمال نماییم.

از انجا که مبدل انالوگ به دیجیتال میکروکنترلر قادر به اندازه گیری مقادیر منفی نمی باشد توسط اپ امپ U3 سیگنال خود را روی یک ولتاژ DC سوار می کنیم.مقدار ولتاژ DC یا افست توسط مقاومتهای R6 و R7 مشخص می شود.

نکته : مقدار ولتاژ افست باید مساوی یا بیشتر از پیک سیگنال باشد تا تمام سیگنال بصورت کامل توسط ADC قابل اندازه گیری شود البته تا جایی که از مقدار مجاز 5 ولت عبور نکند.

در برنامه جدید تنها تغییرات در قسمت حلقه loop می باشد که به توضیحات ان می پردازیم:

void loop() {

    float t = (analogRead(A0) * 5) / 1023;

خواندن از مبدل ADC و رسیدن به مقدار ولتاژ واقعی توسط فرمول بالا

    for (uint16_t i = 0; i < 256; i++) {

      PORTD = (sine[i] / t) + (128 -(128 / t));

در اینجا مقدار متغییر t بجای عدد شبیه سازی شده حاصل از مقدار دامنه سیگنال پیام می باشد.

delayMicroseconds(78);
    }


}

هدف این پروژه اشنا کردن کاربر با مفهوم مدولاسیون AM می باشد و در عمل تولید سیگنال AM برای ارسال و دریافت نکات بیشتری را در بر می گیرد.در ادامه می توانید فایل برنامه و شبیه سازی را دانلود نمایید.

دانلود فایل

 

دیدگاهتان را بنویسید!

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

گیل الکترونیک
سبد خرید
empty basket

هیچ محصولی در سبد خرید نیست.