نمایش نتایج 1 تا 24 از 24

نام تاپیک: AVR

  1. #1

    AVR

    سلام
    من یک سوالی درمورد تایمر avrدارم. می خواهم برنامه ای بنویسم که سه پالس با دوره تناوب متفاوت را به صورت پیوسته تولید کند . اما فقط می توانم که این پالسها را جداگانه هر کدام را توسط یکی از تایمرها بسازم اما نمی دانم چگونه باید آنها را پشت سر هم روی یک پایه قرار دهم؟؟؟؟؟؟لطفا هر کسی که می داند راهنمایی کند

  2. #2

    نقل قول: AVR

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

  3. #3

    نقل قول: AVR

    علت اینکه می خوام سه تاشو رو یه پایه بذارم اینه که در واقع اون شکل موجی که من میخوام به این صورته که ابتدا به اندازه 2 میکرو ثانیه high باشد 998 میکروثانیه low سپس 2میکروثانیه high و 498 میکروثانیه low وبعد 2میکرو ثانیه high و 98 میکروثانیه low وبه همین ترتیب پشت سر هم تکرار شوند ، در ضمن منظورتون رو از interval متوجه نشدم ،من باcodevision کار می کنم.

  4. #4

    نقل قول: AVR

    ابتدا اینو بگم که با توجه به فرکانس و سرعت میکرو ؛ زمان 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

  5. #5

    نقل قول: AVR

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

  6. #6

    نقل قول: AVR

    اما باز هم نشد من برنامه رو اینطوری نوشتم که هر 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 چهار ولت هستش

  7. #7

    نقل قول: AVR

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

  8. #8

    نقل قول: AVR

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

  9. #9
    کاربر دائمی آواتار aynehband
    تاریخ عضویت
    تیر 1384
    محل زندگی
    اهواز
    پست
    111

    نقل قول: AVR

    بگرد یک opampخوب پیدا کن که بتونه برات حالت خازنی رو کاهش بده، اگر op-amp خوبی پیدا کنی که با فرکانست سازگار باشه به محض گدشتن از ولتاژ مقایسه ، خیلی سریع به صفر میل میکنه

  10. #10

    نقل قول: AVR

    باشه این تست رو انجام میدم. مرسی

  11. #11

    نقل قول: AVR

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

  12. #12

    نقل قول: AVR

    آقای farzadsw
    ممنون از پاسختون به سوالم در مورد پروژه ی finger print.
    ولی من فعلا فقط می خوام کد بزنم و در proteus شبیه سازی کنم.
    مشکلم عدم آشنایی با کد زدنه، یعنی نمی دونم چی باید بنویسم تا میکروکنترلر با سنسور ارتباط برقرار کنه!

  13. #13

    نقل قول: AVR

    البته منظورم از تاپیک avr این یکی بود:
    https://barnamenevis.org/showth...130#post777130
    اونجا توضیح دادم.

  14. #14

    نقل قول: AVR

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

  15. #15

    نقل قول: AVR

    اگر این دیودها رو بذارم اونوقت انتظار داریم که در خروجی چی ببینیم؟یعنی پالسهای دو تا پایه رو یکی در میون می بینیم؟

  16. #16

    نقل قول: AVR

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

  17. #17

    نقل قول: AVR

    اگر خروجی دو تایمررا به این صورت فرض کنیم که دوره تناوب یکی نصف دوره تناوب دیگری باشه در این صورت که اگر با هم or بشن خب همیشه اون پالسی رو که دوره تناوب کمتر داره می بینیم که!

  18. #18

    نقل قول: AVR

    نقل قول نوشته شده توسط zohreh88 مشاهده تاپیک
    اگر خروجی دو تایمررا به این صورت فرض کنیم که دوره تناوب یکی نصف دوره تناوب دیگری باشه در این صورت که اگر با هم or بشن خب همیشه اون پالسی رو که دوره تناوب کمتر داره می بینیم که!
    معلومه دیگه ، قبلا هم به شما گفتم شما با اینکار اجتماع (OR) میگرید و چیز جالبی نمیشه .
    پالس ها 0و1 هستن دیگه ؟ در اونصورت اگه 3تاشون رو رو یه پایه بگذارید چیز جالبی نمیشه ها ! انگار اجتماع گرفتید!
    اگه بد متوجه سوالتون شدم بگید.

  19. #19

    نقل قول: AVR

    منظورم از اینکه میخوام سه تا پالس رو یه پایه بذارم این نیست که همزمان رو یه پایه سه تا پالس داشته باشم در واقع منظورم اینه که بعد از پایان پالس اولی ، پالس دومی باشه و بعد از پایان دومی، پالس سوم. من فکر می کنم با یه تایمر بشه هر بار دوره تناوب رو تغییر داد اما نمیدونم چه طوری؟

  20. #20

    نقل قول: AVR

    نقل قول نوشته شده توسط zohreh88 مشاهده تاپیک
    منظورم از اینکه میخوام سه تا پالس رو یه پایه بذارم این نیست که همزمان رو یه پایه سه تا پالس داشته باشم در واقع منظورم اینه که بعد از پایان پالس اولی ، پالس دومی باشه و بعد از پایان دومی، پالس سوم. من فکر می کنم با یه تایمر بشه هر بار دوره تناوب رو تغییر داد اما نمیدونم چه طوری؟
    دوره تناوب رو میشه به وسیله ctc top و یا clock value تغییر داد ، اگه (من امتحان نکردم ولی فکر کنم بشه) این مقادیر رو وسط برنامتون تغییر بدید ، یه دوره تناوب دیگه بدست میارید.

  21. #21

    نقل قول: AVR

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

  22. #22

    نقل قول: AVR

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

  23. #23

    نقل قول: AVR

    راستی ، یه سری ic مخصوص اینکار هستن که موج سینوسی ، مثلثی و مربعی رو با فرکانس بالا مثلا تا 50 مگ درست میکنن. به وسیله میکرو کنترلر هم برنامه ریزی میشن . مثل AD9835 یا AD9833
    برای اطلاع بیشتر برید اینجا:
    http://kavirelectronic.ir/fa/modules...rder=0&thold=0
    فقط قیمتشون یکم زیاده ، البته آگهی های اینترنتی معمولا گرون تر از قیمت بازار میدن.

  24. #24

    نقل قول: AVR

    اگه اطمینان پیدا کردم که از محدودیت میکرو هستش میرم سراغ آی سی AD9833.
    خیلی ممنون

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •