اطلاعیه

Collapse
No announcement yet.

pwm

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

    pwm

    سلام
    تو میکرو pwm 3تایی داریم؟
    3تا pwm نه ها
    میخوام 120 درجه با هم اختلاف باز داشته باشن
    انقدر احمق نیستم که فکر کنم کارم تموم شده

    #2
    پاسخ : pwm

    یعنی از یه کانتر 3تا کانال خروجی داشته باشیم هر کدوم با 120 درجه اختلاف باز
    انقدر احمق نیستم که فکر کنم کارم تموم شده

    دیدگاه


      #3
      پاسخ : pwm

      مثلا میشه اینکارو کرد؟
      کانتر شرو به شمردن کنه بعد مقدارش رو با یه عدد مقایسه کنیم و زمانی که برابر شدن 1پایه رو یک کنیم بعد اون عددی که مقایسه میکردیمو عوض کنیم برای پین بعدی
      اینبار که برابر شد یه پین دیگه رو یک کنیم و پین قبلی رو صفر و باز برای مقایسه سومی مقدار عدد مقایسه رو عوض کنیم. :mrgreen:
      بابا یکی کمک کنه. :cry2:
      میشه این روند رو داشته باشیم؟
      انقدر احمق نیستم که فکر کنم کارم تموم شده

      دیدگاه


        #4
        پاسخ : pwm

        بزار واضح تر بگم
        وقتی مقدار تایمر با ocrبرابر شد میشه تو برنامه وقفه مقدار ocr رو تغییر داد؟
        تایمر بعد از برنامه وقفه صفر میشه یا از همون مقدار ادامه پیدا میکنه؟
        انقدر احمق نیستم که فکر کنم کارم تموم شده

        دیدگاه


          #5
          پاسخ : pwm

          وای نه
          یعنی هیچکس با تایمر اینجوری کار نکرده؟ oo:
          نمیدونید وقتی وقفه تطابق میاد میشه مقداز ocr رو تغییر داد یا نه؟
          2تا سوال ساده بود بابا
          انقدر احمق نیستم که فکر کنم کارم تموم شده

          دیدگاه


            #6
            پاسخ : pwm

            سلام دادا.
            من که نفهمیدم چی شد. اما برای این سوال که یک تایمر/کانتر با سه خروجی داشته باشیم: جواب منفیه.
            اون سوال هم که میخوای با مقایسه کردن 3 عدد سه پین خروجی رو یک کنی این شدنیه. البته اون جوری که من فهمیدم. با اینتراپت هم میشه این ساخت. بهتره دقیقتر بگی چی میخوای تا کمک کنیم.
            تشکر لازم نیست!

            دیدگاه


              #7
              پاسخ : pwm

              خدارو شکر یکی پیدا شد :redface:
              هدف کلیم اینه که یه سیگنال ورودی دارم که میخوام فرکانسشو بدست بیارم بعد مطابق با اون فرکانس 2تا موج تو خروجی درست کنم دقیقا با همون فرکانس و جوری که با سیگنال ورودی و باهم هرکدوم 120 درجه اختلاف فاز داشته باشن
              فرکانس سیگنال ورودیمم حدود 400hz اما باید دقیق اندازه گیری بکنمش تا 2تا موجی که میسازم دقیقا با سیگنالم هم فرکانس باشن
              انقدر احمق نیستم که فکر کنم کارم تموم شده

              دیدگاه


                #8
                پاسخ : pwm

                خوب دادا این همه صغری کبری چیدی برای همین؟!!!! از اول همینو میگفتی. :eek:

                شما به یه کانتر نیاز داری برای خوندن فرکانس و 2 تا تایمر برای تولید فرکانس. برای خوندن فرکانس که مشکلی نیست و راحته. اما برا تولید فرکانس یکم باید وقت بذاری. چون اون اختلاف 120 درجه، نوشتن کدش بنظر سخت میاد. البته اگه میخواستی با اختلاف 180 درجه بسازی بسیار راحت بود. در اون صورت از تایمر 1 استفاده میکرد که 2 تا خروجی داره و یکی از خروجی هارو not inverting میکردی.
                من پیشنهاد میکنم برا ایجاد اختلاف فاز از سخت افزار استفاده کنی. یه سرچ بزن ببین چی دستت میاد.
                تشکر لازم نیست!

                دیدگاه


                  #9
                  پاسخ : pwm

                  به این سادگیام نیست :cry:
                  اولن آی سی من tiny13هستش که فقط 1تایمر داره
                  دومن سخت افزارمو نمیتونم دستکاری کنم :eek: :eek:
                  انقدر احمق نیستم که فکر کنم کارم تموم شده

                  دیدگاه


                    #10
                    پاسخ : pwm

                    این دیگه ناممکنه دادا.
                    اگه کار دقیق بخوای باید از حد اقل 2 تایمر/کانتر استفاده کنی. مگه اینکه بخوای با دستورات پورت تولید فرکانس کنی که اونم دقیق نیست. اما با این امکانات بنظر میاد تنها راحت همین باشه!
                    تشکر لازم نیست!

                    دیدگاه


                      #11
                      پاسخ : pwm

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

                      دیدگاه


                        #12
                        پاسخ : pwm

                        سلام
                        من این برنامه رو نوشتم بنظرم همه جاش درسته اما کار نمیکنه
                        اول فرکانس رو اندازه گرفتم بعد تقسیم به 6 کردم و هر پریود رو 60 درجه به 60 درجه رسم کردم.
                        فکر کنم ایرادم از فعال کردنای وقفه هاس آخه کامل با رجیستراش آشنا نیستم
                        میتونید یه نگاهی بهش بندازی

                        #include <tiny13.h>
                        #include <delay.h>
                        #include <stdio.h>
                        #define xtal 8000000


                        unsigned long int tf; //tov counter
                        unsigned long int tf2;
                        unsigned long int t; //input signal period
                        unsigned long int t2; //t/3
                        //unsigned long int tov;
                        unsigned char tt; //256-tcnt0
                        unsigned int c=0;
                        unsigned int c2=0; //sector cuonter per sector is 60"

                        void sectors(void);
                        void delay()
                        {
                        tf2=tf;
                        while (tf2!=0)
                        {
                        TCCR0A=0x00;
                        TCCR0B=0x01; //timer0 start
                        };
                        tf2=1;
                        TCNT0=tt;
                        TCCR0A=0x00;
                        TCCR0B=0x01; //timer0 start
                        while (tf2!=0);
                        c2++;
                        sectors();
                        }

                        void sectors()
                        {
                        //TCCR0A=0x00;
                        //TCCR0B=0x01; //timer0 start
                        switch (c2)
                        {
                        case 0:
                        {
                        PORTB.1=0;
                        PORTB.2=1;
                        delay();
                        break;
                        }
                        case 1:
                        {
                        PORTB.1=0;
                        PORTB.2=0;
                        delay();
                        break;
                        }
                        case 2:
                        {
                        PORTB.1=1;
                        PORTB.2=0;
                        delay();
                        break;
                        }
                        case 3:
                        {
                        PORTB.1=1;
                        PORTB.2=0;
                        delay();
                        break;
                        }
                        case 4:
                        {
                        PORTB.1=1;
                        PORTB.2=1;
                        delay();
                        break;
                        }
                        case 5:
                        {
                        c2=0;
                        PORTB.1=0;
                        PORTB.2=1;
                        delay();
                        break;
                        };

                        };
                        //c2++;
                        }

                        interrupt [EXT_INT0] void ext_int0_isr(void)
                        {

                        if (c<3)
                        {
                        c++;
                        //TCNT0=0x00; //timer
                        TCCR0A=0x00;
                        TCCR0B=0x01; //timer0 start
                        }
                        else
                        {
                        c2=0;
                        sectors();
                        }
                        }
                        // Timer 0 overflow interrupt service routine
                        interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                        {
                        if (c<3)
                        {
                        TCCR0A=0x00;
                        TCCR0B=0x00; //timero stop
                        tf++;
                        TCCR0A=0x00;
                        TCCR0B=0x01; //timer0 start clock=clk/8
                        }
                        else
                        {
                        TCCR0A=0x00;
                        TCCR0B=0x01; //timer0 start clock=clk/8
                        //c2++;
                        tf2=tf2-1;
                        };
                        }

                        void main(void)
                        {

                        #pragma optsize-
                        CLKPR=0x80;
                        CLKPR=0x00;
                        #ifdef _OPTIMIZE_SIZE_
                        #pragma optsize+
                        #endif
                        delay_ms(500);
                        PORTB=0x00;
                        DDRB=0x06;

                        TCCR0A=0x00;
                        TCCR0B=0x00;
                        OCR0A=0x00;
                        OCR0B=0x00;

                        //GICR=0x40; //INT0: On
                        GIMSK=0x40;
                        MCUCR=0x03; //initalize int0
                        GIFR=0x40;


                        TIMSK0=0x02; //initaize ovf0


                        ACSR=0x80;
                        ADCSRB=0x00;
                        #asm("sei&quot
                        while (1)
                        {
                        if (c==2)
                        {
                        TCCR0A=0x00;
                        TCCR0B=0x00; //timer0 stop
                        #asm("cli" //global disable intertupts
                        t=tf*256+TCNT0; //input signal period
                        t2=t/6;
                        tf=t2/256;
                        tt=t2%256 ;
                        tt=256-tt;
                        c++;
                        #asm("sei&quot
                        };
                        };
                        }
                        انقدر احمق نیستم که فکر کنم کارم تموم شده

                        دیدگاه


                          #13
                          پاسخ : pwm

                          آقا بیخیال شدم دردسرش زیاده
                          با tiny2313 میبندمش
                          2تا تایمر داره یکی 8و ارنیکی 16 بیتی.
                          حالا با این 2تا تایمر پیشنهادت چیه؟
                          انقدر احمق نیستم که فکر کنم کارم تموم شده

                          دیدگاه

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