اطلاعیه

Collapse
No announcement yet.

PWM روی پایه های دیگر

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

    PWM روی پایه های دیگر

    سلام من میخوام با میکروی Atmega8 یه PWM روی تایمر 2 تولید کنم و با تعییر مقدار OCR2 عرض پالس رو عوض کنم که تا اینجا مشکلی نیست
    با تغییر OCR2 مقدار پایه شماره 3 که PB3 است عوض میشود و موج PWM در این پایه ماهده میشود
    حالا میخوام این موج PWM را بر روی پایه های PD0 تا PD7 هم داشته باشم
    و نمیخوام PWM نرم افزاری تولید کنم
    دستوری هست که خاصیت PB3 را به پایه های دیگه منتقل کنه؟!
    مثلا همچین دستوری وجود داره؟!
    OCR2 = 128;
    PIND.0 = PINB & 0x08 ;
    که بیاد در هر لحظه مقداری که پین 4ام پورت B داره به پایه اول پورت D منتقل کنه؟!
    درایور شبکه و nRF24L01
    کاتالوگ محصولات
    کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
    شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
    فروش اسيلوسکوپ GWinstek GOS-630FC

    #2
    پاسخ : PWM روی پایه های دیگر

    PORTD.0 = PINB.3;
    PORTD.1 = PINB.3 ;
    PORTD.2 = PINB.3 ;
    PORTD.3 = PINB.3 ;
    PORTD.4 = PINB.3 ;
    PORTD.5 = PINB.3 ;
    PORTD.6 = PINB.3 ;
    PORTD.7 = PINB.3 ;

    پیدا کردم با این دستور میشه OCR2 را روی هر پایه ای بخواید بریزید :wow:
    درایور شبکه و nRF24L01
    کاتالوگ محصولات
    کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
    شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
    فروش اسيلوسکوپ GWinstek GOS-630FC

    دیدگاه


      #3
      پاسخ : PWM روی پایه های دیگر

      سلام
      1- چرا نمیخوای pwm نرم افزاری تولید کنی؟
      2- میتونی این کارو بکنی ولی باید از اینتراپت استفاده کنی که تا وضعیت پایه pwm تغییر کرد وضعیت portd هم عوض بشه
      گفت که دیوانه نهی لایق این خانه نهی

      دیدگاه


        #4
        پاسخ : PWM روی پایه های دیگر

        نوشته اصلی توسط Bastam (بسطام)
        PORTD.0 = PINB.3;
        PORTD.1 = PINB.3 ;
        PORTD.2 = PINB.3 ;
        PORTD.3 = PINB.3 ;
        PORTD.4 = PINB.3 ;
        PORTD.5 = PINB.3 ;
        PORTD.6 = PINB.3 ;
        PORTD.7 = PINB.3 ;

        پیدا کردم با این دستور میشه OCR2 را روی هر پایه ای بخواید بریزید :wow:
        داداش تست کردی ؟
        دوست عزیز خوب الان همه ی pwm ها وابسته هست به pinb.3 و هر مقداری که داشته باشه پینهای دیگه هم مثل اون هستند و این فکر نمی کنم جالب باشه شما برای چه کاری می خواهی
        قم الکترونیک

        دیدگاه


          #5
          پاسخ : PWM روی پایه های دیگر

          نوشته اصلی توسط electronicnarm2010
          داداش تست کردی ؟
          دوست عزیز خوب الان همه ی pwm ها وابسته هست به pinb.3 و هر مقداری که داشته باشه پینهای دیگه هم مثل اون هستند و این فکر نمی کنم جالب باشه شما برای چه کاری می خواهی
          درست میگید در اصل برای کاری میخواستم که به یه PWM ثابت در تعداد بالا نیاز داشتم و با تغییر OCR همه تغییر کنن و فقط بتونم بینشون سویتچ کنم

          خب الان اگه بخوام مثلا 7 تا PWM مختلف داشته باشم و هر کدوم رو بتونم جداگانه کنترل کنم باید چیکار کنم؟!
          درایور شبکه و nRF24L01
          کاتالوگ محصولات
          کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
          شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
          فروش اسيلوسکوپ GWinstek GOS-630FC

          دیدگاه


            #6
            پاسخ : PWM روی پایه های دیگر

            باید از تایمر کمک بگیری و در اصل با اعداد تایمر یه موج مثلثی درست کنی و بعد مثل شکل زیر می تونی هر پینی که خواستی دیوتی سایکلش رو عوض کنی مثلا اگه تایمرت از 0 تا 250 بشماره می یایی این رو به دو قسمت 125 تایی تبدیل می کنی لبه ی اول از 0 تا 125 برای لبه ی صعودی موج مثلثی و لبه ی از 125 تا 250 برای لبه ی نزولی موج مثلثی توضیحش یه مقدار سخته ولی اگه یه مقدار فکر کنی و از عکس زیر و اون خط افقی که توی عکس زیر می بینی و بالا و پایین بردن اون منطق این کار رو پی بهش ببری
            http://www.shakheh.com/up/uploads/1357822985.gif
            قم الکترونیک

            دیدگاه


              #7
              پاسخ : PWM روی پایه های دیگر

              نوشته اصلی توسط electronicnarm2010
              باید از تایمر کمک بگیری و در اصل با اعداد تایمر یه موج مثلثی درست کنی و بعد مثل شکل زیر می تونی هر پینی که خواستی دیوتی سایکلش رو عوض کنی مثلا اگه تایمرت از 0 تا 250 بشماره می یایی این رو به دو قسمت 125 تایی تبدیل می کنی لبه ی اول از 0 تا 125 برای لبه ی صعودی موج مثلثی و لبه ی از 125 تا 250 برای لبه ی نزولی موج مثلثی توضیحش یه مقدار سخته ولی اگه یه مقدار فکر کنی و از عکس زیر و اون خط افقی که توی عکس زیر می بینی و بالا و پایین بردن اون منطق این کار رو پی بهش ببری
              مرسی
              درایور شبکه و nRF24L01
              کاتالوگ محصولات
              کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
              شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
              فروش اسيلوسکوپ GWinstek GOS-630FC

              دیدگاه


                #8
                پاسخ : PWM روی پایه های دیگر

                دوست عزیز سلام این روشی که گفتی درسته که جواب میده الان داشتم تستش می کردم اگه برنامه ات طولانی بشه و مثلا 1 میلی ثانیه طول بکشه تا به این دستور portd.0=pinb.3 بشه کلا یه موج مربعی نامنظم خواهیم داشت که هیچ شباهتی به موج مربعی نداره در اصل نمیشه فرکانسش رو تعیین کرد
                قم الکترونیک

                دیدگاه


                  #9
                  پاسخ : PWM روی پایه های دیگر

                  نوشته اصلی توسط electronicnarm2010
                  دوست عزیز سلام این روشی که گفتی درسته که جواب میده الان داشتم تستش می کردم اگه برنامه ات طولانی بشه و مثلا 1 میلی ثانیه طول بکشه تا به این دستور portd.0=pinb.3 بشه کلا یه موج مربعی نامنظم خواهیم داشت که هیچ شباهتی به موج مربعی نداره در اصل نمیشه فرکانسش رو تعیین کرد
                  ها فکرشو نکرده بودم ولی برنامه من کلا 3 خط بود که همین PWM برای کنترل RGB
                  کار منو راه انداخت
                  درایور شبکه و nRF24L01
                  کاتالوگ محصولات
                  کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                  شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                  فروش اسيلوسکوپ GWinstek GOS-630FC

                  دیدگاه


                    #10
                    پاسخ : PWM روی پایه های دیگر

                    ببینم درست فهمیدم:

                    شما چندین موج PWM روی پایه های دلخواه با یک تایمر می خواهید. اگه جواب آره هست بگید تا کدش رو براتون بزام.
                    همواره يادمان باشد:
                    1-مردان بزرگ اراده مي کنند و مردان کوچک آرزو
                    2-افراد بزرگ، هميشه به دنبال ايده هاي بزرگند و افراد کوچک به دنبال افراد بزرگ
                    3-هميشه سعي کن آنقدر کامل باشي که بزرگترين تنبيه تو براي ديگران گرفتن خودت از آنها باشد.

                    دیدگاه


                      #11
                      پاسخ : PWM روی پایه های دیگر

                      با سلام اگر دارید برنامه رو دارید ممنون میشم بزارید

                      دیدگاه


                        #12
                        پاسخ : PWM روی پایه های دیگر

                        این هم کد مربوطه که توسط کامپایلر کدویژن و میکرو مگا8 با تایمر 2 نوشته شده است.تایمر 2 در حالت Normal و دارای وقفه می باشد.
                        نکته1: فرکانس کاری این سیگنال ها یکسان ولی دیوتی سایکل آنها متفاوت است.
                        نکته2: فرکانس کاری PWM می تواند با تغییر فرکانس کاری تایمر تغییر یابد.
                        نکته3: محدودیت در تعداد سیگنال PWM به دلیل صرف زمان برای اجرای کد در وقفه (تاخیر ایجاد شده بسیار بسیار ناچیز است، لذا برای موارد خیلی خیلی حساس پیشنهاد نمی شود)
                        نکته4: در انتخاب پورت برای سوار کردن موج PWM هیچ محدودیتی وجود ندارد.

                        این هم کد:
                        کد:
                        /*****************************************************
                        Author : S_Ahmad
                        Company : SAM
                        Chip type        : ATmega8
                        AVR Core Clock frequency: 8.000000 MHz
                        *****************************************************/
                        
                        #include <mega8.h>
                        #include <delay.h>
                        
                        unsigned char PWM_Signal_0,PWM_Signal_1,PWM_Signal_2,PWM_Signal_3;
                        int PWM_Counter;
                        
                        interrupt [TIM2_OVF] void timer2_ovf_isr(void)
                        {
                         if(PWM_Counter==256)
                          PWM_Counter=0;
                         
                         if(PWM_Counter==PWM_Signal_0)   
                          PORTB.0=0;
                         else if(PWM_Counter < PWM_Signal_0)
                          PORTB.0=1;   
                               
                         if(PWM_Counter==PWM_Signal_1)   
                          PORTB.1=0;
                         else if(PWM_Counter < PWM_Signal_1)
                          PORTB.1=1;
                         
                         if(PWM_Counter==PWM_Signal_2)   
                          PORTB.2=0;
                         else if(PWM_Counter < PWM_Signal_2)
                          PORTB.2=1;
                         
                         if(PWM_Counter==PWM_Signal_3)   
                          PORTB.3=0;
                         else if(PWM_Counter < PWM_Signal_3)
                          PORTB.3=1;
                         
                        PWM_Counter++;
                        }
                        
                        void main(void)
                        {
                        PORTB=0x00;
                        DDRB=0x0F;
                        
                        
                        // Timer/Counter 2 initialization
                        // Clock source: System Clock
                        // Clock value: 62.500 kHz
                        // Mode: Normal top=0xFF
                        // OC2 output: Disconnected
                        ASSR=0x00;
                        TCCR2=0x01;
                        TCNT2=0x00;
                        OCR2=0x00;
                        
                        // Timer(s)/Counter(s) Interrupt(s) initialization
                        TIMSK=0x40;
                        
                        ACSR=0x80;
                        SFIOR=0x00;
                        
                        #asm("sei")
                        
                        PWM_Signal_0=255;
                        PWM_Signal_1=90;
                        PWM_Signal_2=200;
                        PWM_Signal_3=50;
                        
                        while (1)
                          {
                           PWM_Signal_0++;
                           PWM_Signal_1++;
                           PWM_Signal_2++;
                           PWM_Signal_3++;
                           delay_ms(10);
                          }
                        }
                        همواره يادمان باشد:
                        1-مردان بزرگ اراده مي کنند و مردان کوچک آرزو
                        2-افراد بزرگ، هميشه به دنبال ايده هاي بزرگند و افراد کوچک به دنبال افراد بزرگ
                        3-هميشه سعي کن آنقدر کامل باشي که بزرگترين تنبيه تو براي ديگران گرفتن خودت از آنها باشد.

                        دیدگاه


                          #13
                          پاسخ : PWM روی پایه های دیگر

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

                          دیدگاه


                            #14
                            پاسخ : PWM روی پایه های دیگر

                            سلام دوستان
                            برای کسانی که از اینگونه موضوعات جستجو میکنند ولی چیز خوبی نصیبشون نشده این لینک رو میگذارم تا استفاده کنند ...
                            امیدوارم مفید باشه ....
                            چگونه همه پایه های میکروکنترلر را PWM کنیم ؟؟
                            با سه کامپایلر :
                            کدویژن
                            بسکام
                            اتمل استودیو
                            http://www.eca.ir/forum2/index.php?topic=90246.0
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه

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