اطلاعیه

Collapse
No announcement yet.

واحدA/D _مد Auto Triggrer _حالت Free Running

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

    واحدA/D _مد Auto Triggrer _حالت Free Running

    اساتید سلام
    می خوام یه مولتی متر بسازم.اونم اینطوری که از برق شهر توی یدونه سیکلش نمونه برداری کنم و توی یدونه آرایه ذخیره کنم(هم ولتاژ وهم جریان) بعد با عمل انتگرال گیری روی داده ها و با استفاده از فرمولای مدار rms ولتاژ و جریان، توان و ضریب توانو بدست بیارم.
    مد Auto Triggrer رو تونستم راه بندازم.میدونمم که نمونه برداری پشت سرهم بطور خود کار انجام میشه.
    فقط نمیدونم چطور این نمونه هارو توی یدونه آرایه ذخیره کنم؟
    با وقفه آیا؟
    یا توی همون while اصلی برنامم؟
    راستش با وقفه نتونستم .اینم برنامه ی وقفمه
    interrupt [ADC_INT]void nemune()
    {
    data=ADCW*(2.56/1024);
    pat[i]=data;
    ++i;
    }
    انتظار دارم هر بار که ADIF پرچم وقفم یک میشه یبار وقفه اجرا بشه،برناممو که تو پروتئوس اجرا میکنم فقط و فقط یکبار وقفم اجرا میشه
    نمیدونم راهم درسته یا نه!
    ممنون میشم اساتید خودم کمکم کنند

    #2
    پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

    سلام
    خودم به نتایجی رسید
    هم با وقفه میشه تو تابع وقفه
    وهم به روش سر کشی تو while
    مشکلمنم تو وقفه هست الان ،اونم این مشکل که تو وقفه که می خوام ADCW رو یه بلایی سرش بیارمو بریزمش تو pat ،نمیشه
    نمیدونم چرا
    اینجا مه تابعم میرسه هیچی دیگه اجرا نمیشه،ال سی دیمم قات میزنه و هیچی نشون نمیده
    سعی میکنم با روش سرکشیم امتحان کنم شاید درست بشه
    از دوستان هم تقاضا میکنم اگه میدونند مشکل کجاست راهنمایی کنند

    دیدگاه


      #3
      پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

      سلام
      طبق گفته دیتاشیت در حالت Free Running تریگر اتفاق نمی افته حتی اگه flag وقفه set بشه

      برای ذخیره چندین نمونه تو آرایه اگه قراره از Free Running استفاده بشه باید به صورت متوالی و نرم افزاری مقدار ADCW خونده بشه. برای این کار میشه از حلقه for برای ذخیره نمونه ها استفاده کرد( البته خودم امتحان نکردم ) مثلا به شکل زیر:
      کد:
      unsigned int sample[100];
      
      for(i=0 ; i<100 ; i++)
      {
       while (ADCSRA & (1<<ADSC);
       sample[i] = ADCW;
      }
      این راهی بود که به ذهن من رسید البته تست نکردم . امیدوارم مشکل حل شه یا شاید دوستان با تجربه تر راه حل بهتری داشته باشند


      گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

      دیدگاه


        #4
        پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

        سلام
        راستش من تو عمل که امتحان کردم تریگر رخ میده
        شاید بهتره که برناممو بزارم تا ببینید
        کد:
        interrupt [ADC_INT]void nemune()
         {
         pat[ i]=ADCW;
          ++i;
         }
        
          
         void main()
          {
           DDRA=0X00;
          PORTA=0X00;
          ADMUX=0B01000000;
          SFIOR=0B0000000;
          ADCSRA=0B11101101; 
          # asm("sei")
           delay_ms(200);
          #asm("cli")
          ADCSRA=0;
         lcd_init(16);
          while(1)
           {
             for(j=0;j<i;++j)
            {
           data=pat[j]*5.0/1024.0;
            lcd_clear();
            sprintf(str1,"b=%f",data);
            lcd_puts(str1);
            delay_ms(100);
              }
            }
        اگه من تو تابع وقفم pat[ i]=ADCW اینو حذف کنم و مقدار iرو روی ال سی دی نمایش بدم i مدام زیاد میشه:یعنی اینکه وقفه داره با هر بار تبدیل انالوگ به دیجیتال رخ میده
        فقط مشکل من اینه که نمی تونم این مقدار تبدیل شده رو توی ارایه ذخیره کنم
        این برنامه ای که نوشتمو تو عمل اجرا میکنم ،میره تو تابع وقفه گیر میکنه و دیگه بیرونم نمیاد،خودم حدس میزنم تو قسمت pat[ i]=ADCW; گیر میکنه

        دیدگاه


          #5
          پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

          اگه i تعداد نمونه هاست مقدارش قراره چقدر افزایش پیدا کنه ؟ یعنی آرایه قراره چندتا نمونه ذخیره کنه؟ آرایه چند عضو داره؟
          به نظر میرسه تو نوشتن برنامه عجله کردین ، برنامه تون احتیاج به اصلاحاتی داره مثلا:

          تو حلقه for برای محدوده j مقدار ثابت قرار ندادید
          i اگه به صورت unsigned char تعریف شده باشه و مدام افزایش پیدا کنه اگه بیشتر از 255 بشه چی؟ آیا دوباره صفر میشه؟

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

          راستی اون قسمت اسمبلی و تاخیر و بعد صفر کردن ADCSRA واسه چیه؟
          گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

          دیدگاه


            #6
            پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

            سلام
            اتو تریگر اینطور کار میکنه که هرموقع عمل تبدیل انجام شد خود به خود عمل بعدیو آغاز میکنه.
            من یک ثانیه وقفه ی مربوط به انجام گرفتن تبدیل آنالوگ به دیجیتالو فعال میکنم. یعنی در مدت یک ثانیه نمونه های برداشته شدم توسط تابع وقفه ذخیره بشند.
            بعدشم وقفم غیر فعال میشه که دیگه تو تابع وقفه نره
            توی این یک ثانیه به تعداد i نمونه برداشته میشه که مشخص نیست چه رقمیه و مطمعنا محدوده پس نباید مشکلی پیش بیاد از طرفیم محدوده ی j هم توسط ماکزیمم مقدارi مشخص میشه که باز نباید مشکلی داشته باشه.
            ازطرفی چون میدونم مقدار iاز صدوپنجاه هزار بیشتر نمیره که از من تا پونزده هزار میره بالا مقدار اونو unsigned long int در نظر گرفتم که خیلی بعیده محدودیتی واسم ایجاد کنه.

            قبلا هم گفتم من مشکلم تو ذخیره کردن تو یه آرایست تا چیزایی که شما گفتید
            ممنون میشم بگید چطور نمونه برداریامو که بصورت Auto Triggrer _حالت Free Running هستو تو یه آرایه ذخیره کنم بعدشم توی اعمال ریاضیم ازشون استفاده کنم؟
            :question: :question: :question: :question: :question: :question: :question: :question:

            دیدگاه


              #7
              پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

              برای اینکه تاپیک بی جواب نمونه
              نمیدونم چرا کس دیگه ای جواب نداده!!!
              و اگه هنوزم به جواب نرسیدین!

              من طبق کدهای شما مقدار i رو در خروجی نشون دادم و مقدارش تا 2000 افزایش پیدا کرد ( شایدم بیشتر میشد )یعنی اگه بخوایم آرایه ای با 2000 عضو از نوع int داشته باشیم نیاز به حداقل 4kb رم داریم و در برنامه شما این مشکل ساز شده.

              حالا چرا این مشکل بوجود اومده؟ شما میخواید از 15k نمونه در ثانیه ADC استفاده کنید که از شکل موج با فرکانس 50 هرتز در یک سیکلش نمونه برداری کنه.

              1- نکته ای که تو پست قبلیمم بهش مشکوک بودم همون تاخیر 200 میلی ثانیه هست! که باید بشه 20 میلی ثانیه
              2- برای ایجاد تاخیر دقیق بین فعال و غیر فعال کردن وقفه بهتره از تایمر استفاده کنیم چون تاخیر نرم افزاری که قراره وسطش وقفه بخوره اگه روتین وقفه هم طولانی باشه (که اینم توصیه نمیشه) باعث میشه تاخیر بیشتر از مقدار مورد انتظار طول بکشه
              3- تو روتین وقفه باید بیت ADSC در رجیستر ADCSRA مجددا 1 بشه تا تبدیل بعدی شروع بشه وگرنه فقط یکبار تبدیل انجام میشه و این با انتظاری که از Free Running داریم جور در نمیاد! چرا؟
              4- برای این مورد چون سرعت نمونه برداری 15k مد نظر هست تعداد نمونه ها باید 300 تا باشه ولی موقع تست 212 تا شد یعنی سرعت نمونه برداری 10.6k بود.چرا؟

              البته من اینارو در پروتئوس تست کردم و اون چراها برای منم سوال هست و بخاطر بار آموزشی نبود!!!
              گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

              دیدگاه


                #8
                پاسخ : واحدA/D _مد Auto Triggrer _حالت Free Running

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

                دیدگاه

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