اطلاعیه

Collapse
No announcement yet.

اندازه گیری فاصله ی بین دو پالس با adc

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

    اندازه گیری فاصله ی بین دو پالس با adc

    سلام
    راسیاتش من دوتا سنسور دارم که موقع عبور جسم از روبه روی آنها پالس میده
    میخواسم سرعت جسمی که از رو به روی آنها رد میشه را اندازه بگیرم
    بنا به دلایلی نمیتونم از اینتراپت خارجی استفاده کنم
    راسیاتش اول برنامه را اینجوری نوشتم که تایمر میکرو شروع میکنه به شمردن با پریود 0.1 میلی ثانیه و در هر اینتراپت over flow یک عدد به مقدار i اضافه میکنه
    اینطوری زمان را دارم
    اما برای فهمیدن اینکه پالس کی میاد اینطوری نوشته بودم که اشتباهه :cry:
    چون میکرو سریع از روی if دوم رد میشه اگه بخوام با while بنویسم و مرتب بیاد چک کنه احتمال هست که میکرو باز هم پالس را متوجه نشه هر چند سرعت میکرو زیاد هست ولی خوب ....
    کد:
       a=read_adc(2);
       ap=floor(a);
       af=ap; 
       b=read_adc(3);
       bp=floor(b);
       bf=bp; 
    	 if(af>10){
    	 i=0;
    	 }if(bf>10){
            V1=(900/i) ;//9 cm divided to 0.1 mili second 
            sprintf(vv1,"V1= %4.2f M/S",V1);
            lcd_gotoxy(0,0);
            lcd_puts(vv1); 
            delay_ms(100);
    			  }
    bf و af از نوع int هستند و bp و ap از نوع float

    میخواسم ببینم کسی ایده ای داره بتونه کمک کنه؟؟؟
    ممنون میشم :read:

    #2
    پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

    سلام
    سریع ترین راه در خواندن adc خوندنش با اینترابت adc هستش که باز به عرض پالس که داره میاد بستگی داره یعنی دیگه خیلی کم نباید باشه (در حد میلی ثانیه باشه).از اونجای هم که دقت adc به گمانم برای شما مهم نیست و فقط قراره سطح صفر ویک تشخیص داده بشه پس به نظر من، فرکانس adc رو ماکزیمم،فرکانس میکرو هم ماکزیمم بزارید.
    در برنامه هم اینتراپت رو روشن کنید (#asm("sei&quot)و داخل یک while مقدار ADCHرو هی چک کنید.داخل زیر برنامه اینتراپت هم چیزی ننویسید و مستقیم ADCHرو در بیرون چک کنید
    این کار رو انجام بدید شاید جواب داد

    دیدگاه


      #3
      پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

      چرا از adc استفاده کردین؟از همون I/O چرا استفاده نکردین؟
      آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

      دیدگاه


        #4
        پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

        سلام پویان خوبی؟
        پروگرامر stk بستی؟
        ____________________________________
        شکل دستوریش مثل این میشه :
        کد:
        if(PINA.1){
        	i=0;
        	while(~PINA.2)
        	{
        	}
        if(PINA.2==1){
        V=...
        }	
        }
        اینطوری منظورت بود؟

        البته من اول فکر میکردم خروجی سنسورا آنالوگه یعنی مثلا 1 ولت هم خروجی میده علتشم این بود که چون زمان پالس خروجی کمه مولتی متر مقدار کمتریو نشون میده ولی بعد با اسیلسکوپ که دیدم متوجه شدم یک تک پالسه
        ولی میگم من از اینتراپت خارجی نمیتونم استفاده کنم یکی از دلایلش اینکه 4 تا سنسور و از اینتراپت میکروی مورد نظرم کمتره (atmega 8)

        دیدگاه


          #5
          پاسخ : پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

          نوشته اصلی توسط mostafa moradmoghadam

          در برنامه هم اینتراپت رو روشن کنید (#asm("sei&quot)و داخل یک while مقدار ADCHرو هی چک کنید.داخل زیر برنامه اینتراپت هم چیزی ننویسید و مستقیم ADCHرو در بیرون چک کنید
          این کار رو انجام بدید شاید جواب داد
          ممنون اینم روش خیلی خوبیه
          یک سوال کدویزارد D: اگر adc اینتراپتشو فعال کنی تابع read_adc حذف میکنه ولی اگه تیک noise canceler بزنی دوباره میاره!
          و کد تولید شدش اینطوری میشه :
          کد:
          interrupt [ADC_INT] void adc_isr(void)
          {
          // Read the 8 most significant bits
          // of the AD conversion result
          adc_data=ADCH;
          }
          
          unsigned char read_adc(unsigned char adc_input)
          {
          ADMUX=adc_input | ADC_VREF_TYPE;
          // Delay needed for the stabilization of the ADC input voltage
          delay_us(10);
          #asm
            in  r30,mcucr
            cbr r30,__sm_mask
            sbr r30,__se_bit | __sm_adc_noise_red
            out mcucr,r30
            sleep
            cbr r30,__se_bit
            out mcucr,r30
          #endasm
          return adc_data;
          }
          منظور شما اینه از همین استفاده کنم؟

          دیدگاه


            #6
            پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

            لقمه را دور سر خودت نپیچ ...
            با وقفه کار کن ...
            دوتاش با لبه پایین رونده ...
            یکی برای آغاز(شروع کننده کانتر) و دیگری برای پایان(توقف کانتر) ...
            با این روش خیلی دقیق میتونی اندازه بگیری ...
            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
            معرفی نرم افزار Codewizard PWM
            با من بیشتر آشنا شوید

            دیدگاه


              #7
              پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

              adc برای اندازه گیری زمان دقیق مناسب نیست چون خودش برای انجام تبدیل صحیح نیازمند سپری شدن زمان هست، پایه مورد نظرتون رو به صورت دیجیتال ورودی قرار یدید زمانی که ورودی تحریک شد تایمر رو استارت کنید و زمانی که پایه دوباره تغییر وضعیت داد تایمر رو متوقف کنید و مقدار رو بخوانید زمان به دست میاد.
              از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
              هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
              اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
              اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
              شاد و موفق باشید

              دیدگاه


                #8
                پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

                سلام ممنون.
                نه هنوز کار نداده.
                خروجی سنسور را بده به بیس ترانزیستور pnp تا سطح ولتاژ درست بشه.بعد با یه تایمر با prescale یک و حداکثر فرکانس،یکی از پایه ها را چک کن.
                اگه خروجی سنسور خیلی زود صفر میشه میتونی با یه خازن با ظرفیت پایین هم پورت را یک نگه داری.
                آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

                دیدگاه


                  #9
                  پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

                  نوشته اصلی توسط pooyan-shafiei
                  سلام ممنون.
                  نه هنوز کار نداده.
                  خروجی سنسور را بده به بیس ترانزیستور pnp تا سطح ولتاژ درست بشه.بعد با یه تایمر با prescale یک و حداکثر فرکانس،یکی از پایه ها را چک کن.
                  اگه خروجی سنسور خیلی زود صفر میشه میتونی با یه خازن با ظرفیت پایین هم پورت را یک نگه داری.
                  استفاده از ورودی کار مناسبی نیست ... چند میکرو ثانیه ای تاخیر داره ...
                  اگر برای کار دقیقی نمیخواهید ، از این روش استفاده کنید ...
                  [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                  معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                  معرفی نرم افزار Codewizard PWM
                  با من بیشتر آشنا شوید

                  دیدگاه


                    #10
                    پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

                    همون اینتراپت بهترن گزینه هست.وقتی فعال شد تایمر شروع بکنه به شمارش بعد از عبور جسم تایمر متوقف بشه و زمان شمارش شده محاسبه بکن
                    حرف زدن کافي نيست بايد عمل کرد.دانستن کافي نيست بايد به کار گرفت

                    دیدگاه


                      #11
                      پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

                      سلام میشه بگید چطوری میشه این کارو کرد.برای شروعش میدونم چطوری کنم .ولی برای اینکه زمانش متوقف شه هر کاری میکنم زمان همینجوری ادامه میده نه متوقف میشه نه میشه ریستش کرد

                      دیدگاه


                        #12
                        پاسخ : اندازه گیری فاصله ی بین دو پالس با adc

                        برای محاسبه دیوتی سایکل عرض پالس فاصله پالس و غیره بهتره از پایه های تایمر 1 که 16 بیتی هستش استفاده کنید نه ADC

                        دیدگاه

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