امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
پروژه ی ایجاد موج سینوسی در خروجی avr
#1
Rainbow 
سلام دوستان
من می خواستم یک موج سینوسی کامل توی خروجی atmega16 داشته باشم و فقط از یکی از پایه های اون استفاده کنم.
من با استفاده از pwm میکرو و یک فیلتر در خروجی پین (البته خودم به صورت تجربی این فیلتر رو گذاشتم) تونستم یه موج نزدیک به سینوسی بدست بیارم. اما سینوسی کامل نیست. در خروجی هم نیاز به تقویت کننده داره که من گذاشتم کامل بشه بعد بذارم.
مشکل اینجاست که برنامه من به این صورته که یه خروجی pwm توی خروجی ایجاد میکنه که مقدار ocr که پهنای پالس هست از صفر تا صد در صد یکی یکی اضافه میشه تا به صد در صد برسه اون وقت دوباره یکی یکی کم میشه تا صفر.
کد:
{
      unsigned int i;
       for (i=0;i<100;i++)
       {    
       OCR0=i;
       delay_ms(10);
       }
       for (i=100;i>1;i--)
       {                  
       OCR0=i;
       delay_ms(10);
       }
      }
همونطور که تو فایل پیوست میبینید اثر این موج بیشتر شبیه موج مثلثی میشه تا سینوسی(مثلا اگه یه لامپ یا موتور داشته باشیم چیزی که با چشم میبینیم اینه که دور موتور به صورت خطی اضافه و کم میشه مثل اینکه یه موج مثلثی داده باشیم بهش!) و اگه از فیلترش کنیم بازدهمون کمتر میشه.
خوب حالا من یه تابع به جای i++ میخوام که اون اثر که گفتم مثل موج سینوسی بشه.
ببخشید اگه یه خورده پیچیده یا گنگ توضیح دادم.
نظرتون چیه؟ هم درباره ی فیلتر هم پروگرام و...At


فایل‌(های) پیوست شده
.rar   pwm17.rar (اندازه: 29.2 KB / تعداد دفعات دریافت: 34)
پاسخ
 سپاس شده توسط polestar
#2
خوبه، میشه یه کم بیشتر توضیح بدی؟Huh
دوست دارم بزرگ شوم...
پاسخ
#3
(20-9-1391، 11:58 عصر)MRGH نوشته است: سلام دوستان
من می خواستم یک موج سینوسی کامل توی خروجی atmega16 داشته باشم و فقط از یکی از پایه های اون استفاده کنم.
من با استفاده از pwm میکرو و یک فیلتر در خروجی پین (البته خودم به صورت تجربی این فیلتر رو گذاشتم) تونستم یه موج نزدیک به سینوسی بدست بیارم. اما سینوسی کامل نیست. در خروجی هم نیاز به تقویت کننده داره که من گذاشتم کامل بشه بعد بذارم.
مشکل اینجاست که برنامه من به این صورته که یه خروجی pwm توی خروجی ایجاد میکنه که مقدار ocr که پهنای پالس هست از صفر تا صد در صد یکی یکی اضافه میشه تا به صد در صد برسه اون وقت دوباره یکی یکی کم میشه تا صفر.
کد:
{
      unsigned int i;
       for (i=0;i<100;i++)
       {    
       OCR0=i;
       delay_ms(10);
       }
       for (i=100;i>1;i--)
       {                  
       OCR0=i;
       delay_ms(10);
       }
      }
همونطور که تو فایل پیوست میبینید اثر این موج بیشتر شبیه موج مثلثی میشه تا سینوسی(مثلا اگه یه لامپ یا موتور داشته باشیم چیزی که با چشم میبینیم اینه که دور موتور به صورت خطی اضافه و کم میشه مثل اینکه یه موج مثلثی داده باشیم بهش!) و اگه از فیلترش کنیم بازدهمون کمتر میشه.
خوب حالا من یه تابع به جای i++ میخوام که اون اثر که گفتم مثل موج سینوسی بشه.
ببخشید اگه یه خورده پیچیده یا گنگ توضیح دادم.
نظرتون چیه؟ هم درباره ی فیلتر هم پروگرام و...At

با سلام

دوست من شما بجای کم و زیاد کردن مقدار OCR به ترتیب یکی از مقادیر این جدول رو در OCR قرار بده

flash unsigned char sine[256]={
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c};


مشکلت حل میشه

له همین سادگی At
اگر مطلبی مفید بود سپــــاس واگر مفیدتر بود دادن اعتبار را فراموش نکنید dont
به پيغام خصوصي ها فقط در صورت واقعا خصوصي بودن پاسخ داده خواهد شد Confused

پاسخ
 سپاس شده توسط MRGH
#4
سلام و با تشکر
این هم راه خوبی هست ومن حتما اون رو امتحان میکنم اما اگه ممکنه یه تابع یا فرمول بهم بدید.چون فرمول کم حجم تره و زمان بندی برای تغییر فرکانس و... هم آسون تره. اگه اشتباه میکنم بگید.(بگید ولی بازم فرمولو بدید! چون نیاز دارم)At
پاسخ
 سپاس شده توسط polestar
#5
شکل موج تولیدی رو دیدم. به نظرم اگه همینو بیای دامنه هاش رو کاری کنی که سریع برنگرده و به صورت یه سهمی یا قوس باشه شکل موج سینوسی بشه.
تو برنامه هام ببینم یه همچین برنامه ای انگار داشتم. اگه پیدا کنم برات میذارمش.
هیچ چیز غیر ممکن نیست مگر شما آنرا غیر ممکن سازید
پاسخ
#6
Information 
سلام
رجیستر OCR0 یک رجیستر 8 بیتی است. پس تا 256 مقدار می‌گیرد. همچنین شما می‌خواهید یک سیکل سینوسی تولید کنید. یعنی 360 مقدار! حالا تنها کاری که باید انجام شود این است که مقدار 360 را به 256 برسانید تا بتوانید از آن ()Sin بگیرید. ابن کار با تقسیم 360/180 انجام می‌شود که نتیجه‌ی آن 1.40625 است. حالا شما به ازای بازه‌های زمانی ثابت (برای تولید موج منظم سینوسی) باید مقدار OCR0 را که از 128 (نقطه‌ی صفر موج سینوسی) شروع می‌شود به اندازه‌ی
(1.40625 + (OCR0 = 255 * sin((OCR0 * 1.40625
واحد افزایش دهید. با پر شدن این رجیستر، باید اقدام به کاهش این رجیستر کنید تا به صفر برسد و مجدداً شروع به افزایش کنید. این کار را تا زمانی که موج باید تشکیل شود، ادامه دهید.

نکته 0: محاسبات شما باید اعشاری باشند، اما مقدار نهایی قبل از قرار گرفتن در رجیستر OCR0 باید به عدد صحیح تبدیل شود.
نکته 1: بازه‌های زمانی ثابت به دلخواه شما تعیین می‌شوند.
نکته 2: کم یا زیاد کردن بازه‌های زمانی باعث بازتر یا فشرده‌تر شدن موج سینوسی حاصل می‌شود.
نکته 3: با کم کردن عدد 255 ذکر شده در فرمول بالا می‌توان دامنه‌ی موج را کم‌تر کرد.

** مشاهده می‌شود که این کار از لحاظ محاسباتی برای CPU بسیار سنگین است. چون ابن 256 عدد به دست آمده همیشه ثابت هستند، بهترین کار، استفاده از جدولی است که از این محاسبات به دست می‌آید. من فکر می‌کنم جدولی که آقای MRGH ذکر کردند به روشی مشابه همین الگوریتم آماده شده است.

*** نوشته‌ها برای این که به صورت مناسب دیده شوند، کمی پس و پیش نوشته شدند. اگر آن‌ها را کپی کردید، حتماً قسمت‌های انگلیسی را بررسی و در صورت نیاز به صورت دستی اصلاح کنید.

**** به خاطر این که کلاس دانشگاهم دیر شده، باید زودتر بروم. اگر احیاناً به خاطر عجله، ایرادی سهوی در این نوشتار مشاهده شد، پیشاپیش عذرخواهی می‌کنم.
پاسخ
 سپاس شده توسط MRGH ، polestar
#7
سلام آی سی DAC برای همین موضوع ساخته شده با دقت خیلی بالاتر این کارا برا چیه؟؟؟
پاسخ
 سپاس شده توسط d2006h
#8
نقل قول: mohammad_amin:
** مشاهده می‌شود که این کار از لحاظ محاسباتی برای CPU بسیار سنگین است. چون ابن 256 عدد به دست آمده همیشه ثابت هستند، بهترین کار، استفاده از جدولی است که از این محاسبات به دست می‌آید. من فکر می‌کنم جدولی که آقای MRGH ذکر کردند به روشی مشابه همین الگوریتم آماده شده است.
*** نوشته‌ها برای این که به صورت مناسب دیده شوند، کمی پس و پیش نوشته شدند. اگر آن‌ها را کپی کردید، حتماً قسمت‌های انگلیسی را بررسی و در صورت نیاز به صورت دستی اصلاح کنید.
از شما به خاطر توضیح زیباتون متشکرم.
اون جدول پیشنهاد آقای polestar بود.
نوشته ها هم مال خودم بود و از جای دیگه ای بر نداشتم فایل پیوست هم همینطور و باز هم اگه مطلبی گنگ بود عذرخواهی میکنم.
نقل قول: ariahope:
سلام آی سی DAC برای همین موضوع ساخته شده با دقت خیلی بالاتر این کارا برا چیه؟؟؟
این کارا برای استفاده از فقط یک پایه از میکرو هست.
پاسخ
 سپاس شده توسط polestar
#9
(21-9-1391، 12:40 صبح)MRGH نوشته است: سلام و با تشکر
این هم راه خوبی هست ومن حتما اون رو امتحان میکنم اما اگه ممکنه یه تابع یا فرمول بهم بدید.چون فرمول کم حجم تره و زمان بندی برای تغییر فرکانس و... هم آسون تره. اگه اشتباه میکنم بگید.(بگید ولی بازم فرمولو بدید! چون نیاز دارم)At

1 - محاسبه سینوس و کسینوس و در کل محاسبات ممیزدار به صورت فرمول برای کلیه میکروهای 8 بیت واقعا سنگینه
2 - چون قراره این کار به صورت یک لوپ ثابت همیشه تکرار بشه پس نیازی به محاسبه نخواهد بود
پس بهترین و سریعترین و کم حجم ترین (در رم و فلش) روش استفاده از جدول های 8 یا 10 یا 16 بیت هست

به همین سادگیAt
اگر مطلبی مفید بود سپــــاس واگر مفیدتر بود دادن اعتبار را فراموش نکنید dont
به پيغام خصوصي ها فقط در صورت واقعا خصوصي بودن پاسخ داده خواهد شد Confused

پاسخ
#10
خوب من کنجکاو بودم که بدونم و شاید میخواستم از میکرو های قویتر مثل ARM استفاده کنم.
اگه از این روش استفاده کنیم میتونیم با دادن هر تابعی به میکرو، شکل موج اون رو در خروجی ببینیم.
البته اگه از ARM ها یا xmega هایی استفاده کنیم که DAC داشته باشن دیگه نیازی به PWM و فیلتر نیست و میتونیم مستقیما شکل خروجی رو بگیریم.At
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  سوال و مشکل با کلاک پروژه makebiyaban 0 469 10-12-1396، 09:39 عصر
آخرین ارسال: makebiyaban
  پروژه های تکمیل شده AVR polestar 43 39,525 16-1-1396، 10:06 صبح
آخرین ارسال: blacksmart2017
  کنترل لوازم با خط تلفن با خروجی لحظه ای parham144 22 7,015 9-4-1394، 03:11 عصر
آخرین ارسال: Last_Days
  ایجاد پالس های میکرو ثانیه ای تا avr saied20 1 551 31-3-1394، 02:18 عصر
آخرین ارسال: iman d
  پروژه تابلو روان avr (بسیار مهم) mostafaamiryan 0 684 22-10-1393، 02:29 صبح
آخرین ارسال: mostafaamiryan
  پالس خروجی با قابلیت تغییر duty cycle و فرکانس Matin91 0 557 30-4-1393، 05:53 صبح
آخرین ارسال: Matin91
  ایجاد میدان مغناطیسی با ای وی آر Matin91 4 914 24-4-1393، 12:06 صبح
آخرین ارسال: Matin91
  ایجاد میدان مغناطیسی با ای وی آر Matin91 0 446 18-4-1393، 08:22 صبح
آخرین ارسال: Matin91
Star **||مشکل در پروژه Mp3Player با Atmega128 و Vs1003 ||** lionheart 0 752 4-4-1393، 01:46 عصر
آخرین ارسال: lionheart
  مشکل پروژه ارتباط سریال Usart behroz2010 11 2,727 5-9-1392، 06:30 عصر
آخرین ارسال: behroz2010

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان