اطلاعیه

Collapse
No announcement yet.

درخواست کمک، مدولاسیون fsk با AVR

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #31
    پاسخ : درخواست کمک، مدولاسیون fsk با AVR

    نوشته اصلی توسط marychi
    درود

    اولا ورودی های کلید رو خروجی تعریف کردی. (درستش کن)
    دوما ترجیحا ولتاژ انالوگ رو به میکرو نده. چون جالتهای نا معلوم درش بوجود میاد. می تونی از comparator خارجی و یا خود میکرو استفاده کنی.
    سوما، اول و اخر دیتا رو چطور متوجه میشی؟ باید یه روش مثل سریال که stop bit و start bit داره (هدر) براش در نظر بگیری.
    چهارما چون سیگنالت کاملا فیلتر نمیشه، و دارای ریپل هست، اگه مثلا به comparator بدی هنگام عبور از سطح استانه تو، چند تا پالس اضافی ایجاد میشه که تشخیص رو مشکل میکنه. البته اگه برنامه دیتکتور تو درست نوشته شده این موضوع در برنامه حل شدنیه. (من نمی دونم چطور نوشتی برنامت رو)
    اولی رو درست کردم.
    دومی رو آخر سر انجام میدم چون تو مداری که ساختم دستی پایه هارو یک و 0 میکنم ببینم درست کار میکنه یا نه بعد مشکل آنالوگش رو حل میکنم.
    سوم هم چون تو فرستنده مشخص کردم که هر سینوسی 100 میلی ثانیه طولش باشه تو گیرنده هم گفتم هر 100 میلی ثانیه یه بار فرکانس رو اندازه بگیر. راستش مورد سوم رو کار دیگه ای بلد نیستم انجام بدم. این هدری که میگید باید به اولو آخر بیتهام یه سری بیت مشحص اضافه کنم؟ مثلا 3تا یک؟

    برنامه گیرندم به این صورته:
    کد:
     {   
    
       TCCR0=0x06;   // Start Timer T0 pin Falling Edge        //0
       #asm("sei")   // Global enable interrupts
       delay_ms(100);
       #asm("cli");  // Global disable interrupts
       in_freq = timer0_ov * 256 + TCNT0;
       sprintf(lcd_buff,"%d",in_freq);
       lcd_puts(lcd_buff);
       
       if (in_freq>a)
       {
       PORTD.0=1;   
       }
       else if (in_freq<a)
       {
       PORTD.0=0;   
       }
       
       TCCR0=0x00;  //Stopt Timer0
       timer0_ov=0;  //Prepare for next count
       TCNT0=0;    //Clear Timer0
       };
    البته این برای پایه صفرمه همین کدهارو برای 7 پایه دیگه تکرار کردم.
    پارامتر a هم با سعی و خطا یه مقداری براش بدست میارم.

    دیدگاه


      #32
      پاسخ : درخواست کمک، مدولاسیون fsk با AVR

      نوشته اصلی توسط RubeuS
      خوب حالا شد . بهترم بود همون اول اینو میگفتید: " من یک موج سینوسی دارم میخوام ببینم فرکانسش چقدره" جزئیات دیگه لازم نیست

      همون طور که گفتم به هیچ عنوان سینوسی رو نباید به پین های i/o دیجیتال میکرو بدید.
      شما همون سینوسی رو بدید به یکی از ورودی های adc میکرو ( یک پین از پورت A (برای مگا16 ، مگا32 و... ) )
      بعدشم باید بگید رنج فرکانس سینوسی چقدره . بعد از اون میتونید با استفاده از واحد adc در مد auto trigger و با استفاده از تایمر به صورت مرتب در فاصله زمانی های مناسب از مقدار ورودی نمونه برداری کنید و با مقایسه اون با دفعه قبل میتونید فرکانس سینوسی را بدست آورید.
      خیلی عالیه.
      برای تسریع کار میشه یک نمونه کد بهم معرفی کنید که من بهتر آشنا بشم؟
      اگه بتونید خیلی کمکم میکنید منم الان شروع میکنم به سرچ در همین زمینه.

      دیدگاه


        #33
        پاسخ : درخواست کمک، مدولاسیون fsk با AVR

        اگر میبینید که اینکار مشکله و میخواید موج ینوسی رو به i/o معمولی میکرو بدید ، بایستی قبلش مداری طراحی کنید که ورودیش سینوسی باشه و خروجیش فقط در صورتی که به سینوسی به قله رسید 1 ( 5 ولت) بشه. در اینصورت میتونید با استفاده از خروجی این مدار به میکرو وقفه بدید و همون طور که دوستمون هم گفتن ، در روتین وقفه تایمر ست کنید و با ایجاد وقفه بعدی مقدار تایمر را بخونید و اینطوری بفهمید فرکانس موج سینوسی چقدره.
        اگر میخواهید از این روش استفاده کنید ، تمرین 4 از لینک زیر میتونه کمکتون کنه:
        http://mortazavi91.mihanblog.com/
        راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
        انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

        دیدگاه


          #34
          پاسخ : درخواست کمک، مدولاسیون fsk با AVR

          نوشته اصلی توسط RubeuS
          اگر میبینید که اینکار مشکله و میخواید موج ینوسی رو به i/o معمولی میکرو بدید ، بایستی قبلش مداری طراحی کنید که ورودیش سینوسی باشه و خروجیش فقط در صورتی که به سینوسی به قله رسید 1 ( 5 ولت) بشه. در اینصورت میتونید با استفاده از خروجی این مدار به میکرو وقفه بدید و همون طور که دوستمون هم گفتن ، در روتین وقفه تایمر ست کنید و با ایجاد وقفه بعدی مقدار تایمر را بخونید و اینطوری بفهمید فرکانس موج سینوسی چقدره.
          اگر میخواهید از این روش استفاده کنید ، تمرین 4 از لینک زیر میتونه کمکتون کنه:
          http://mortazavi91.mihanblog.com/
          والا از دیروز دارم با این سرو کله میزنم یکم برای من سخته. با تحقیقی هم که کردم دیدم انگار دقت adc بالاتر از استفاده از وقفست.
          به نظر شما کدوم رو انجام بدم بهتره؟ از جهت اینکه سریعتر به نتیجه برسم و برای من که مبتدی هستم هم ساده باشه و هم بتونم از شما کمک بگیرم.

          دیدگاه


            #35
            پاسخ : درخواست کمک، مدولاسیون fsk با AVR

            اول ورودی رو با comparator داخلی یا خارجی دیجیتال کن.
            بعد یه اینتراپت تعریف کن که با اومدن لبه، بره توی روتین اون. توی روتین یک تایمر ست کن. توی لبه بعدی مقدار تایمر رو بخون. اگه حدود دوره تناوب مربوط به فرکانس f1 بود مثلا 0 و اگر حدود f2 بود یعنی 1 هست. برای راحتی کار هر بیت رو توی متغیر بریز. اگه تعداد مشخصی بیت گرفتی از ورودی برو ببین دیتا valid هست یا نه.

            همونطور که گفتم اول و اخر دیتا هنگام ارسال، بیت یا بیتها و یا حتی بایت های مشخصی اضافه کن.
            در گیرنده اگر اول و اخر دیتایی که خوندی برابر این مقدار ثابت بود، یعنی دیتا valid هست. در غیر این صورت خطا داری و یا اشتباه خوندی دیتا رو.

            یک مسئله دیگه اینه که من هنوز نفهمیدم چرا داری fsk کار می کنی. چرا با همون سریال این کار رو نمی کنی. چون به هر حال کاری که میکنی شبیه سریال هست با این تفاوت که مبکرو خودش فرستنده و گینده شو داره.
            مـن هیچ ندانم که مرا آن که سرشت
            از اهل بهشت کرد یا دوزخ زشت
            جامی و بتی و بربطی بر لب کشت
            این هر سه مرا نقد و تو را نسیه بهشت

            دیدگاه


              #36
              پاسخ : درخواست کمک، مدولاسیون fsk با AVR

              نوشته اصلی توسط nibilala
              والا از دیروز دارم با این سرو کله میزنم یکم برای من سخته. با تحقیقی هم که کردم دیدم انگار دقت adc بالاتر از استفاده از وقفست.
              به نظر شما کدوم رو انجام بدم بهتره؟ از جهت اینکه سریعتر به نتیجه برسم و برای من که مبتدی هستم هم ساده باشه و هم بتونم از شما کمک بگیرم.
              من نمیدونم شما با کدوم کار کردین ولی مطمئنا با استفاده از adc محاسبات بیشتر است.

              خوب اول کار یکم مشکله ، ولی اگر صرفا میخواهید این پروژه را انجام بدید و کار دیگه ای با میکرو نخواهید داشت ، از برنامه های آماده استفاده کنید ( فرکانس متر)

              اگرم میخواهید بفهمید چی به چیه و چه اتفاقاتی میوفته که فرکانس موج ورودی بدست می آید، بایستی قبلش کاملا کار با adc و وقفه خارجی و تایمرها را بدونی . از فیلمهای داخل سایت knowledgeplus.ir استفاده کنید.
              راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
              کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
              نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
              انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

              دیدگاه


                #37
                پاسخ : درخواست کمک، مدولاسیون fsk با AVR

                نوشته اصلی توسط marychi
                اول ورودی رو با comparator داخلی یا خارجی دیجیتال کن.
                بعد یه اینتراپت تعریف کن که با اومدن لبه، بره توی روتین اون. توی روتین یک تایمر ست کن. توی لبه بعدی مقدار تایمر رو بخون. اگه حدود دوره تناوب مربوط به فرکانس f1 بود مثلا 0 و اگر حدود f2 بود یعنی 1 هست. برای راحتی کار هر بیت رو توی متغیر بریز. اگه تعداد مشخصی بیت گرفتی از ورودی برو ببین دیتا valid هست یا نه.

                همونطور که گفتم اول و اخر دیتا هنگام ارسال، بیت یا بیتها و یا حتی بایت های مشخصی اضافه کن.
                در گیرنده اگر اول و اخر دیتایی که خوندی برابر این مقدار ثابت بود، یعنی دیتا valid هست. در غیر این صورت خطا داری و یا اشتباه خوندی دیتا رو.

                یک مسئله دیگه اینه که من هنوز نفهمیدم چرا داری fsk کار می کنی. چرا با همون سریال این کار رو نمی کنی. چون به هر حال کاری که میکنی شبیه سریال هست با این تفاوت که مبکرو خودش فرستنده و گینده شو داره.
                یه مقایسه کننده تونستم بنویسم با کلی مشقت :-)
                میذارم ببینید چطوره.
                کد:
                #include <mega32a.h>
                
                interrupt [ANA_COMP] void ana_comp_isr(void)
                {
                
                }
                
                void main(void)
                {
                
                PORTB=0x00;
                DDRB=0xf3;
                
                PORTD=0x00;
                DDRD=0xff;
                
                #asm("sei")
                
                while (1)
                   {
                    if(ACSR.5==1) PORTD.0=1;
                    else PORTD.0=0;
                   }
                }
                اگه درست متوجه شده باشم باید سینوسیم رو بدم به AIN0 و ولتاژ رفرنس AIN1 رو هم مثلا بذارم روی ماکزیمم مقدار دامنه سینوسی (مثلا 5) بعد زمانی که سینوسی به اون مقدار میرسه پین صفرم پورت D یک میشه و من بیام فاصله زمانی بین این یک شدن تا یک شدن بعدی رو اندازه بگیرم و با این مقدار کار کنم...
                درسته؟
                اگه آره میشه کدهای این سنجیدن زمان رو برام بنویسید؟

                در مورد سریال هم راستش من اطلاع درستی ازش ندارم، موضوع پروژه ای که من دارم انجام میدم fsk هستش.

                دیدگاه


                  #38
                  پاسخ : درخواست کمک، مدولاسیون fsk با AVR

                  مقایسه رو باید با عبور از صفر سینوسی انجام بدی. چون اینجا منفی نداری میشه نصف 5 یعنی 2.5.

                  با ابن کار سینوسی تو میشه مربعی. بقیش رو هم درست متوجه شدی. انداه گیری زمان یک پریود.
                  بعد از تشخیص فرکانس (1 بودن یا صفر بودن) میای و مثلا هر 100 میلی ثانیه(به اندازه نرخ ارسال بیت ها) صفر رو یک ها را بر میداری و توی متغیر ذخیره میکنی.
                  امکان نوشتن کد نیست فعلا.
                  منظور از سریال 232 هست. اگه دلیل خاصی برای fsk نداری خودت رو راحت کن و 232 استفاده کن.
                  مـن هیچ ندانم که مرا آن که سرشت
                  از اهل بهشت کرد یا دوزخ زشت
                  جامی و بتی و بربطی بر لب کشت
                  این هر سه مرا نقد و تو را نسیه بهشت

                  دیدگاه


                    #39
                    پاسخ : درخواست کمک، مدولاسیون fsk با AVR

                    نوشته اصلی توسط marychi
                    مقایسه رو باید با عبور از صفر سینوسی انجام بدی. چون اینجا منفی نداری میشه نصف 5 یعنی 2.5.

                    با ابن کار سینوسی تو میشه مربعی. بقیش رو هم درست متوجه شدی. انداه گیری زمان یک پریود.
                    بعد از تشخیص فرکانس (1 بودن یا صفر بودن) میای و مثلا هر 100 میلی ثانیه(به اندازه نرخ ارسال بیت ها) صفر رو یک ها را بر میداری و توی متغیر ذخیره میکنی.
                    امکان نوشتن کد نیست فعلا.
                    منظور از سریال 232 هست. اگه دلیل خاصی برای fsk نداری خودت رو راحت کن و 232 استفاده کن.
                    خب یه چیزایی تونستم بنویسم البته بیشترشو marychi عزیز کمکم کرد.
                    میخوام الان برم سراغ ساختش فقط نمیدونم همه چیز اوکیه یا نه، به نظرتون همین خوبه؟
                    بسازمش؟

                    http://www.mediafire.com/?52as7kn9kbjf51s

                    دیدگاه

                    لطفا صبر کنید...
                    X