اطلاعیه

Collapse
No announcement yet.

مشکل با خوندن پهنای پالس

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با خوندن پهنای پالس



    من یه برنامه نوشتم که به خوبی کار میکنه و کارش اندازه گیری پهنای پالسیه که به پایه ccp1 داده میشه!

    مشکل اینجاست که وقتی پالس ورودی از یه مرجعی غیر از خود میکرو وارد پایه میشه اصلا میکرو نمیفهمه چیزی بهش وصله! ولی وقتی از خود میکرو پالس بهش وارد میشه خوب میفهمه خیلی خوب! :question:

    چرا!

    راستی ورودی این پایه از میکرو اشمیتریگر هستش!

    #2
    پاسخ : مشکل با خوندن پهنای پالس

    با سلام
    دوست عزیز به نکته جالبی اشاره کردین, درسته که من زیاد وارد نیستم ولی دو تا سوال دارم:
    1. پالس خارجی رو از کجا میگیرین؟
    2. مطمئن هستین که این پالس شما تقریبا شبیه پالس CCP است؟
    درضمن تا اونجایی که من میدونم از این پایه فقط در دو حالت Compaire و PWM میتونیم به عنوان خروجی استفاده کنیم که به احتمال زیاد شما از حالت PWM استفاده کردین. حالا یه سوال دیگه پیش میاد اونم اینه که پالس خارجی شما رو میکرو میتونه ساپورت کنه یا نه؟

    دیدگاه


      #3
      پاسخ : مشکل با خوندن پهنای پالس

      شما از مد capture ماجول CCP استفاده کرده اید.
      برای اینکه موج خارجی رو بخونید باید یک GND مشترک بین منبع تولید موج و میکرو داشته باشید. در غیر اینصورت PIC ورود موج رو تشخیص نمیدهد!

      دیدگاه


        #4
        پاسخ : مشکل با خوندن پهنای پالس

        نوشته اصلی توسط محمد ایجی
        شما از مد capture ماجول CCP استفاده کرده اید.
        برای اینکه موج خارجی رو بخونید باید یک GND مشترک بین منبع تولید موج و میکرو داشته باشید. در غیر اینصورت PIC ورود موج رو تشخیص نمیدهد!
        بله من از کپچر استفاده کردم و برنامهه خیلی پیچیده و دقیقی شده
        ولی منم به همون کرندش شک کردم.

        مرجع ورودی سیگنال هم پالسهای ارسالی از ecu سمند هستش به پشت پنل جلوی راننده ( دور موتور و سرعت ماشین)

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

        راستی یه چیزی الان یادم اومد!

        من برای اینکه مدارم رو روشن کنم از برق شهر استفاده کردم با یه ادابتور 12 ولت که با لگوراتور 5 ولت رگونه شده تو مدار!
        ولی مدار ماشین از برق باطری و آلترناتور ماشین داره استفاده میکنه!
        ممکنه مال این موضوع باشه!؟ ولی من بدنه ماشین رو به منفی مدارم وصل کرده بودما!

        دیدگاه


          #5
          پاسخ : مشکل با خوندن پهنای پالس

          نوشته اصلی توسط SA3ID
          با سلام
          دوست عزیز به نکته جالبی اشاره کردین, درسته که من زیاد وارد نیستم ولی دو تا سوال دارم:
          1. پالس خارجی رو از کجا میگیرین؟
          2. مطمئن هستین که این پالس شما تقریبا شبیه پالس CCP است؟
          درضمن تا اونجایی که من میدونم از این پایه فقط در دو حالت Compaire و PWM میتونیم به عنوان خروجی استفاده کنیم که به احتمال زیاد شما از حالت PWM استفاده کردین. حالا یه سوال دیگه پیش میاد اونم اینه که پالس خارجی شما رو میکرو میتونه ساپورت کنه یا نه؟
          1. جواب دادم
          2. بله خیلی شبیه فقط کمی نویز روشه که به یه مدار اشمیتریگر میگن حل میشه ولی اون مدارم گذاشتم ولی اصلا نمیفهمه مدار بهش یه همچین چیزی وصله!
          3.مدار در حالت عادی درست کار میکنه
          نمیدونم ولی باید تست بشه

          دیدگاه


            #6
            پاسخ : مشکل با خوندن پهنای پالس

            نوشته اصلی توسط arvinfx


            بله من از کپچر استفاده کردم و برنامهه خیلی پیچیده و دقیقی شده
            ولی منم به همون کرندش شک کردم.

            مرجع ورودی سیگنال هم پالسهای ارسالی از ecu سمند هستش به پشت پنل جلوی راننده ( دور موتور و سرعت ماشین)

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

            راستی یه چیزی الان یادم اومد!

            من برای اینکه مدارم رو روشن کنم از برق شهر استفاده کردم با یه ادابتور 12 ولت که با لگوراتور 5 ولت رگونه شده تو مدار!
            ولی مدار ماشین از برق باطری و آلترناتور ماشین داره استفاده میکنه!
            ممکنه مال این موضوع باشه!؟ ولی من بدنه ماشین رو به منفی مدارم وصل کرده بودما!
            تغذیه مدارتون رو از باتری ماشین بگیرید ببینید چی میشه . شاید اینطوری جواب بده .

            دیدگاه


              #7
              پاسخ : مشکل با خوندن پهنای پالس

              تغذیه مدار هم از باطری ماشین گرفتم ولی نشد بازم همون اعدادی که ربطی به فرکانس نداره و خیلی هم متغیره رو نشون میده! حتی با فیلتر مقاومت و خازن هم موج مربعی رو به اره ای تبدیل کردم ولی بازم همون سری اعداد رو نشون میده!جالبه که پهنای پالسی که اندازه میگیره بزرگتر از پالسیه که بهش اعمال میشه یعنی نویز رو اندازه نمیگیره!

              کسی چنین مشکلی داشته؟ باید چیکار کنم؟ :cry:

              دیدگاه


                #8
                پاسخ : مشکل با خوندن پهنای پالس

                درست شد

                اشکال این بود که تایمر رو خاموش نمیکردم!

                دیدگاه


                  #9
                  پاسخ : مشکل با خوندن پهنای پالس

                  دوست عزیز واقعا خوشحالم که مشکلتون حل شده
                  من تا حالا مدار یه ECU رو ندیدم میشه یه چندتا عکس از مدار بگیرید و تو سایت بزارین؟

                  با تشکر از شما :nice:

                  دیدگاه


                    #10
                    پاسخ : مشکل با خوندن پهنای پالس

                    نوشته اصلی توسط SA3ID
                    دوست عزیز واقعا خوشحالم که مشکلتون حل شده
                    من تا حالا مدار یه ECU رو ندیدم میشه یه چندتا عکس از مدار بگیرید و تو سایت بزارین؟

                    با تشکر از شما :nice:
                    والا منم ندیدم و فقط از یکی از سیم هایی که از ecu میاد بیرون دارم دیتا میگیرم :redface:

                    دیدگاه


                      #11
                      پاسخ : مشکل با خوندن پهنای پالس

                      سلام آروین جان
                      میتونی یه کمی هم منو راهنمایی کنی.. من هم یه برنامه توی مد ccp اما وقتی توی پروتئوس اجراش میکنم کار نمیکنه..ممنون میشم اگه کمکم کنی..چون برام خیلی مهمه...

                      #include<16f887.h>
                      #use delay(clock=8000000)
                      #include <lcd.c>
                      #int_TIMER1
                      #int_CCP1 //capture mode interrupt
                      #define use_lcd_portd true //set port D to use LCD


                      //declared variables
                      unsigned long old_rise,new_rise,period;
                      unsigned int flag_counter,multiple;

                      void TIMER1_isr(void) //timer1 interrupt
                      {
                      flag_counter++; //this is a counter for timer1 overflows
                      clear_interrupt(int_timer1);// clear timer1 interrupt's flag
                      }


                      void CCP1_isr(void)
                      {
                      if(flag_counter!=0){
                      multiple=flag_counter;
                      flag_counter=0;
                      old_rise=new_rise;
                      new_rise=ccp_1;
                      period=(new_rise)-(old_rise)+(256*(multiple+1));
                      clear_interrupt(int_ccp1); //clear ccp1 flag to run for next edge
                      }
                      }

                      void main()
                      {
                      setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //set timer1 in 8us resulation
                      setup_ccp1(CCP_CAPTURE_FE);
                      enable_interrupts(GLOBAL);
                      enable_interrupts(INT_TIMER1);
                      enable_interrupts(INT_CCP1);
                      set_tris_c(0xff); //CCP1 pin is declared as a input
                      lcd_init();
                      while(1){
                      lcd_gotoxy(1,2);
                      lcd_putc(period);
                      delay_ms(500);
                      }





                      }
                      همه چیز را همگان دانند وهمگان هنوز به دنیا نیامده اند.(بزرگمهر حکیم)

                      دیدگاه


                        #12
                        پاسخ : مشکل با خوندن پهنای پالس

                        خوب اولندش که من مهندس نیستم ،منو هیچوقت دانشگاه راه ندادن

                        دومندش من C میکرو رو بلد نیستم و با MikroBasic کار میکنم ولی توی برنامت من ندیدم که تایمر رو روشن کنی! یا اینکه وقتی مقدار کپچر شده رو خوندی مقادیر تایمر رو یعنی رجیستر های TMR1L و TMR1H رو صفر کنی!

                        بدشم این پرتعوس خیلی منو سرکار گذاشته زیاد بهش اطمینان نکن

                        این پروژه داره چیکار میکنه حالا؟

                        دیدگاه


                          #13
                          پاسخ : مشکل با خوندن پهنای پالس

                          آروین جان اولا مهندس بودن به مدرک نیست چون خیلیا مدرکشو دارند اما .....
                          در ضمن این برنامه دوره تناوب یه پالس رو اندازه میگیره.در مورد برنامه هم بگم که تایمر توی main برنامه روشن میشه.
                          راستی ساختار کلی برنامه رو هم اینجوری تعریف کردم که با شروع برنامه تایمر روشن میشه. با اولین لبه پایین رونده وقفه مد CCP فعال میشه.توی روتین وقفه مقدار تایمر ذخیره میشه وهمچنین تعداد سرریزهای تایمر هم برای محاسبه زمان تا وقفه بعدی ccp شمرده میشه.
                          درروتین وقفه تایمر هم یه شمارنده برای سرریزها قرار داره و اینکه بیت وقفه رو هم پاک میکنه.
                          در ضمن تایمر در کل زمان برنامه روشنه و خاموش نمیشه و مقدارش هم جایی توی برنامه صفر نمیشه.
                          این ساختار کلی برنامه هستش ..حالا بنظرت ایرادش کجاست ؟
                          همه چیز را همگان دانند وهمگان هنوز به دنیا نیامده اند.(بزرگمهر حکیم)

                          دیدگاه


                            #14
                            پاسخ : مشکل با خوندن پهنای پالس

                            من توی پروتئوس برنامه را دیباگ هم کردم.متاسفانه توی دیباگ برنامه دیدم که اصلا سرویس وقفه تایمر و مد کپچر اصلا اجرا نمیشه..... :angry:
                            دوستانی که این تاپیک رو دیدن نظری ندارن ؟
                            ای که دستت میرسد کاری بکن
                            همه چیز را همگان دانند وهمگان هنوز به دنیا نیامده اند.(بزرگمهر حکیم)

                            دیدگاه


                              #15
                              پاسخ : مشکل با خوندن پهنای پالس

                              من جای شما بودم تایمر رو با اولین لبه مورد نظرم روشن میکردم و بعد از اتمام کار که معمولا تغییر لبه در جهت معکوس هستش اونو متوقف و پاک میکردم ( خودم همینکارو کردم)
                              تعداد سرریزها رو درست انجام دادی

                              تایمر رو هتما" صفر کن و مقدار کپچر رو از رجیستر های CCPR1H و CCPR1L بخون نه از تایمر این کپچر برای همینه دیگه
                              اگر این خط اینکارو میکنه که هیچی :
                              new_rise=ccp_1;

                              برنامتو روی میکرو اجرا کن نه پریتعوس

                              دیدگاه

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