PDA

View Full Version : AVR



zohreh88
چهارشنبه 07 مرداد 1388, 16:37 عصر
سلام
من یک سوالی درمورد تایمر avrدارم. می خواهم برنامه ای بنویسم که سه پالس با دوره تناوب متفاوت را به صورت پیوسته تولید کند . اما فقط می توانم که این پالسها را جداگانه هر کدام را توسط یکی از تایمرها بسازم اما نمی دانم چگونه باید آنها را پشت سر هم روی یک پایه قرار دهم؟؟؟؟؟؟لطفا هر کسی که می داند راهنمایی کند:متفکر:

farzadsw
چهارشنبه 07 مرداد 1388, 21:07 عصر
پالس ها 0و1 هستن دیگه ؟ در اونصورت اگه 3تاشون رو رو یه پایه بگذارید چیز جالبی نمیشه ها ! انگار اجتماع گرفتید!
در هر صورت ، شما ب.م.م این سه دوره رو بگیرید .
یدونه تایمر با interval برابر اون ب.م.م تعریف کنید . پالس ها رو متناسب با دوره شون( بعد از n تا interval) درست کنید . (با تعریف یه متغیر که تو هر interval یکی زیاد بشه و دستور if)

zohreh88
پنج شنبه 08 مرداد 1388, 09:29 صبح
علت اینکه می خوام سه تاشو رو یه پایه بذارم اینه که در واقع اون شکل موجی که من میخوام به این صورته که ابتدا به اندازه 2 میکرو ثانیه high باشد 998 میکروثانیه low سپس 2میکروثانیه high و 498 میکروثانیه low وبعد 2میکرو ثانیه high و 98 میکروثانیه low وبه همین ترتیب پشت سر هم تکرار شوند ، در ضمن منظورتون رو از interval متوجه نشدم ،من باcodevision کار می کنم.:افسرده:

farzadsw
پنج شنبه 08 مرداد 1388, 18:28 عصر
ابتدا اینو بگم که با توجه به فرکانس و سرعت میکرو ؛ زمان 2 میکرو ثانیه خیلی کوتاهه و شما باید حدود 50 میکرو ثانیه در نظر بگیرید
شما یه تایمر رو تنظیم کنید هر 50 میکرو ثانیه وقفش عمل کنه (این یعنی مفهوم interval ) .
بعد یه متغیر تعریف کنید که تو هر بار اجرای وقفه یه واحد بهش اضافه بشه (برای جلوگیری از سرریز میتونید وقتی مثلا 20 شد ،صفرش کنید)
حالا یه دستور if بگذارید تا با مقایسه اون متغییر با یکسری ضرایب (پایین توضیح میدم) ، پایه رو 0 یا 1 کنه.

ضرایب :
اگه فرض کنیم پاسها به صورت 50-950 و 50-450 و 50-50 باشن . ضرایب به ترتیب میشن
1 (قبلا تعریف کردیم وقتی متغییر به 20 میرسه 0 بشه)
1 و 10
1و3و5و7و9و11و13و15و17و19

zohreh88
شنبه 10 مرداد 1388, 09:56 صبح
چه جوری بنویسم که هر 50 میکروثانیه یک اینتراپت بده؟
اینو می دونم که تایمرها دو نوع اینتراپت دارند :یکی برای وقتی هستش که over flow میشن و یکی هم برای compare ، یعنی زمانی که رجیسترهای TCNT وOCR با هم برابر شوند. که با اولی مقدار top value یعنی 255 تعیین میکنه که چه وقت اینتراپت بده ...آها!...منظورتون اینه که هر 50 میکروثانیه overflow بشه؟:متفکر:

zohreh88
شنبه 10 مرداد 1388, 11:27 صبح
اما باز هم نشد :گریه:من برنامه رو اینطوری نوشتم که هر 50us یک اینتراپت over flow بده و داخل روتین اینتراپت یک متغیری که هر بار یکی اضافه بشه،و بعد تابع if به اینصورت:

int count=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xC2;
count++;
if (count==1)
{
PORTA.1=1;
}
if (count==2)
{
PORTA.1=0;
}
if (count==3)
{
PORTA.1=1;
}
if (count==4)
{
PORTA.1=0;
count=0;
}
if (count==5)
{
PORTA.1=0;
count=0;
}

و انتظار داشتم دو پالس به صورت:50 - 50 و 50 - 300 بسازه اما چیزی که ساخت یک پالس 50- 50 که تازه پالس هم نیست تغییر بین 0و1 بصورت شیبداره و دامنه اش 1 ولت روی سطح dc چهار ولت هستش:عصبانی:

farzadsw
شنبه 10 مرداد 1388, 19:02 عصر
فکر کنم اشکال به دلیل فرکانس بالایی باشه که تعریف کردید ، جهت اطمینان اون 50 میکرو رو بکنید ، 1 میلی(!) (چون موج 1 KHz رو دیدم با میکرو درست کردن). البته تو دیتا شیت هم حداکثر فرکانس i/o میکرو رو مینویسه.
*این چند وقت سرم یکم شلوغه درست حسابی نمیتونم جواب بدم!

zohreh88
یک شنبه 11 مرداد 1388, 14:07 عصر
وقتی 1ms میذارم شکل بهتر میشه اما هنوزم شکل موج اون حالت خازنی رو داره یعنی وقتی میخواد صفربشه شیب داره.اما به هر حال من فرکانس بالا میخوام و میدونم که میکرو میتونه بده چون روی پایه OC که خروجی تایمر هستش من حتی دوره تناوب ns هم میتونم بسازم اما روی پورت دیگه که دستی میخوام صفر و یک کنم این مشکل پیش میاد! :ناراحت::افسرده:
به هر حال ممنونم که وقت گذاشتید.

aynehband
چهارشنبه 14 مرداد 1388, 23:20 عصر
بگرد یک opampخوب پیدا کن که بتونه برات حالت خازنی رو کاهش بده، اگر op-amp خوبی پیدا کنی که با فرکانست سازگار باشه به محض گدشتن از ولتاژ مقایسه ، خیلی سریع به صفر میل میکنه

zohreh88
پنج شنبه 15 مرداد 1388, 13:14 عصر
باشه این تست رو انجام میدم. مرسی

zohreh88
شنبه 17 مرداد 1388, 11:15 صبح
با این راه هم حل نشد .آخه مشکل اینجاست که میکرو دوره تناوب کمتر از 1ms را نمیتونه بسازه یعنی همش high میشه و مقایسه کننده نمیتونه تشخیص بده.اون حالت خازنی که گفتم برای زمانی هستش که دوره تناوب رو زیاد میکنم که این چیزی نیست که من میخوام.

hh_amiri2004
دوشنبه 19 مرداد 1388, 00:06 صبح
آقای farzadsw
ممنون از پاسختون به سوالم در مورد پروژه ی finger print.
ولی من فعلا فقط می خوام کد بزنم و در proteus شبیه سازی کنم.
مشکلم عدم آشنایی با کد زدنه، یعنی نمی دونم چی باید بنویسم تا میکروکنترلر با سنسور ارتباط برقرار کنه!

farzadsw
دوشنبه 19 مرداد 1388, 11:33 صبح
البته منظورم از تاپیک avr این یکی بود:
http://barnamenevis.org/forum/showthread.php?p=777130#post777130
اونجا توضیح دادم.

farzadsw
دوشنبه 19 مرداد 1388, 11:51 صبح
با این راه هم حل نشد .آخه مشکل اینجاست که میکرو دوره تناوب کمتر از 1ms را نمیتونه بسازه یعنی همش high میشه و مقایسه کننده نمیتونه تشخیص بده.اون حالت خازنی که گفتم برای زمانی هستش که دوره تناوب رو زیاد میکنم که این چیزی نیست که من میخوام.

راستی ، شما با دیود امتحان کردید ؟ یعنی مثلا 2تا موج روی 2تا پایه های timer (مثلا OC0 , OC2 تو atmega16 ) بسازید و هر کدوم رو به یه دیود بدید و طرف دیگه دیود ها رو به هم وصل کنید. البته تو این حالت 0.7 ولت به خاطر دیود ها ولتاژ کم میشه.

zohreh88
دوشنبه 19 مرداد 1388, 12:51 عصر
اگر این دیودها رو بذارم اونوقت انتظار داریم که در خروجی چی ببینیم؟یعنی پالسهای دو تا پایه رو یکی در میون می بینیم؟

farzadsw
دوشنبه 19 مرداد 1388, 15:58 عصر
اگر این دیودها رو بذارم اونوقت انتظار داریم که در خروجی چی ببینیم؟یعنی پالسهای دو تا پایه رو یکی در میون می بینیم؟
اگه اون پایه هارو مستقیم وصل کنید ، اگه یه پایه 0 بشه و اون یکی 1 ، خروجی (محل اتصال 2پایه) 0 میشه و در اصل and گرفته میشه که مورد نظر شما نیست (ممکنه که میکرو هم آسیب ببینه)
ولی اگه با دیود وصل کنید or مشن و اشکالی پیش نمیاد.
محل اتصال رو هم pullDown کنید ، یعنی یه مقاومت نسبتا زیاد مثلا 10 کیلو رو از یه طرف به زمین و از یه طرف به محل اتصال وصل کنید.

zohreh88
سه شنبه 20 مرداد 1388, 10:33 صبح
اگر خروجی دو تایمررا به این صورت فرض کنیم که دوره تناوب یکی نصف دوره تناوب دیگری باشه در این صورت که اگر با هم or بشن خب همیشه اون پالسی رو که دوره تناوب کمتر داره می بینیم که!

farzadsw
سه شنبه 20 مرداد 1388, 15:05 عصر
اگر خروجی دو تایمررا به این صورت فرض کنیم که دوره تناوب یکی نصف دوره تناوب دیگری باشه در این صورت که اگر با هم or بشن خب همیشه اون پالسی رو که دوره تناوب کمتر داره می بینیم که!

معلومه دیگه ، قبلا هم به شما گفتم شما با اینکار اجتماع (OR) میگرید و چیز جالبی نمیشه .

پالس ها 0و1 هستن دیگه ؟ در اونصورت اگه 3تاشون رو رو یه پایه بگذارید چیز جالبی نمیشه ها ! انگار اجتماع گرفتید!
اگه بد متوجه سوالتون شدم بگید.

zohreh88
چهارشنبه 21 مرداد 1388, 12:15 عصر
منظورم از اینکه میخوام سه تا پالس رو یه پایه بذارم این نیست که همزمان رو یه پایه سه تا پالس داشته باشم در واقع منظورم اینه که بعد از پایان پالس اولی ، پالس دومی باشه و بعد از پایان دومی، پالس سوم. من فکر می کنم با یه تایمر بشه هر بار دوره تناوب رو تغییر داد اما نمیدونم چه طوری؟:متفکر:

farzadsw
چهارشنبه 21 مرداد 1388, 22:39 عصر
منظورم از اینکه میخوام سه تا پالس رو یه پایه بذارم این نیست که همزمان رو یه پایه سه تا پالس داشته باشم در واقع منظورم اینه که بعد از پایان پالس اولی ، پالس دومی باشه و بعد از پایان دومی، پالس سوم. من فکر می کنم با یه تایمر بشه هر بار دوره تناوب رو تغییر داد اما نمیدونم چه طوری؟:متفکر:

دوره تناوب رو میشه به وسیله ctc top و یا clock value تغییر داد ، اگه (من امتحان نکردم ولی فکر کنم بشه) این مقادیر رو وسط برنامتون تغییر بدید ، یه دوره تناوب دیگه بدست میارید.

zohreh88
پنج شنبه 22 مرداد 1388, 12:01 عصر
دوره تناوب رو میشه به وسیله ctc top و یا clock value تغییر داد ، اگه (من امتحان نکردم ولی فکر کنم بشه) این مقادیر رو وسط برنامتون تغییر بدید ، یه دوره تناوب دیگه بدست میارید.

بله همینطوره در واقع من تونستم برنامش رو بنویسم که سه تا پالس با دوره تناوبهای مختلف درست کنه.حالا مشکل اینجاست که زمان high بودن سیگنال، محدودیت داره یعنی از 40us که کمتر می کنم(من 2us میخوام باشه)،شکل به هم میخوره (یعنی جای high و lowبرعکس میشه)و زیر 10us که دیگه اصلا همش high میشه!

farzadsw
پنج شنبه 22 مرداد 1388, 13:04 عصر
فکر کنم دیگه از اینجا به بعد محدودیت خود میکرو باشه. مثلا LPC23xx که یه میکروی ARM هست هم محدودیت داره . با اینکه خود میکرو فرکانس 50 مگاهرتز داره حداکثر میتونه 1/8 این مقدار رو پالس تولید کنه (اونم توی پایه های مخصوص و FAST) . یعنی حدود 6 مگ . البته سری AT91sam که باز یه میکروی ARM هست همین 6مگ رو هم نمیتونه تولید کنه.
من دیتاشیت atmega 32 رو یه نگاه اجمالی کردم چیزی در مورد محدودیت فرکانس خروجیش ندیدم ولی احتمالا تو همون دیتاشیتش (اگه با حوصله بخونید) نوشته .

farzadsw
پنج شنبه 22 مرداد 1388, 20:41 عصر
راستی ، یه سری ic مخصوص اینکار هستن که موج سینوسی ، مثلثی و مربعی رو با فرکانس بالا مثلا تا 50 مگ درست میکنن. به وسیله میکرو کنترلر هم برنامه ریزی میشن . مثل AD9835 یا AD9833
برای اطلاع بیشتر برید اینجا:
http://kavirelectronic.ir/fa/modules.php?name=News&file=article&sid=49&mode=&order=0&thold=0
فقط قیمتشون یکم زیاده ، البته آگهی های اینترنتی معمولا گرون تر از قیمت بازار میدن.

zohreh88
شنبه 24 مرداد 1388, 10:03 صبح
اگه اطمینان پیدا کردم که از محدودیت میکرو هستش میرم سراغ آی سی AD9833.
خیلی ممنون