اطلاعیه

Collapse
No announcement yet.

چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

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

    #61
    پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

    تشکر منم عین شما اول پالس هارو همینجوری دیدم.
    ولی عدد هاکه میبینید چشمک میزنه باید صفر باشن ولی همینجور که تو عکس معلومه هی ۴ و ۱ و ۶ و ۰ میشن.
    شمر ۱۴۰۰سال پیش مُرد؛شمر زمانت بشناس.
    [img width=400 height=100]http:///uploads/140623781981451.png[/img]
    [glow=green,2,100]یاحسین تشنه لب[/glow]

    دیدگاه


      #62
      پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم ا

      نوشته اصلی توسط عمو LED
      تشکر منم عین شما اول پالس هارو همینجوری دیدم.
      ولی عدد هاکه میبینید چشمک میزنه باید صفر باشن ولی همینجور که تو عکس معلومه هی ۴ و ۱ و ۶ و ۰ میشن.
      اینها رو ولش
      این پراب ها برای ولتاژهای ثابت به کار میره نه برای اینکار ...
      من بهتون تضمین میدم که تو عمل حتما کار خواهد کرد ... :agree:

      اگر جواب گرفتید حتما حتما فیلم بگیرید و برای بچه ها بگذارید ...
      البته اگه زحمتی نیست :redface:

      موفق باشید



      پستم رو اصلاح میکنم
      ببخشید :sad:
      اصلا یادم نبود اپتوکوپلرری که استفاده شده (PC817) تا 35 ولت بیشتر نمیتونه سوئیچ کنه ...
      اپتوکوپلری که مناسب دیدم برای این کار TLP521 است ...
      TLP521 میتونه تا 55 ولت سوئیچ کنه ...




      نوشته اصلی توسط عمو LED
      سلام
      شما فرکانس رو 8مگا گذاشتین قبلش من برنامم داشت با 4 مگ کار میکرد اومدم کل برنامم با 8مگ راه اندازی کنم برنامم مشکل برخورد.
      الان تایمر شما با کلاک 1 مگ کار میکنه چطور تغیرش بدم تا با فرکانس میکرو 4 مگم کار کنه.
      مال شما :
      در کل منظورم اینه که چه تغییر در pwm شما بدم تا با فرکانس 4 مگ میکرو هم مثل شما کار کنه.
      چون اگه من میکرو رو 4 بزارم و Prescale = 1 تایمر 4مگ میشه .!
      آیا باید tcnt0 را تغییر داد؟
      سلام
      این کارهایی که میگم رو انجام بدهید
      اول بجای این سه خط در برنامه
      کد:
      Config Timer0 = Timer , Prescale = 8
      Tcnt0 = 105
      Tcnt0 = 105
      اینها رو وارد کنید
      کد:
      Config Timer0 = Timer , Prescale = Divider 
      Tcnt0 = _time
      Tcnt0 = _time
      سپس اون بالا اینهایی رو که میگم برای فرکانسهای مختلف وارد کنید
      برای دو مگا هرتز :
      کد:
      $crystal = 2000000
      _time Alias 225
      Divider Alias 8
      برای چهار مگا هرتز :
      کد:
      $crystal = 4000000
      _time Alias 185
      Divider Alias 8
      برای هشت مگا هرتز :
      کد:
      $crystal = 8000000
      _time Alias 105
      Divider Alias 8
      برای شانزده مگا هرتز :
      کد:
      $crystal = 16000000
      _time Alias 0
      Divider Alias 8
      برای فرکانس یک مگا به هیچ عنوان پیشنهاد نمیکنم ...
      چون پردازش کم میاره ... و نمیرسه که اون کارها رو بکنه ...

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

      دیدگاه


        #63
        پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

        دیشب پست دادم مثل اینکه نیومد !
        اینو میخواستم بگم که.
        من بعد حدود 2 ساعت کاری کردم که برنامم با 8مگ خوب کار کنه.
        ولی بازم دستون درد نکنه که جواب دادین با این گفته هاتون بازم چیز جدید یاد گرفتم.
        تشکر تشکر
        شمر ۱۴۰۰سال پیش مُرد؛شمر زمانت بشناس.
        [img width=400 height=100]http:///uploads/140623781981451.png[/img]
        [glow=green,2,100]یاحسین تشنه لب[/glow]

        دیدگاه


          #64
          پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

          نوشته اصلی توسط عمو LED
          دیشب پست دادم مثل اینکه نیومد !
          اینو میخواستم بگم که.
          من بعد حدود 2 ساعت کاری کردم که برنامم با 8مگ خوب کار کنه.
          ولی بازم دستون درد نکنه که جواب دادین با این گفته هاتون بازم چیز جدید یاد گرفتم.
          تشکر تشکر
          خواهش میکنم ...
          کاری نکردم ...
          راستی
          موتورها کار کردند ؟؟؟
          سرعت موتورها کم و زیاد شد ؟؟؟
          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
          معرفی نرم افزار Codewizard PWM
          با من بیشتر آشنا شوید

          دیدگاه


            #65
            پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

            موتور ها دستم نرسیده؛ رو یک موتور کوچولو ها تست کردم جواب داد.
            فیلم که گفتین . اونم تا امروز یا فردا میزارم
            [hr]
            فردای دیروز :mrgreen:
            سرعت گذاشتم رو 99 این شد [glow=blue,2,100]◕‿◕[/glow]
            dcs1.mp4
            شمر ۱۴۰۰سال پیش مُرد؛شمر زمانت بشناس.
            [img width=400 height=100]http:///uploads/140623781981451.png[/img]
            [glow=green,2,100]یاحسین تشنه لب[/glow]

            دیدگاه


              #66
              پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

              نوشته اصلی توسط عمو LED
              موتور ها دستم نرسیده؛ رو یک موتور کوچولو ها تست کردم جواب داد.
              فیلم که گفتین . اونم تا امروز یا فردا میزارم
              [hr]
              فردای دیروز :mrgreen:
              سرعت گذاشتم رو 99 این شد [glow=blue,2,100]◕‿◕[/glow]
              dcs1.mp4
              خوب بود
              ممنون
              راستی
              دیود هرزگرد حتما بگذارید ...
              اگر نگذارید ممکنه به ماسفت آسیب برسونه ...


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

              دیدگاه


                #67
                پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                به یه مشکلی برخوردم
                برای نشان دادن مشکل در روشن شدن موتور led گذاشتم که 4 بار چشک بزنه با زمان 100ms ولی اصلا چشمک نمیزنه و ثابته.
                حتی اومدم قبل led گذاشتم که تایمر خاموش بشه ولی بازم led چشمک نمیزنه.
                چرا! چرا! چرا!
                فکر کنم همون مشکلات که گفتی بهش برخوردم :(
                شمر ۱۴۰۰سال پیش مُرد؛شمر زمانت بشناس.
                [img width=400 height=100]http:///uploads/140623781981451.png[/img]
                [glow=green,2,100]یاحسین تشنه لب[/glow]

                دیدگاه


                  #68
                  پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                  نوشته اصلی توسط عمو LED
                  به یه مشکلی برخوردم
                  برای نشان دادن مشکل در روشن شدن موتور led گذاشتم که 4 بار چشک بزنه با زمان 100ms ولی اصلا چشمک نمیزنه و ثابته.
                  حتی اومدم قبل led گذاشتم که تایمر خاموش بشه ولی بازم led چشمک نمیزنه.
                  چرا! چرا! چرا!
                  فکر کنم همون مشکلات که گفتی بهش برخوردم :(
                  خوب شماتیک مداری که بستید و با برنامه ای که نوشتید رو بگذارید تا ببینم مشکلتون چیه ...

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

                  دیدگاه


                    #69
                    پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                    نوشته اصلی توسط Saman.Asadi
                    درود بر دوستان
                    امیدوارم حال همتون عالی باشه

                    من امروز میخوام PWM نرم افزاری رو به شما معرفی کنم
                    چون خیلی از دوستان دیدم که گذرشون به این کارها میخوره
                    همون طور که میدونید اکثر میکروهای AVR هشت بیتی PWM سخت افزاری محدودی دارند و اگر بخواهیم که آنها را به کار بگیریم باید از همون پایه ای که مشخص شده PWM بگیریم ...
                    بنابراین اگر کسی بخواهد که از پایه های دیگه PWM بگیرد باید به صورت نرم افزاری تعریف کند تا پایه دلخواه را PWM کند ...
                    در این تاپیک سعی شده تمام مطالب را به سادگی بیان شود
                    البته این را هم بگم که در بعضی از تاپیکها نمونه این برنامه را نوشتند ولی من سعی کردم که این برنامه را طوری طراحی کنم که تعریف کردن برنامه خیلی راحت باشد .
                    بریم سر اصل مطلب
                    همانطور که می دانید برای هر PWM نیاز به یک تایمر دارد . البته در بعضی از تایمرها هستند که 3تا PWM تولید میکنند . اما در این برنامه ای که میخواهم برای شما معرفی کنم تنها یک تایمر بکار رفته است . تایمر صفر رو انتخاب کردم که امکاتاتش کمه و به کارمون میاد !! دلیل اینکه چرا از تایمر های دیگه استفاده نکردم اینه که گفتم شاید کسی از تایمر های دیگه که خیلی امکاناتش بالاتره بخواهد استفاده کند .
                    با استفاده از تایمر 0 میکروهای 128-64-ATmega16-32 این قابلیت را دارند که انجام مقایسه ای مقدار تایمر را انجام دهد(در بعضی از تایمر0 میکرو ها فقط این قابلیت رو دارند که Overflow کنند مثل ATmega8 ) . پس میتوانیم در این تایمر فرکانس را کم و زیاد کنیم . اگر فرکانس را بالا ببریم (مقدار OCR0 را کم کنیم) پردازش زیادتر میشود و دقت پایین می آید و اگر فرکانس رو کم کنیم دقت زیاد میشود . ما در این پروژه نیازی به این دو داریم ولی تا یک حدی !!! این تایمر در مد CTC تنظیم شده است .
                    اگر برایتان فرکانس زیاد مهم نیست مقدار OCR0 را زیادتر کنید تا پردازش کمتر شود . دلیل اینکه روی بحث پردازش تاکید میکنم این هست که روی دستورات تاخیری تاثیر میگذارد و این باعث میشود که تاخیرات نرم افزاری دیرتر صورت بگیرد .

                    خب بریم سر اصل مطلب
                    هدف از این پروژه این بود که یک LED بارانی یا به قول بچه ها شهاب سنگ LED بسازم ولی از اونجایی که صفحه 5 این تاپیک رو نخونده بودم فکر میکردم که کسی برنامش رو نگذاشته .
                    این هم بگم که قبلا دو تا تاپیک دیدم که درباره این موضوع بحث شده
                    http://www.eca.ir/forum2/index.php?topic=66771.15
                    http://www.eca.ir/forum2/index.php?topic=64272.60
                    ولی چون کاربرد PWM فقط در LED بارانی نیست من این تاپیک رو باز کردم تا همه استفاده کنند .

                    برنامه ها

                    برنامه برای ATmega16-32
                    کد:
                    /*****************************************************
                    This program was produced by the
                    CodeWizardAVR V2.05.3 Standard
                    Automatic Program Generator
                    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
                    http://www.hpinfotech.com
                    Project : 32-channel PWM (Rain LED)
                    Version : 2.0
                    Date  : 2/27/2014
                    Author : Saman.Asadi
                    www.ECA.ir
                    Chip type        : ATmega16
                    Program type      : Application
                    AVR Core Clock frequency: 8.000000 MHz
                    Memory model      : Small
                    External RAM size    : 0
                    Data Stack size     : 256
                    *****************************************************/
                    #include <mega16a.h>
                    #include <delay.h>
                    
                    #define led1    PORTA.0
                    #define led2    PORTA.1
                    #define led3    PORTA.2
                    #define led4    PORTA.3
                    #define led5    PORTA.4
                    #define led6    PORTA.5
                    #define led7    PORTA.6
                    #define led8    PORTA.7
                    #define led9    PORTC.7
                    #define led10    PORTC.6
                    #define led11    PORTC.5
                    #define led12    PORTC.4
                    #define led13    PORTC.3
                    #define led14    PORTC.2
                    #define led15    PORTC.1
                    #define led16    PORTC.0
                    #define led17    PORTD.7
                    #define led18    PORTD.6
                    #define led19    PORTD.5
                    #define led20    PORTD.4
                    #define led21    PORTD.3
                    #define led22    PORTD.2
                    #define led23    PORTD.1
                    #define led24    PORTD.0
                    #define led25    PORTB.7
                    #define led26    PORTB.6
                    #define led27    PORTB.5
                    #define led28    PORTB.4
                    #define led29    PORTB.3
                    #define led30    PORTB.2
                    #define led31    PORTB.1
                    #define led32    PORTB.0
                    #define byte    unsigned char
                    #define max_var_PWM 100
                    #define factor
                    byte    a = max_var_PWM;
                    byte    pwm[35];
                    flash byte rain1[25]={99,70,40,20,10,5,4,3,2,1,0};
                    flash byte rain2[40]={0,1,2,3,4,5,10,20,40,70,99,70,40,20,10,5,4,3,2,1,0};
                    flash byte rain3[35]={0,1,2,3,4,5,10,20,40,70,99};
                    flash byte rain4[40]={1,2,3,4,5,10,20,40,70,99,70,40,20,10,5,4,3,2,1,0};
                    
                    // Timer 0 output compare interrupt service routine
                    interrupt [TIM0_COMP] void timer0_comp_isr(void)
                    {
                      if(a < pwm[1] )led1=1;
                      if(a < pwm[2] )led2=1;
                      if(a < pwm[3] )led3=1;
                      if(a < pwm[4] )led4=1;
                      if(a < pwm[5] )led5=1;
                      if(a < pwm[6] )led6=1;
                      if(a < pwm[7] )led7=1;
                      if(a < pwm[8] )led8=1;
                      if(a < pwm[9] )led9=1;
                      if(a < pwm[10])led10=1;
                      if(a < pwm[11])led11=1;
                      if(a < pwm[12])led12=1;
                      if(a < pwm[13])led13=1;
                      if(a < pwm[14])led14=1;
                      if(a < pwm[15])led15=1;
                      if(a < pwm[16])led16=1;
                      if(a < pwm[17])led17=1;
                      if(a < pwm[18])led18=1;
                      if(a < pwm[19])led19=1;
                      if(a < pwm[20])led20=1;
                      if(a < pwm[21])led21=1;
                      if(a < pwm[22])led22=1;
                      if(a < pwm[23])led23=1;
                      if(a < pwm[24])led24=1;
                      if(a < pwm[25])led25=1;
                      if(a < pwm[26])led26=1;
                      if(a < pwm[27])led27=1;
                      if(a < pwm[28])led28=1;
                      if(a < pwm[29])led29=1;
                      if(a < pwm[30])led30=1;
                      if(a < pwm[31])led31=1;
                      if(a < pwm[32])led31=1;
                      a-=1;
                      if(a == 255)
                      {  a = max_var_PWM;
                        PORTA=0;
                        PORTB=0;
                        PORTC=0;
                        PORTD=0;
                      }
                    }
                    
                    void main(void)
                    {
                      byte x1,x2,x3;
                      //Config all
                      //Config timers
                      //Config PORTS
                      {
                        DDRA=255;
                        DDRB=255;
                        DDRC=255;
                        DDRD=255;
                        // Timer/Counter 0 initialization
                        // Clock source: System Clock
                        // Clock value: 1000.000 kHz
                        // Mode: CTC top=OCR0
                        // OC0 output: Disconnected
                        TCCR0=0x0A;
                        OCR0=150;
                        // Timer(s)/Counter(s) Interrupt(s) initialization
                        TIMSK=0x02;
                        // Glopwmal enapwmle interrupts
                        #asm("sei")
                      }
                      //End Config ......
                      while(1)
                      {
                        /////////////////////////////////////////
                        for(x1=0;x1<25;x1++)
                        {  pwm[1]=rain1[x1];
                          for(x2=17;x2>0;x2--)pwm[x2+1]=pwm[x2];
                          delay_ms(40);
                        }
                        for(x1=0;x1<35;x1++)
                        {  pwm[1]=rain2[x1];
                          for(x2=17;x2>0;x2--)pwm[x2+1]=pwm[x2];
                          delay_ms(40);
                        }
                        delay_ms(500);
                        for(x1=0;x1<25;x1++)
                        {  pwm[1]=rain3[x1];
                          for(x2=17;x2>0;x2--)pwm[x2+1]=pwm[x2];
                          delay_ms(40);
                        }
                        /////////////////////////////////////////
                        for(x1=0;x1<25;x1++)
                        {  pwm[17]=rain1[x1];
                          for(x2=0;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          delay_ms(40);
                        }
                        for(x1=0;x1<35;x1++)
                        {  pwm[17]=rain2[x1];
                          for(x2=0;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          delay_ms(40);
                        }
                        for(x1=0;x1<25;x1++)
                        {  pwm[17]=rain3[x1];
                          for(x2=0;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          delay_ms(40);
                        }
                        //////////////////////////////////////////
                        for(x3=0;x3<3;x3++)
                        for(x1=0;x1<14;x1++)
                        {  for(x2=0;x2<8;x2++)pwm[x2]=pwm[x2+1];
                          for(x2=17;x2>9;x2--)pwm[x2]=pwm[x2-1];
                          pwm[8]=rain1[x1];
                          pwm[9]=rain1[x1];
                          delay_ms(40);
                        }
                        for(x3=0;x3<3;x3++)
                        for(x1=0;x1<14;x1++)
                        {  for(x2=8;x2>00;x2--)pwm[x2]=pwm[x2-1];
                          for(x2=9;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          pwm[0]=rain1[x1];
                          pwm[17]=rain1[x1];
                          delay_ms(40);
                        }
                        //////////////////////////////////////////
                        for(x3=0;x3<4;x3++)
                        for(x1=0;x1<19;x1++)
                        {  for(x2=0;x2<8;x2++)pwm[x2]=pwm[x2+1];
                          for(x2=17;x2>9;x2--)pwm[x2]=pwm[x2-1];
                          pwm[8]=rain4[x1];
                          pwm[9]=rain4[x1];
                          delay_ms(40);
                        }
                        for(x3=0;x3<4;x3++)
                        for(x1=0;x1<19;x1++)
                        {  for(x2=8;x2>00;x2--)pwm[x2]=pwm[x2-1];
                          for(x2=9;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          pwm[0]=rain4[x1];
                          pwm[17]=rain4[x1];
                          delay_ms(40);
                        }
                        //////////////////////////////////////////
                      }
                    }
                    برنامه برای ATmega64-128
                    کد:
                    /*****************************************************
                    This program was produced by the
                    CodeWizardAVR V2.05.3 Standard
                    Automatic Program Generator
                    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
                    http://www.hpinfotech.com
                    Project : 53-channel PWM (Rain LED)
                    Version : 3.0
                    Date  : 2/27/2014
                    Author : Saman.Asadi
                    www.ECA.ir
                    Chip type        : ATmega64A
                    Program type      : Application
                    AVR Core Clock frequency: 8.000000 MHz
                    Memory model      : Small
                    External RAM size    : 0
                    Data Stack size     : 2048
                    *****************************************************/ 
                    
                    #include <mega64a.h>
                    #include <delay.h>
                    #include <iobits.h>
                    
                    #define setled1   SETBIT(PORTF,0)
                    #define setled2   SETBIT(PORTF,1)
                    #define setled3   SETBIT(PORTF,2)
                    #define setled4   SETBIT(PORTF,3)
                    #define setled5   SETBIT(PORTF,4)
                    #define setled6   SETBIT(PORTF,5)
                    #define setled7   SETBIT(PORTF,6)
                    #define setled8   SETBIT(PORTF,7)
                    #define setled9   SETBIT(PORTA,0)
                    #define setled10  SETBIT(PORTA,1)
                    #define setled11  SETBIT(PORTA,2)
                    #define setled12  SETBIT(PORTA,3)
                    #define setled13  SETBIT(PORTA,4)
                    #define setled14  SETBIT(PORTA,5)
                    #define setled15  SETBIT(PORTA,6)
                    #define setled16  SETBIT(PORTA,7)
                    #define setled17  SETBIT(PORTG,2)
                    #define setled18  SETBIT(PORTC,7)
                    #define setled19  SETBIT(PORTC,6)
                    #define setled20  SETBIT(PORTC,5)
                    #define setled21  SETBIT(PORTC,4)
                    #define setled22  SETBIT(PORTC,3)
                    #define setled23  SETBIT(PORTC,2)
                    #define setled24  SETBIT(PORTC,1)
                    #define setled25  SETBIT(PORTC,0)
                    #define setled26  SETBIT(PORTG,1)
                    #define setled27  SETBIT(PORTG,0)
                    #define setled28  SETBIT(PORTD,7)
                    #define setled29  SETBIT(PORTD,6)
                    #define setled30  SETBIT(PORTD,5)
                    #define setled31  SETBIT(PORTD,4)
                    #define setled32  SETBIT(PORTD,3)
                    #define setled33  SETBIT(PORTD,2)
                    #define setled34  SETBIT(PORTD,1)
                    #define setled35  SETBIT(PORTD,0)
                    #define setled36  SETBIT(PORTG,4)
                    #define setled37  SETBIT(PORTG,3)
                    #define setled38  SETBIT(PORTB,7)
                    #define setled39  SETBIT(PORTB,6)
                    #define setled40  SETBIT(PORTB,5)
                    #define setled41  SETBIT(PORTB,4)
                    #define setled42  SETBIT(PORTB,3)
                    #define setled43  SETBIT(PORTB,2)
                    #define setled44  SETBIT(PORTB,1)
                    #define setled45  SETBIT(PORTB,0)
                    #define setled46  SETBIT(PORTE,7)
                    #define setled47  SETBIT(PORTE,6)
                    #define setled48  SETBIT(PORTE,5)
                    #define setled49  SETBIT(PORTE,4)
                    #define setled50  SETBIT(PORTE,3)
                    #define setled51  SETBIT(PORTE,2)
                    #define setled52  SETBIT(PORTE,1)
                    #define setled53  SETBIT(PORTE,0)
                    
                    #define byte    unsigned char
                    #define max_var_PWM 100
                    #define factor
                    
                    byte    a = max_var_PWM;
                    byte    pwm[55];
                    flash byte rain1[25]={99,70,40,20,10,5,4,3,2,1,0};
                    flash byte rain2[40]={0,1,2,3,4,5,10,20,40,70,99,70,40,20,10,5,4,3,2,1,0};
                    flash byte rain3[35]={0,1,2,3,4,5,10,20,40,70,99};
                    flash byte rain4[40]={1,2,3,4,5,10,20,40,70,99,70,40,20,10,5,4,3,2,1,0};
                    
                    // Timer 0 output compare interrupt service routine
                    interrupt [TIM0_COMP] void timer0_comp_isr(void)
                    {
                      if(a < pwm[1] )setled1;
                      if(a < pwm[2] )setled2;
                      if(a < pwm[3] )setled3;
                      if(a < pwm[4] )setled4;
                      if(a < pwm[5] )setled5;
                      if(a < pwm[6] )setled6;
                      if(a < pwm[7] )setled7;
                      if(a < pwm[8] )setled8;
                      if(a < pwm[9] )setled9;
                      if(a < pwm[10])setled10;
                      if(a < pwm[11])setled11;
                      if(a < pwm[12])setled12;
                      if(a < pwm[13])setled13;
                      if(a < pwm[14])setled14;
                      if(a < pwm[15])setled15;
                      if(a < pwm[16])setled16;
                      if(a < pwm[17])setled17;
                      if(a < pwm[18])setled18;
                      if(a < pwm[19])setled19;
                      if(a < pwm[20])setled20;
                      if(a < pwm[21])setled21;
                      if(a < pwm[22])setled22;
                      if(a < pwm[23])setled23;
                      if(a < pwm[24])setled24;
                      if(a < pwm[25])setled25;
                      if(a < pwm[26])setled26;
                      if(a < pwm[27])setled27;
                      if(a < pwm[28])setled28;
                      if(a < pwm[29])setled29;
                      if(a < pwm[30])setled30;
                      if(a < pwm[31])setled31;
                      if(a < pwm[32])setled32;
                      if(a < pwm[33])setled33;
                      if(a < pwm[34])setled34;
                      if(a < pwm[35])setled35;
                      if(a < pwm[36])setled36;
                      if(a < pwm[37])setled37;
                      if(a < pwm[38])setled38;
                      if(a < pwm[39])setled39;
                      if(a < pwm[40])setled40;
                      if(a < pwm[41])setled41;
                      if(a < pwm[42])setled42;
                      if(a < pwm[43])setled43;
                      if(a < pwm[44])setled44;
                      if(a < pwm[45])setled45;
                      if(a < pwm[46])setled46;
                      if(a < pwm[47])setled47;
                      if(a < pwm[48])setled48;
                      if(a < pwm[49])setled49;
                      if(a < pwm[50])setled50;
                      if(a < pwm[51])setled51;
                      if(a < pwm[52])setled52;
                      if(a < pwm[53])setled53;
                      a-=1;
                      if(a == 255)
                      {  a = max_var_PWM;
                        PORTA=0;
                        PORTB=0;
                        PORTC=0;
                        PORTD=0;
                        PORTE=0;
                        PORTF=0;
                        PORTG=0;
                      }
                    }
                    
                    void main(void)
                    {
                      byte x1,x2,x3;
                      //Config all
                      //Config timers
                      //Config PORTS
                      {
                        DDRA=255;
                        DDRB=255;
                        DDRC=255;
                        DDRD=255;
                        DDRE=255;
                        DDRF=255;
                        DDRG=31;
                        // Timer/Counter 0 initialization
                        // Clock source: System Clock
                        // Clock value: 1000.000 kHz
                        // Mode: CTC top=OCR0
                        // OC0 output: Disconnected
                        TCCR0=0x0A;
                        OCR0=150;
                        // Timer(s)/Counter(s) Interrupt(s) initialization
                        TIMSK=0x02;
                        // Glopwmal enapwmle interrupts
                        #asm("sei")
                      }
                      //End Config ......
                      while(1)
                      {
                        /////////////////////////////////////////
                        for(x1=0;x1<25;x1++)
                        {  pwm[1]=rain1[x1];
                          for(x2=17;x2>0;x2--)pwm[x2+1]=pwm[x2];
                          delay_ms(40);
                        }
                        for(x1=0;x1<35;x1++)
                        {  pwm[1]=rain2[x1];
                          for(x2=17;x2>0;x2--)pwm[x2+1]=pwm[x2];
                          delay_ms(40);
                        }
                        delay_ms(500);
                        for(x1=0;x1<25;x1++)
                        {  pwm[1]=rain3[x1];
                          for(x2=17;x2>0;x2--)pwm[x2+1]=pwm[x2];
                          delay_ms(40);
                        }
                        /////////////////////////////////////////
                        for(x1=0;x1<25;x1++)
                        {  pwm[17]=rain1[x1];
                          for(x2=0;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          delay_ms(40);
                        }
                        for(x1=0;x1<35;x1++)
                        {  pwm[17]=rain2[x1];
                          for(x2=0;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          delay_ms(40);
                        }
                        for(x1=0;x1<25;x1++)
                        {  pwm[17]=rain3[x1];
                          for(x2=0;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          delay_ms(40);
                        }
                        //////////////////////////////////////////
                        for(x3=0;x3<3;x3++)
                        for(x1=0;x1<14;x1++)
                        {  for(x2=0;x2<8;x2++)pwm[x2]=pwm[x2+1];
                          for(x2=17;x2>9;x2--)pwm[x2]=pwm[x2-1];
                          pwm[8]=rain1[x1];
                          pwm[9]=rain1[x1];
                          delay_ms(40);
                        }
                        for(x3=0;x3<3;x3++)
                        for(x1=0;x1<14;x1++)
                        {  for(x2=8;x2>00;x2--)pwm[x2]=pwm[x2-1];
                          for(x2=9;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          pwm[0]=rain1[x1];
                          pwm[17]=rain1[x1];
                          delay_ms(40);
                        }
                        //////////////////////////////////////////
                        for(x3=0;x3<4;x3++)
                        for(x1=0;x1<19;x1++)
                        {  for(x2=0;x2<8;x2++)pwm[x2]=pwm[x2+1];
                          for(x2=17;x2>9;x2--)pwm[x2]=pwm[x2-1];
                          pwm[8]=rain4[x1];
                          pwm[9]=rain4[x1];
                          delay_ms(40);
                        }
                        for(x3=0;x3<4;x3++)
                        for(x1=0;x1<19;x1++)
                        {  for(x2=8;x2>00;x2--)pwm[x2]=pwm[x2-1];
                          for(x2=9;x2<17;x2++)pwm[x2]=pwm[x2+1];
                          pwm[0]=rain4[x1];
                          pwm[17]=rain4[x1];
                          delay_ms(40);
                        }
                        //////////////////////////////////////////
                      }
                    }
                    ================================================== ==================
                    یک توضیح مختصر در مورد برنامه :
                    برنامه طوری طراحی شده که با استفاده از آرایه میتوانیم مقدار تک تک PWM ها را تغییر بدهیم
                    آرایه ای که []pwm نام دارد را میتوانید اندیس آن را برای PWM دلخواهتان تنظیم کنید
                    بازه مقدار آرایه PWM از 0 تا 99 است که نشانگر دیوتی سایکل است :biggrin:
                    این آرایه یه جورایی میشه گفت که مثل رجیستر عمل میکنه . یعنی اینکه تا مقدار به آن بدهیم PWM تنظیم میشود .
                    ================================================== ==================
                    برنامه ATmega64-128 :
                    در این دو میکرو به دلیل اینکه دستور PORTx.y فقط برای پورتهای A,B,C,D کاربرد دارد گفتم چه بهتر که همه رو با استفاده از دستورات کتابخانه ای خود کدویژن به کار بگیرم .
                    از لحاظ پردازش هم با این فرکانس و این تقسیم کننده فرکانس در تایمر ، در میکروی اتمگا 16 و 32 تقریبا 15.75% و در میکرو های اتمگا 64 و 128 تقریبا 24.67% پردازش میکرو را میگیرد . (البته این محاسبات در بدترین شرایط در نظر گرفته شده است .)
                    اگر بخواهید از تمام PWM های نرم افزاری استفاده نکنید میتوانید یکسری تنظیمات را تغییر دهید ...
                    البته که اگر PWM های کمتری را به کار بگیرید پردازش کمتری خواهد گرفت .

                    راستی بچه ها من این برنامه رو که براتون گذاشتم 16 تا LED بهش وصل کردم برای تست .
                    این هم کلیپ ( 1.5 مگابایت)
                    http://s5.picofile.com/file/8115298350/MOV03572.mp4.html
                    LED بیشتر هم داشتم ولی سه میلیمتری نبودند
                    برنامه ای که درون حلقه While نوشتم اینکار را انجام میدهد
                    البته افکتهای بیشتر رو هم میتونستم بگذارم ولی وقت نکردم

                    دوستان سوالی بود در خدمتم
                    موفق باشید
                    ----------------------------------------------------------------------
                    اصلاح شده این برنامه در پست بعدی گذاشته شده است

                    سلام اقا شرمنده من خوندم اما نتونستم کامل تحلیلش کنم
                    میشه راهنماییم کنی به من بگو چه طور یه پین رو باهاش از طریق نرم افزاری pwm بسازم؟
                    و میخام مقدار pwm من 8 بیتی باشه فرکانس هم نهایتا 1khz باشه فرکانس کاری میکرو من 16 مگ هست راهنماییم کنی ممنون میشم.

                    دیدگاه


                      #70
                      پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                      نوشته اصلی توسط anti.dark

                      سلام اقا شرمنده من خوندم اما نتونستم کامل تحلیلش کنم
                      میشه راهنماییم کنی به من بگو چه طور یه پین رو باهاش از طریق نرم افزاری pwm بسازم؟
                      و میخام مقدار pwm من 8 بیتی باشه فرکانس هم نهایتا 1khz باشه فرکانس کاری میکرو من 16 مگ هست راهنماییم کنی ممنون میشم.
                      سلام
                      والا نمیدونم که بشه یا نه ... فکر میکنم میکرو پردازش کم میاره ...
                      اگر کار خاصی نمیخواهید انجام دهید فرکانس 60 تا 100 هرتز رو میتونم راهنماییتون کنم ...
                      اگر بیشتر از این فرکانس خواستید حتما با PWM سخت افزاری کار کنید ... چون پردازش کم میاره و نمیتونه پاسخگوی شما باشه ...
                      PWM نرم افزاری که من طراحی کردم حدودا فرکانسش 65 هرتز است .... یعنی باید 65 بار در ثانیه وضعیت کل پایه ها را ریست کند ...
                      مقدار متغیرهای آرایه PWM هم از 0 تا 99 گذاشتم به عنوان دیوتی سایکل ...
                      حالا چون من از 0 تا 99 گذاشتم بنابراین باید 100 بار در یک سیکل کل پایه های PWM را بررسی کند ... (برای تنظیم دیوتی سایکل )
                      با توجه به گفته های بالا میتوان اینطور بیان کرد که یک ثانیه تقسیم بر 65*100 که میشه 153 میکرو ثانیه ....
                      یعنی اینکه هر 150 میکرو ثانیه باید دیوتی سایکل کل پایه ها را بررسی کند ...(حتی اگر تنها یک پایه PWM باشد)

                      خوب حالا شما میخواهید که فرکانسش 1کیلو هرتز باشه با دقت 8 بیتی ...
                      یک ثانیه تقسیم بر 1000*256 میشود 3.9 میکرو ثانیه ...
                      یعنی باید هر 3.9 میکرو ثانیه وضعیت دیوتی سایکل را مشخص کند ...
                      که این خودش کار بیهوده ای است ....
                      مهمترین چیز هم در میکرو پردازش آن است که با این کار داریم عملا نفس میکروکنترلر را میگیریم ...

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

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

                      دیدگاه


                        #71
                        پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                        نوشته اصلی توسط Saman.Asadi
                        سلام
                        والا نمیدونم که بشه یا نه ... فکر میکنم میکرو پردازش کم میاره ...
                        اگر کار خاصی نمیخواهید انجام دهید فرکانس 60 تا 100 هرتز رو میتونم راهنماییتون کنم ...
                        اگر بیشتر از این فرکانس خواستید حتما با PWM سخت افزاری کار کنید ... چون پردازش کم میاره و نمیتونه پاسخگوی شما باشه ...
                        PWM نرم افزاری که من طراحی کردم حدودا فرکانسش 65 هرتز است .... یعنی باید 65 بار در ثانیه وضعیت کل پایه ها را ریست کند ...
                        مقدار متغیرهای آرایه PWM هم از 0 تا 99 گذاشتم به عنوان دیوتی سایکل ...
                        حالا چون من از 0 تا 99 گذاشتم بنابراین باید 100 بار در یک سیکل کل پایه های PWM را بررسی کند ... (برای تنظیم دیوتی سایکل )
                        با توجه به گفته های بالا میتوان اینطور بیان کرد که یک ثانیه تقسیم بر 65*100 که میشه 153 میکرو ثانیه ....
                        یعنی اینکه هر 150 میکرو ثانیه باید دیوتی سایکل کل پایه ها را بررسی کند ...(حتی اگر تنها یک پایه PWM باشد)

                        خوب حالا شما میخواهید که فرکانسش 1کیلو هرتز باشه با دقت 8 بیتی ...
                        یک ثانیه تقسیم بر 1000*256 میشود 3.9 میکرو ثانیه ...
                        یعنی باید هر 3.9 میکرو ثانیه وضعیت دیوتی سایکل را مشخص کند ...
                        که این خودش کار بیهوده ای است ....
                        مهمترین چیز هم در میکرو پردازش آن است که با این کار داریم عملا نفس میکروکنترلر را میگیریم ...

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

                        موفق باشید
                        در بهترین حالت من 1 کیلو میخام که میگین نمیشه اما کار من با 100 هرتز هم راه مییفته

                        ببینین من الان rs485 ام رو تغییر دادم به این صورت که پکیج هایی که میفرسته عددی بین 0 تا 100 بفرسته
                        شما فقط بهم بگین چی کار کنم که pwm ا تو بهترین وضعیت تو فرکانس 100 هرتز کار کنن دیوتی سایکل هم همون 0 تا 100 خوبه

                        من میخام 48 تا led درایو کنم که در هر ثانیه 25 بار تغییر رنگ میدن راهنماییم کنین عالی میشه .

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

                        if(a == 255)
                        { a = max_var_PWM;
                        PORTA=0;
                        PORTB=0;
                        PORTC=0;
                        PORTD=0;
                        }

                        چرا a=255 ؟

                        کد ویژن کار میکنم
                        علت 1 کیلو هرتز هم به این علت هست چون کار من جلوی دوربین هست نمیخام ریپل ها معلوم باشه
                        چشم انسان بالای 50 هرتز رو درک نمیکنه فعلا برای راه اندازی مجبورم به همون 100 هرتز قانع بشم.

                        دیدگاه


                          #72
                          پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                          نوشته اصلی توسط anti.dark
                          در بهترین حالت من 1 کیلو میخام که میگین نمیشه اما کار من با 100 هرتز هم راه مییفته

                          ببینین من الان rs485 ام رو تغییر دادم به این صورت که پکیج هایی که میفرسته عددی بین 0 تا 100 بفرسته
                          شما فقط بهم بگین چی کار کنم که pwm ا تو بهترین وضعیت تو فرکانس 100 هرتز کار کنن دیوتی سایکل هم همون 0 تا 100 خوبه

                          من میخام 48 تا led درایو کنم که در هر ثانیه 25 بار تغییر رنگ میدن راهنماییم کنین عالی میشه .

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

                          if(a == 255)
                          { a = max_var_PWM;
                          PORTA=0;
                          PORTB=0;
                          PORTC=0;
                          PORTD=0;
                          }

                          چرا a=255 ؟

                          کد ویژن کار میکنم
                          علت 1 کیلو هرتز هم به این علت هست چون کار من جلوی دوربین هست نمیخام ریپل ها معلوم باشه
                          چشم انسان بالای 50 هرتز رو درک نمیکنه فعلا برای راه اندازی مجبورم به همون 100 هرتز قانع بشم.
                          دلیل اینکه چرا شرط رو گذاشتم a=255 به خاطر اینه که زمانی که a=0 هست و --a بگذاریم یکی از اون کم میشه و مقدارش به 255 میرسه ... در حقیقت میشه منفی یک ... توی این قسمت حتما باید بشه 99 ....
                          یعنی از 99 یکی یکی کم میشه تا به صفر میرسه و اگر یکی ازش کم بشه باید مقدارش به 99 تغییر پیدا کنه ...

                          خوب
                          برنامه ای که میخواین با تایمر میکرو کار نشه بهتره ... چون دو وقفه سریال و تایمر با هم تداخل دارند ....
                          توی این تاپیک دقیقا برای این چیزی که شما میخواین بحث شده ....
                          http://www.eca.ir/forum2/index.php?topic=91934.msg574087#msg574087
                          برنامه اش هم به این صورت هست که توی برنامه اصلی یک تاخیر میگذاریم و بعد همان شرط ها را میگذاریم (تایمر مجازی)
                          کد:
                          	while(1)
                          	{
                          		if(a)
                          		{
                          			if(a == pwm[1] )Set_LED1;
                          			if(a == pwm[2] )Set_LED2;
                          			if(a == pwm[3] )Set_LED3;
                          			if(a == pwm[4] )Set_LED4;
                          			if(a == pwm[5] )Set_LED5;
                          			if(a == pwm[6] )Set_LED6;
                          			if(a == pwm[7] )Set_LED7;
                          			if(a == pwm[8] )Set_LED8;
                          			if(a == pwm[9] )Set_LED9;
                          			if(a == pwm[10])Set_LED10;
                          			if(a == pwm[11])Set_LED11;
                          			if(a == pwm[12])Set_LED12;
                          			if(a == pwm[13])Set_LED13;
                          			if(a == pwm[14])Set_LED14;
                          			if(a == pwm[15])Set_LED15;
                          			if(a == pwm[16])Set_LED16;
                          			if(a == pwm[17])Set_LED17;
                          			if(a == pwm[18])Set_LED18;
                          			if(a == pwm[19])Set_LED19;
                          			if(a == pwm[20])Set_LED20;
                          			if(a == pwm[21])Set_LED21;
                          			if(a == pwm[22])Set_LED22;
                          		}
                          		if(--a == 255)
                          		{  a = max_var_PWM;
                          			PORTB=0;
                          			PORTC=0;
                          			PORTD=0;
                          		}
                          		delay_us(100);	
                          	}
                          البته ....
                          شما که میخواهید 48 تا PWM درست کنید باید با میکروی مگا64 کار کنید ...
                          سوالی بود در خدمتم

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

                          دیدگاه


                            #73
                            پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                            سلام من میخوام یک درایور موتور سه فاز بسازم (البته بیشتر آموزشیه ). با مگا 64 که می تونه سه تا PWM بده تونستم یه برنامه با کمک گرفتن از طرح آقای کی نژاد بنویسم و و کاملا جواب میده . میخوام با یک میکرو دیگه مثل 8 یا 16 یا 32 کار کنم . الان اون مقادیر مخصوص سینوسی رو تو برنامه ای که شما برای موتور گذاشید اضافه کردم اما چیز جالبی در نیومد . اشکال از کجاس ؟ فرکانس کار کجا مشخص میشه ؟

                            کد:
                            $regfile = "m8def.dat"
                             $crystal = 8000000
                            
                             Motor1 Alias Portd.0
                             Motor2 Alias Portd.1
                             Motor3 Alias Portd.2
                            
                            
                             Max_var_pwm Alias 99
                             Dim Pwm(10) As Byte , A As Byte
                             A = Max_var_pwm
                             Dim I As Byte , J As Byte , K As Byte
                             I = 0
                             J = 0
                              K = 0
                            
                              'Config All =============================================
                              'Config Timers
                              'Config Ports
                               Config Timer0 = Timer , Prescale = 8
                               Enable Interrupts
                               Enable Timer0
                               On Ovf0 T0
                               Tcnt0 = 105
                               Start Timer0
                               Ddrb = 1
                               Ddrd = 255
                              'End Config ============================================
                            
                            
                              Do
                            
                            
                              Loop
                            End                             'end program
                            
                            
                            T0:
                              Tcnt0 = 105
                                Pwm(1) = Lookup(i , Sin_data)
                                Pwm(2) = Lookup(j , Sin_data)
                                Pwm(3) = Lookup(k , Sin_data)
                               Incr I
                               Incr J
                               Incr K
                               If I > 255 Then I = 0
                               If J > 255 Then J = 0
                               If K > 255 Then K = 0
                              If A > 0 Then
                               If A = Pwm(1) Then Set Motor1
                               If A = Pwm(2) Then Set Motor2
                               If A = Pwm(3) Then Set Motor3
                            
                              End If
                              Decr A
                              If A = 255 Then
                               A = Max_var_pwm
                               Portb = Pinb And 254
                               Portd = 0
                              End If
                            Return
                            Sin_data:
                            Data &H80 , &H83 , &H86 , &H89 , &H8C , &H8F , &H92 , &H95 , &H98 , &H9C , &H9F , &HA2 , &HA5 , &HA8 , &HAB , &HAE,
                            Data &HB0 , &HB3 , &HB6 , &HB9 , &HBC , &HBF , &HC1 , &HC4 , &HC7 , &HC9 , &HCC , &HCE , &HD1 , &HD3 , &HD5 , &HD8,
                            Data &HDA , &HDC , &HDE , &HE0 , &HE2 , &HE4 , &HE6 , &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF2 , &HF3 , &HF5,
                            Data &HF6 , &HF7 , &HF8 , &HF9 , &HFA , &HFB , &HFC , &HFC , &HFD , &HFE , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF,
                            Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HFE , &HFD , &HFC , &HFC , &HFB , &HFA , &HF9 , &HF8 , &HF7,
                            Data &HF6 , &HF5 , &HF3 , &HF2 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE6 , &HE4 , &HE2 , &HE0 , &HDE , &HDC,
                            Data &HDA , &HD8 , &HD5 , &HD3 , &HD1 , &HCE , &HCC , &HC9 , &HC7 , &HC4 , &HC1 , &HBF , &HBC , &HB9 , &HB6 , &HB3,
                            Data &HB0 , &HAE , &HAB , &HA8 , &HA5 , &HA2 , &H9F , &H9C , &H98 , &H95 , &H92 , &H8F , &H8C , &H89 , &H86 , &H83,
                            
                            Data &H80 , &H7C , &H79 , &H76 , &H73 , &H70 , &H6D , &H6A , &H67 , &H63 , &H60 , &H5D , &H5A , &H57 , &H54 , &H51,
                            Data &H4F , &H4C , &H49 , &H46 , &H43 , &H40 , &H3E , &H3B , &H38 , &H36 , &H33 , &H31 , &H2E , &H2C , &H2A , &H27,
                            Data &H25 , &H23 , &H21 , &H1F , &H1D , &H1B , &H19 , &H17 , &H15 , &H13 , &H12 , &H10 , &H0F , &H0D , &H0C , &H0A,
                            Data &H09 , &H08 , &H07 , &H06 , &H05 , &H04 , &H03 , &H03 , &H02 , &H01 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00,
                            Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H01 , &H02 , &H03 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08,
                            Data &H09 , &H0A , &H0C , &H0D , &H0F , &H10 , &H12 , &H13 , &H15 , &H17 , &H19 , &H1B , &H1D , &H1F , &H21 , &H23,
                            Data &H25 , &H27 , &H2A , &H2C , &H2E , &H31 , &H33 , &H36 , &H38 , &H3B , &H3E , &H40 , &H43 , &H46 , &H49 , &H4C,
                            Data &H4F , &H51 , &H54 , &H57 , &H5A , &H5D , &H60 , &H63 , &H67 , &H6A , &H6D , &H70 , &H73 , &H76 , &H79 , &H7C

                            دیدگاه


                              #74
                              پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                              نوشته اصلی توسط ababakz
                              سلام من میخوام یک درایور موتور سه فاز بسازم (البته بیشتر آموزشیه ). با مگا 64 که می تونه سه تا PWM بده تونستم یه برنامه با کمک گرفتن از طرح آقای کی نژاد بنویسم و و کاملا جواب میده . میخوام با یک میکرو دیگه مثل 8 یا 16 یا 32 کار کنم . الان اون مقادیر مخصوص سینوسی رو تو برنامه ای که شما برای موتور گذاشید اضافه کردم اما چیز جالبی در نیومد . اشکال از کجاس ؟ فرکانس کار کجا مشخص میشه ؟

                              کد:
                              $regfile = "m8def.dat"
                               $crystal = 8000000
                              
                               Motor1 Alias Portd.0
                               Motor2 Alias Portd.1
                               Motor3 Alias Portd.2
                              
                              
                               Max_var_pwm Alias 99
                               Dim Pwm(10) As Byte , A As Byte
                               A = Max_var_pwm
                               Dim I As Byte , J As Byte , K As Byte
                               I = 0
                               J = 0
                                K = 0
                              
                                'Config All =============================================
                                'Config Timers
                                'Config Ports
                                 Config Timer0 = Timer , Prescale = 8
                                 Enable Interrupts
                                 Enable Timer0
                                 On Ovf0 T0
                                 Tcnt0 = 105
                                 Start Timer0
                                 Ddrb = 1
                                 Ddrd = 255
                                'End Config ============================================
                              
                              
                                Do
                              
                              
                                Loop
                              End                             'end program
                              
                              
                              T0:
                                Tcnt0 = 105
                                  Pwm(1) = Lookup(i , Sin_data)
                                  Pwm(2) = Lookup(j , Sin_data)
                                  Pwm(3) = Lookup(k , Sin_data)
                                 Incr I
                                 Incr J
                                 Incr K
                                 If I > 255 Then I = 0
                                 If J > 255 Then J = 0
                                 If K > 255 Then K = 0
                                If A > 0 Then
                                 If A = Pwm(1) Then Set Motor1
                                 If A = Pwm(2) Then Set Motor2
                                 If A = Pwm(3) Then Set Motor3
                              
                                End If
                                Decr A
                                If A = 255 Then
                                 A = Max_var_pwm
                                 Portb = Pinb And 254
                                 Portd = 0
                                End If
                              Return
                              Sin_data:
                              Data &H80 , &H83 , &H86 , &H89 , &H8C , &H8F , &H92 , &H95 , &H98 , &H9C , &H9F , &HA2 , &HA5 , &HA8 , &HAB , &HAE,
                              Data &HB0 , &HB3 , &HB6 , &HB9 , &HBC , &HBF , &HC1 , &HC4 , &HC7 , &HC9 , &HCC , &HCE , &HD1 , &HD3 , &HD5 , &HD8,
                              Data &HDA , &HDC , &HDE , &HE0 , &HE2 , &HE4 , &HE6 , &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF2 , &HF3 , &HF5,
                              Data &HF6 , &HF7 , &HF8 , &HF9 , &HFA , &HFB , &HFC , &HFC , &HFD , &HFE , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF,
                              Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HFE , &HFD , &HFC , &HFC , &HFB , &HFA , &HF9 , &HF8 , &HF7,
                              Data &HF6 , &HF5 , &HF3 , &HF2 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE6 , &HE4 , &HE2 , &HE0 , &HDE , &HDC,
                              Data &HDA , &HD8 , &HD5 , &HD3 , &HD1 , &HCE , &HCC , &HC9 , &HC7 , &HC4 , &HC1 , &HBF , &HBC , &HB9 , &HB6 , &HB3,
                              Data &HB0 , &HAE , &HAB , &HA8 , &HA5 , &HA2 , &H9F , &H9C , &H98 , &H95 , &H92 , &H8F , &H8C , &H89 , &H86 , &H83,
                              
                              Data &H80 , &H7C , &H79 , &H76 , &H73 , &H70 , &H6D , &H6A , &H67 , &H63 , &H60 , &H5D , &H5A , &H57 , &H54 , &H51,
                              Data &H4F , &H4C , &H49 , &H46 , &H43 , &H40 , &H3E , &H3B , &H38 , &H36 , &H33 , &H31 , &H2E , &H2C , &H2A , &H27,
                              Data &H25 , &H23 , &H21 , &H1F , &H1D , &H1B , &H19 , &H17 , &H15 , &H13 , &H12 , &H10 , &H0F , &H0D , &H0C , &H0A,
                              Data &H09 , &H08 , &H07 , &H06 , &H05 , &H04 , &H03 , &H03 , &H02 , &H01 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00,
                              Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H01 , &H02 , &H03 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08,
                              Data &H09 , &H0A , &H0C , &H0D , &H0F , &H10 , &H12 , &H13 , &H15 , &H17 , &H19 , &H1B , &H1D , &H1F , &H21 , &H23,
                              Data &H25 , &H27 , &H2A , &H2C , &H2E , &H31 , &H33 , &H36 , &H38 , &H3B , &H3E , &H40 , &H43 , &H46 , &H49 , &H4C,
                              Data &H4F , &H51 , &H54 , &H57 , &H5A , &H5D , &H60 , &H63 , &H67 , &H6A , &H6D , &H70 , &H73 , &H76 , &H79 , &H7C
                              سلام
                              برنامه تون خیلی اشکال داره ...
                              اولین اشتباهتون اینه که من گفتم به متغیر آرایه PWM از صفر تا 99 باشه ... ولی برنامه رو که نگاه کردم دیدم تا 255 هم مقداردهی کردید ...
                              دومین اشتباهتون اینه که شما خواستید توی وقفه تایمر یک کانتر بگذارید و با اون کانتر خواستید توی یه زمان خاصی یک سری کارهایی کنید ...
                              کد:
                                 If I > 255 Then I = 0
                                 If J > 255 Then J = 0
                                 If K > 255 Then K = 0
                              این سه خط بعید میدونم که کار کنه ...
                              هیچ گاه شرط اجرا نمیشه چون اگر I=255 باشه و یکی بهش اضاف کنید میشه صفر که با این فرض بزرگترین مقدار 255 باشه شرط اجرا نمیشه ...
                              این سه شرط رو حذف کنید ... نیاز نیست ... چون خود متغیرها صفر میشوند ...
                              فعلا این اشکالات رو برطرف کنید تا بعد ...

                              موفق باشید

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

                              دیدگاه


                                #75
                                پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                                نوشته اصلی توسط Saman.Asadi
                                سلام
                                برنامه تون خیلی اشکال داره ...
                                اولین اشتباهتون اینه که من گفتم به متغیر آرایه PWM از صفر تا 99 باشه ... ولی برنامه رو که نگاه کردم دیدم تا 255 هم مقداردهی کردید ...
                                دومین اشتباهتون اینه که شما خواستید توی وقفه تایمر یک کانتر بگذارید و با اون کانتر خواستید توی یه زمان خاصی یک سری کارهایی کنید ...
                                کد:
                                   If I > 255 Then I = 0
                                   If J > 255 Then J = 0
                                   If K > 255 Then K = 0
                                این سه خط بعید میدونم که کار کنه ...
                                هیچ گاه شرط اجرا نمیشه چون اگر I=255 باشه و یکی بهش اضاف کنید میشه صفر که با این فرض بزرگترین مقدار 255 باشه شرط اجرا نمیشه ...
                                این سه شرط رو حذف کنید ... نیاز نیست ... چون خود متغیرها صفر میشوند ...
                                فعلا این اشکالات رو برطرف کنید تا بعد ...

                                موفق باشید

                                =========================
                                یه سوال ...
                                چرا I و J و K با هم اختلاف فاز ندارند ؟؟؟
                                ممنون بابت جواب
                                i , j , k توی برنامه اصلی با هم اختلاف 255/3 دارن فراموش کردم اینجا بذارم .
                                بعد راهی نداره مقدار PWM بالاتر از 99 باشه ؟ این محدودیت به خاطر چیه ؟
                                ساختن اون مقادیر جدول در حالتی که محدود باشه به 99 فکر نکنم نتیجه مطلوب رو بده .
                                در مورد سه شرط حق با شماست سوتی دادم .
                                راه حلی نداره که بشه تا 255 مقدار داد ؟

                                دیدگاه

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