اطلاعیه

Collapse
No announcement yet.

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

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

    #16
    پاسخ : چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!! [آموزشی]

    سامان جان سلام
    کدش رو با کمی تغییر تو تاخیر و... ویرایش کردم

    کد:
    #include <mega8.h>
    #include <delay.h>
    #define Set_LED1    PORTC.5 = 1
    #define Set_LED2    PORTC.4 = 1
    #define Set_LED3    PORTC.3 = 1
    #define Set_LED4    PORTC.2 = 1
    #define Set_LED5    PORTC.1 = 1
    #define Set_LED6    PORTC.0 = 1
    #define Set_LED7    PORTB.5 = 1
    #define Set_LED8    PORTB.4 = 1
    #define Set_LED9    PORTB.3 = 1
    #define Set_LED10    PORTB.2 = 1
    #define Set_LED11    PORTB.1 = 1
    #define Set_LED12    PORTB.0 = 1
    #define Set_LED13    PORTD.7 = 1
    #define Set_LED14    PORTD.6 = 1
    
    #define byte      unsigned char
    #define max_var_PWM   80
    byte  a = max_var_PWM , pwm[25];
    flash byte rain1[25]=
    {200,150,100,80,60,40,20,15,9,7,5,3,1};
    
    interrupt [TIM0_OVF] void timer0_comp_isr(void)
    {
      TCNT0 = 105;
      if(a)
      {
        if(a == pwm[1] )Set_LED14;
        if(a == pwm[2] )Set_LED13;
        if(a == pwm[3] )Set_LED12;
        if(a == pwm[4] )Set_LED11;
        if(a == pwm[5] )Set_LED10;
        if(a == pwm[6] )Set_LED9;
        if(a == pwm[7] )Set_LED8;
        if(a == pwm[8] )Set_LED7;
        if(a == pwm[9] )Set_LED6;
        if(a == pwm[10])Set_LED5;
        if(a == pwm[11])Set_LED4;
        if(a == pwm[12])Set_LED3;
        if(a == pwm[13])Set_LED2;
        if(a == pwm[14])Set_LED1;
    
      }
      if(--a == 255)
      {  a = max_var_PWM;
        PORTB=0;
        PORTC=0;
        PORTD=0;
      }
    }
    
    void main(void)
    {
      byte x1,x2;
      //Config all
      //Config timers
      //Config PORTS
      {
        DDRB=255;
        DDRC=255;
        DDRD=255;
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        TCNT0=105;
        TCCR0=2;
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=1;
        // Global enable interrupts
        #asm("sei")
      }
      //End Config ......
      while(1)
      {
        for(x1=0;x1<22;x1++)
        {
          pwm[1]=rain1[x1];
          for(x2=21;x2>0;x2--)pwm[x2+1]=pwm[x2];
          delay_ms(48);
        }
        for(x1=0;x1<32;x1++)
        {
          for(x2=31;x2>0;x2--)pwm[x2+1]=pwm[x2];
          delay_ms(10);
        }
      }
    }
    مدارش رو بستم ولی انگار پورت c.0 تا c.3 یک مقداری نا هماهنگن و زودتر از c.4 و c.5 خاموش میشه !
    البته وقتی با Power LED روشنش کردم انگار مشکلش حل شد .
    فیلم هر دوتاشو پلود کردم.

    http://m2007.persiangig.com/video/LED.flv

    http://m2007.persiangig.com/video/POWER.flv

    دیدگاه


      #17
      پاسخ : چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!! [آموزشی]

      نوشته اصلی توسط Mohammad_2007
      سامان جان سلام
      کدش رو با کمی تغییر تو تاخیر و... ویرایش کردم

      کد:
      #include <mega8.h>
      #include <delay.h>
      #define Set_LED1    PORTC.5 = 1
      #define Set_LED2    PORTC.4 = 1
      #define Set_LED3    PORTC.3 = 1
      #define Set_LED4    PORTC.2 = 1
      #define Set_LED5    PORTC.1 = 1
      #define Set_LED6    PORTC.0 = 1
      #define Set_LED7    PORTB.5 = 1
      #define Set_LED8    PORTB.4 = 1
      #define Set_LED9    PORTB.3 = 1
      #define Set_LED10    PORTB.2 = 1
      #define Set_LED11    PORTB.1 = 1
      #define Set_LED12    PORTB.0 = 1
      #define Set_LED13    PORTD.7 = 1
      #define Set_LED14    PORTD.6 = 1
      
      #define byte      unsigned char
      #define max_var_PWM   80
      byte  a = max_var_PWM , pwm[25];
      flash byte rain1[25]=
      {200,150,100,80,60,40,20,15,9,7,5,3,1};
      
      interrupt [TIM0_OVF] void timer0_comp_isr(void)
      {
        TCNT0 = 105;
        if(a)
        {
          if(a == pwm[1] )Set_LED14;
          if(a == pwm[2] )Set_LED13;
          if(a == pwm[3] )Set_LED12;
          if(a == pwm[4] )Set_LED11;
          if(a == pwm[5] )Set_LED10;
          if(a == pwm[6] )Set_LED9;
          if(a == pwm[7] )Set_LED8;
          if(a == pwm[8] )Set_LED7;
          if(a == pwm[9] )Set_LED6;
          if(a == pwm[10])Set_LED5;
          if(a == pwm[11])Set_LED4;
          if(a == pwm[12])Set_LED3;
          if(a == pwm[13])Set_LED2;
          if(a == pwm[14])Set_LED1;
      
        }
        if(--a == 255)
        {  a = max_var_PWM;
          PORTB=0;
          PORTC=0;
          PORTD=0;
        }
      }
      
      void main(void)
      {
        byte x1,x2;
        //Config all
        //Config timers
        //Config PORTS
        {
          DDRB=255;
          DDRC=255;
          DDRD=255;
          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: 1000.000 kHz
          TCNT0=105;
          TCCR0=2;
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=1;
          // Global enable interrupts
          #asm("sei")
        }
        //End Config ......
        while(1)
        {
          for(x1=0;x1<22;x1++)
          {
            pwm[1]=rain1[x1];
            for(x2=21;x2>0;x2--)pwm[x2+1]=pwm[x2];
            delay_ms(48);
          }
          for(x1=0;x1<32;x1++)
          {
            for(x2=31;x2>0;x2--)pwm[x2+1]=pwm[x2];
            delay_ms(10);
          }
        }
      }
      مدارش رو بستم ولی انگار پورت c.0 تا c.3 یک مقداری نا هماهنگن و زودتر از c.4 و c.5 خاموش میشه !
      البته وقتی با Power LED روشنش کردم انگار مشکلش حل شد .
      فیلم هر دوتاشو پلود کردم.

      http://m2007.persiangig.com/video/LED.flv
      http://m2007.persiangig.com/video/POWER.flv
      سلام محمد جان
      ممنون که فیلم گرفتی ...
      خوب
      برنامه ای که نوشتید چند تا اصول را رعایت نکردید
      1. من این رو تعریف کردم که بالاترین حد متغیر PWM مشخص باشه (یعنی اینکه بالاترین حدی که میتوانیم برابر [pwm[x قرار بدهیم چقدر است)
      کد:
      #define max_var_PWM   200
      شما کردید 80
      کد:
      #define max_var_PWM   80
      پس نباید مقدار متغیرهای آرایه بیشتر از 80 باشه
      کد:
      flash byte rain1[25]=
      {200,150,100,80,60,40,20,15,9,7,5,3,1};
      2. اندیس آرایه ای که به عنوان جدول لوکپ (rain1) و pwm تعریف کردید 25 تا هست
      کد:
      byte  a = max_var_PWM , pwm[25];
      flash byte rain1[25]=
      {200,150,100,80,60,40,20,15,9,7,5,3,1};
      ولی شما تو برنامه بیشتر از اون استفاده کردید
      کد:
          for(x1=0;x1<32;x1++)
          {
            for(x2=31;x2>0;x2--)pwm[x2+1]=pwm[x2];
            delay_ms(10);
          }
      این ها رو اصلاح کنید تست کنید
      خبرم کنید
      کلیپ هم گذاشتید دیگه چه بهتر

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

      دیدگاه


        #18
        پاسخ : چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!! [آموزشی]

        سامان جان سلام
        ممنون از پاسخ گوییت
        ببین این برنامه الان درسته ؟
        کد:
        #include <mega8.h>
        #include <delay.h>
        #define Set_LED1    PORTC.5 = 1
        #define Set_LED2    PORTC.4 = 1
        #define Set_LED3    PORTC.3 = 1
        #define Set_LED4    PORTC.2 = 1
        #define Set_LED5    PORTC.1 = 1
        #define Set_LED6    PORTC.0 = 1
        #define Set_LED7    PORTB.5 = 1
        #define Set_LED8    PORTB.4 = 1
        #define Set_LED9    PORTB.3 = 1
        #define Set_LED10    PORTB.2 = 1
        #define Set_LED11    PORTB.1 = 1
        #define Set_LED12    PORTB.0 = 1
        #define Set_LED13    PORTD.7 = 1
        #define Set_LED14    PORTD.6 = 1
        
        #define byte      unsigned char
        #define max_var_PWM   200
        byte  a = max_var_PWM , pwm[30];
        flash byte rain1[25]=
        {200,150,100,80,60,40,20,15,9,7,5,3,1};
        
        interrupt [TIM0_OVF] void timer0_comp_isr(void)
        {
          TCNT0 = 105;
          if(a)
          {
            if(a == pwm[1] )Set_LED14;
            if(a == pwm[2] )Set_LED13;
            if(a == pwm[3] )Set_LED12;
            if(a == pwm[4] )Set_LED11;
            if(a == pwm[5] )Set_LED10;
            if(a == pwm[6] )Set_LED9;
            if(a == pwm[7] )Set_LED8;
            if(a == pwm[8] )Set_LED7;
            if(a == pwm[9] )Set_LED6;
            if(a == pwm[10])Set_LED5;
            if(a == pwm[11])Set_LED4;
            if(a == pwm[12])Set_LED3;
            if(a == pwm[13])Set_LED2;
            if(a == pwm[14])Set_LED1;
        
          }
          if(--a == 255)
          {  a = max_var_PWM;
            PORTB=0;
            PORTC=0;
            PORTD=0;
          }
        }
        
        void main(void)
        {
          byte x1,x2;
          //Config all
          //Config timers
          //Config PORTS
          {
            DDRB=255;
            DDRC=255;
            DDRD=255;
            // Timer/Counter 0 initialization
            // Clock source: System Clock
            // Clock value: 1000.000 kHz
            TCNT0=105;
            TCCR0=2;
            // Timer(s)/Counter(s) Interrupt(s) initialization
            TIMSK=1;
            // Global enable interrupts
            #asm("sei")
          }
          //End Config ......
          while(1)
          {
            for(x1=0;x1<22;x1++)
            {
              pwm[1]=rain1[x1];
              for(x2=25;x2>0;x2--)pwm[x2+1]=pwm[x2];
              delay_ms(48);
            }
            for(x1=0;x1<32;x1++)
            {
              for(x2=29;x2>0;x2--)pwm[x2+1]=pwm[x2];
              delay_ms(10);
            }
          }
        }
        کاش ی زحمت بکشی ریز به ریز توضیح میدادی کخه طرز کار این برنامه چجوریه که منم هی مزاحمت نشم
        بازم ممنون که پیگیری...

        دیدگاه


          #19
          برنامه ساده شده

          نوشته اصلی توسط Mohammad_2007
          سامان جان سلام
          ممنون از پاسخ گوییت
          ببین این برنامه الان درسته ؟
          کد:
          #include <mega8.h>
          #include <delay.h>
          #define Set_LED1    PORTC.5 = 1
          #define Set_LED2    PORTC.4 = 1
          #define Set_LED3    PORTC.3 = 1
          #define Set_LED4    PORTC.2 = 1
          #define Set_LED5    PORTC.1 = 1
          #define Set_LED6    PORTC.0 = 1
          #define Set_LED7    PORTB.5 = 1
          #define Set_LED8    PORTB.4 = 1
          #define Set_LED9    PORTB.3 = 1
          #define Set_LED10    PORTB.2 = 1
          #define Set_LED11    PORTB.1 = 1
          #define Set_LED12    PORTB.0 = 1
          #define Set_LED13    PORTD.7 = 1
          #define Set_LED14    PORTD.6 = 1
          
          #define byte      unsigned char
          #define max_var_PWM   200
          byte  a = max_var_PWM , pwm[30];
          flash byte rain1[25]=
          {200,150,100,80,60,40,20,15,9,7,5,3,1};
          
          interrupt [TIM0_OVF] void timer0_comp_isr(void)
          {
            TCNT0 = 105;
            if(a)
            {
              if(a == pwm[1] )Set_LED14;
              if(a == pwm[2] )Set_LED13;
              if(a == pwm[3] )Set_LED12;
              if(a == pwm[4] )Set_LED11;
              if(a == pwm[5] )Set_LED10;
              if(a == pwm[6] )Set_LED9;
              if(a == pwm[7] )Set_LED8;
              if(a == pwm[8] )Set_LED7;
              if(a == pwm[9] )Set_LED6;
              if(a == pwm[10])Set_LED5;
              if(a == pwm[11])Set_LED4;
              if(a == pwm[12])Set_LED3;
              if(a == pwm[13])Set_LED2;
              if(a == pwm[14])Set_LED1;
          
            }
            if(--a == 255)
            {  a = max_var_PWM;
              PORTB=0;
              PORTC=0;
              PORTD=0;
            }
          }
          
          void main(void)
          {
            byte x1,x2;
            //Config all
            //Config timers
            //Config PORTS
            {
              DDRB=255;
              DDRC=255;
              DDRD=255;
              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: 1000.000 kHz
              TCNT0=105;
              TCCR0=2;
              // Timer(s)/Counter(s) Interrupt(s) initialization
              TIMSK=1;
              // Global enable interrupts
              #asm("sei")
            }
            //End Config ......
            while(1)
            {
              for(x1=0;x1<22;x1++)
              {
                pwm[1]=rain1[x1];
                for(x2=25;x2>0;x2--)pwm[x2+1]=pwm[x2];
                delay_ms(48);
              }
              for(x1=0;x1<32;x1++)
              {
                for(x2=29;x2>0;x2--)pwm[x2+1]=pwm[x2];
                delay_ms(10);
              }
            }
          }
          کاش ی زحمت بکشی ریز به ریز توضیح میدادی کخه طرز کار این برنامه چجوریه که منم هی مزاحمت نشم
          بازم ممنون که پیگیری...
          سلام
          اون نقطه مزاحم ، مزاحم هست :biggrin:
          اتفاقا" خیلی هم خوشحال میشم سوال میکنی :agree:
          خداییش خیلی ساده هست
          شما کجاش مشکل دارین ؟؟؟
          اگر برنامه نویسی بلد باشید موقعی که توضیح میدم متوجه منظور من میشوید ...
          شاید هم اشکال از فرستنده باشه ...
          بگذریم
          برنامه رو تحلیل میکنم
          یه تایمر تعریف کردم که در هر 150 میکرو ثانیه پرش میکنم به زیر برنامه تایمر ...
          اگر max_var_PWM را 99 گذاشته باشید
          99* 150 میکرو ثانیه برابر میشه با 14850میکرو ثانیه . که این زمان کل پهنای پالس محسوب میشود .
          بنابراین میتوان فرکانس موجهای خروجی را به دست آورد .
          1/14850us برابر میشه با 67 هرتز
          آرایه pwm هم بسته به کل خروجی هایتان انتخاب میشود
          مثلا اگر 14 خروجی داشته باشید باید اندیس آرایه را 2 - 3 تایی بیشتر بگیرید بنابراین بگیرید 17 خوبه
          آرایه pwm هر مقداری که به آن بدهیم درصد دیوتی سایکل موج خروجی تغییر میکند .
          به عنوان مثال
          کد:
          pwm[1]=50;
          بنابراین دیوتی سایکل LED14 که خودتون در زیربرنامه تایمر مساوی با [pwm[1 قرار دادید ، 50 درصد خواهد شد .
          بنابراین میتوانیم از 0 تا 99 مقدار [1]pwm را تغییر دهیم . اگر مقدارش 99 باشه پر نور تر و اگر 1 باشد بسیار کم نور و اگر 0 باشد خاموش میشود .
          آرایه rain1 هم که بسته به چند تا LED روشن و خاموش و کم نور بودن و پرنور بودن آن تعیین می شود.

          اون دو حلقه for هم که دیگه خیلی ساده است
          کد:
          for(x1=0;x1<22;x1++)
          عدد 22 باید با توجه به اینکه اندیس آرایه rain1 چقدر باشه تعیین میشه .
          کد:
          for(x2=25;x2>0;x2--)pwm[x2+1]=pwm[x2];
          هم برای شیفت دادن به کار میره ...
          در این پروژه چون 14 خروجی داریم باید از 13 شروع شود چون اولین کاری که میکند این است که مقدار pwm 13 درون pwm14 ریخته میشود و همین طور ادامه پیدا میکنه تا pwm1 ریخته میشه توی pwm2 .
          البته بهتر این است که ابتدا شیفت داده شود سپس
          کد:
          pwm[1]=rain1[x1];
          گذاشته شود
          در کل باید برنامه داخل while اینگونه باشد .
          for اولی برای وارد کردن متغیر های rain1 با تاخیر درون حلقه انجام میشود ...
          سپس با حلقه for دوم این نور LED ها شیفت پیدا میکند و خارج میشود
          برای ساده تر شدن از این کد استفاده کن

          کد:
          #include <mega8.h>
          #include <delay.h>
          
          #define Set_LED1    PORTC.5 = 1
          #define Set_LED2    PORTC.4 = 1
          #define Set_LED3    PORTC.3 = 1
          #define Set_LED4    PORTC.2 = 1
          #define Set_LED5    PORTC.1 = 1
          #define Set_LED6    PORTC.0 = 1
          #define Set_LED7    PORTB.5 = 1
          #define Set_LED8    PORTB.4 = 1
          #define Set_LED9    PORTB.3 = 1
          #define Set_LED10    PORTB.2 = 1
          #define Set_LED11    PORTB.1 = 1
          #define Set_LED12    PORTB.0 = 1
          #define Set_LED13    PORTD.7 = 1
          #define Set_LED14    PORTD.6 = 1
          
          
          #define byte      unsigned char
          #define max_var_PWM   99
          #define Max_LED     14
          #define Delay1     30 //ms
          #define Delay2     200 //ms
          
          
          byte  a = max_var_PWM , pwm[Max_LED+2];
          flash byte rain1[30]=
          {99,80,70,60,40,20,15,9,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
          
          interrupt [TIM0_OVF] void timer0_comp_isr(void)
          {
            TCNT0 = 105;
            if(a)
            {
              if(a == pwm[14])Set_LED14;
              if(a == pwm[13])Set_LED13;
              if(a == pwm[12])Set_LED12;
              if(a == pwm[11])Set_LED11;
              if(a == pwm[10])Set_LED10;
              if(a == pwm[9])Set_LED9;
              if(a == pwm[8])Set_LED8;
              if(a == pwm[7])Set_LED7;
              if(a == pwm[6])Set_LED6;
              if(a == pwm[5])Set_LED5;
              if(a == pwm[4])Set_LED4;
              if(a == pwm[3])Set_LED3;
              if(a == pwm[2])Set_LED2;
              if(a == pwm[1])Set_LED1;
            }
            if(--a == 255)
            {
              a = max_var_PWM;
              PORTB=0;
              PORTC=0;
              PORTD=0;
            }
          }
          
          void main(void)
          {
            byte y1=Max_LED-1 ,y2= Max_LED+Max_LED ,x1 ,x2;
            //Config all
            //Config timers
            //Config PORTS
            {
              DDRB=255;
              DDRC=255;
              DDRD=255;
              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: 1000.000 kHz
              TCNT0=105;
              TCCR0=2;
              // Timer(s)/Counter(s) Interrupt(s) initialization
              TIMSK=1;
              // Global enable interrupts
              #asm("sei")
            }
            //End Config ......
            while(1)
            {
              for(x1=0;x1<y2;x1++)
              {
                for(x2=y1;x2>0;x2--)pwm[x2+1]=pwm[x2];
                pwm[1]=rain1[x1];
                delay_ms(Delay1);
              }
              delay_ms(Delay2);
            }
          }
          شما توی برنامه دیگه دست نبرید البته نه تعاریف ...
          فقط این قسمتها را تغییر دهید
          کد:
          #define Max_LED     14
          #define Delay1     30 //ms
          #define Delay2     200 //ms
          در ضمن اگر خواستید که نظم LED ها را تغییر دهید مثل کمرنگ و پررنگ و خاموش و ... توی آرایه rain1 اعداد را از 0 تا 99 تغییر دهید ...

          این هم فیلم
          512KB
          http://s5.picofile.com/file/8119864784/LED_Rain.mp4.html
          موفق باشید
          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
          معرفی نرم افزار Codewizard PWM
          با من بیشتر آشنا شوید

          دیدگاه


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

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

            البته من قبلا برنامه ای برای بسکام نوشته ام که فرکانس و دیوتی سایکل رو روی ال سی دی نشون میده و بعد اونو روی یه پورت قرار میده
            البته می تونه سیگنالهای آنالوگ هم تولید کنه.
            اینم برنامه:
            کد:
            $regfile = "m8def.dat"
            $crystal = 16000000
            
            Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
            
            Config Lcd = 16 * 2
            Cursor Off
            
            Config Portd = Output
            
            Dim A As Byte
            Dim B As Word
            Dim C As Byte
            Dim D As Word
            Dim E As Word
            Dim F As Word
            Dim G As Byte
            Dim H As Byte
            Dim I As Word
            Dim J As Single
            Dim K As Byte
            Dim L As Byte
            Dim M As Byte
            
            Ddrb.0 = 0 : Portb.0 = 1
            Ddrb.1 = 0 : Portb.1 = 1
            Ddrb.2 = 0 : Portb.2 = 1
            Ddrb.3 = 0 : Portb.3 = 1
            Ddrb.4 = 0 : Portb.4 = 1
            Ddrb.5 = 0 : Portb.5 = 1
            
            Declare Sub A0
            Declare Sub A1
            Declare Sub A2
            Declare Sub A3
            Declare Sub A4
            Declare Sub A5
            Declare Sub A6
            Declare Sub A7
            Declare Sub A8
            Declare Sub A9
            Declare Sub A10
            Declare Sub A11
            Declare Sub A12
            Declare Sub A13
            Declare Sub A14
            Declare Sub A15
            Declare Sub A16
            Declare Sub A17
            
            A = 1
            B = 200
            C = 50
            F = 500
            G = 99
            
            Config Debounce = 30
            
            Cls
            
            Main1:
            Cls
            Do
              Debounce Pinb.2 , 0 , A1
              Debounce Pinb.0 , 0 , A2
              Home
              Lcd "SELECT WAVEFORM?"
              Lowerline
              If A = 1 Then
              Lcd "WAVE IS:SINE  "
              Elseif A = 2 Then
              Lcd "WAVE IS:SQUARE "
              Else
              Lcd "WAVE IS:TRIANGLE"
              End If
            Loop
            
            Main2:
            Cls
            Do
              Debounce Pinb.2 , 0 , A3
              Debounce Pinb.3 , 0 , A4
              Debounce Pinb.4 , 0 , A5
              Debounce Pinb.5 , 0 , A6
              Debounce Pinb.0 , 0 , A7
              Debounce Pinb.1 , 0 , A0
              Home
              Lcd "SET FREQUENCY ? "
              Lowerline
              Lcd "F is:" ; B ; "Hz NEXT>"
            Loop
            
            Main3:
            Cls
            Do
              Debounce Pinb.2 , 0 , A8
              Debounce Pinb.3 , 0 , A9
              Debounce Pinb.4 , 0 , A10
              Debounce Pinb.5 , 0 , A11
              Debounce Pinb.0 , 0 , A12
              Debounce Pinb.1 , 0 , A0
              Home
              Lcd "SET DUTY CYCLE ?"
              Lowerline
              Lcd "D.C.is:" ; C ; "% NEXT>"
            Loop
            
            Main4:
            Cls
            Do
              Debounce Pinb.2 , 0 , A13
              Debounce Pinb.3 , 0 , A14
              Debounce Pinb.4 , 0 , A15
              Debounce Pinb.5 , 0 , A16
              Debounce Pinb.0 , 0 , A17
              Debounce Pinb.1 , 0 , A0
              Home
              Lcd "SET AMPLITUDE ? "
              Lowerline
              Lcd "AMP.is:" ; G ; "% NEXT>"
            Loop
            
            Main5:
              H = G
              G = G - 14
              G = G * 3                        'damne tabdil be hex
              F = F / B                        'mohasebe T *500
              D = F * C                        'mohasebe takhire 1
              E = 100 - C
              E = F * E                        'mohasebe takhire 2
              D = D / 10
              E = E / 10
              Cls
              Lcd "WAVE F DC AMP"
              Lowerline
              If A = 1 Then
              Goto Main6
              Elseif A = 2 Then
              Goto Main7
              Else
              Goto Main8
              End If
            Main6:
              Lcd "SIN. " ; B ; " " ; "50 " ; H
              G = G / 2
              Do
              For I = 0 To 360 Step 3
              J = I
              J = Deg2rad(j)
              J = Sin(j)
              J = J * G
              J = Int(j)
              J = J + 128
              Portd = J
              For L = 1 To D
              nop
              Next L
              Next I
              Loop
            
            Main7:
              Lcd "SQU. " ; B ; " " ; C ; " " ; H
              Do
              Portd = G
              For L = 1 To D
              Waitus 25
              Next L
              Portd = 0
              For L = 1 To E
              Waitus 25
              Next L
              Loop
            
            Main8:
              Lcd "TRI. " ; B ; " " ; C ; " " ; H
              Do
              For M = 1 To G
              Portd = M
              For L = 1 To D
              nop
              Next L
              Next M
              For M = G To 1 Step -1
              Portd = M
              For L = 1 To E
              nop
              Next L
              Next M
              Loop
            
            
            
            End                             'end program
            
            Sub A0:
              Goto Main1
            End Sub A0
            
            Sub A1:
            If A < 3 Then
              Incr A
              Else
              A = 1
              End If
              Goto Main1
            End Sub A1
            
            Sub A2:
              Goto Main2
            End Sub A2
            
            
            Sub A3:
            If B < 500 Then
              Incr B
              Else
              B = 500
              End If
              Goto Main2
            End Sub A3
            
            Sub A4:
            If B > 0 Then Decr B
              Goto Main2
            End Sub A4
            
            Sub A5:
            If B < 480 Then
              B = B + 20
              Else
              B = 500
              End If
              Goto Main2
            End Sub A5
            
            Sub A6:
            If B > 20 Then B = B - 20
              Goto Main2
            End Sub A6
            
            Sub A7:
              Goto Main3
            End Sub A7
            
            Sub A8:
            If C < 99 Then
              Incr C
              Else
              C = 99
              End If
              Goto Main3
            End Sub A8
            
            Sub A9:
            If C > 0 Then Decr C
              Goto Main3
            End Sub A9
            
            Sub A10:
            If C < 90 Then
              C = C + 10
              Else
              C = 99
              End If
              Goto Main3
            End Sub A10
            
            Sub A11:
            If C > 10 Then C = C - 10
              Goto Main3
            End Sub A11
            
            Sub A12:
              Goto Main4
            End Sub A12
            
            Sub A13:
            If G < 99 Then
              Incr G
              Else
              G = 99
              End If
              Goto Main4
            End Sub A13
            
            Sub A14:
            If G > 14 Then Decr G
              Goto Main4
            End Sub A14
            
            Sub A15:
            If G < 90 Then
              G = G + 10
              Else
              G = 99
              End If
              Goto Main4
            End Sub A15
            
            Sub A16:
            If G > 24 Then G = G - 10
              Goto Main4
            End Sub A16
            
            Sub A17:
              Goto Main5
            End Sub A17
            اینم فایل ها :
            http://persianupload.com/kleeja/do.php?filename=139765207257561.rar
            البته این یک فانکشن ژنراتور هست که موج های مختلف رو تولید می کنه
            حالا ممنون میشم تو بسکام یه برنامه بنویسید که بتونه دیوتی سایکل رو تغییر بده و البته اگه بشه برای فرکانس هم کاری کرد خیلی خوب میشه مثلا فرکانس یا دستی با کیبورد تعیین بشه و یا با ولوم و یا حتی در برنامه مشخص بشه که در این صورت برنامه باید طوری بشه که با محاسبات و دونستن فرکانس PWM رو تولید کنه.
            بازم از برنامه های بسیار عالیتون ممنونم.

            sigpic

            دیدگاه


              #21
              چگونه با دو ولوم میتوان فرکانس و دیوتی سایکل PWM سخت افزاری را تغییر داد ؟؟

              نوشته اصلی توسط ناصر منتظری
              خیلی خیل عالی بود سامان اسدی عزیز
              فقط اگه بشه یه برنامه ای بنویسید که بشه دو تا ولوم رو خوند و بعد PWm تولید کرد بسیار عالی میشه که یکی برای فرکانس باشه و دیگری برای دیوتی سایکل

              البته من قبلا برنامه ای برای بسکام نوشته ام که فرکانس و دیوتی سایکل رو روی ال سی دی نشون میده و بعد اونو روی یه پورت قرار میده
              البته می تونه سیگنالهای آنالوگ هم تولید کنه.
              اینم برنامه:
              کد:
              $regfile = "m8def.dat"
              $crystal = 16000000
              
              Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
              
              Config Lcd = 16 * 2
              Cursor Off
              
              Config Portd = Output
              
              Dim A As Byte
              Dim B As Word
              Dim C As Byte
              Dim D As Word
              Dim E As Word
              Dim F As Word
              Dim G As Byte
              Dim H As Byte
              Dim I As Word
              Dim J As Single
              Dim K As Byte
              Dim L As Byte
              Dim M As Byte
              
              Ddrb.0 = 0 : Portb.0 = 1
              Ddrb.1 = 0 : Portb.1 = 1
              Ddrb.2 = 0 : Portb.2 = 1
              Ddrb.3 = 0 : Portb.3 = 1
              Ddrb.4 = 0 : Portb.4 = 1
              Ddrb.5 = 0 : Portb.5 = 1
              
              Declare Sub A0
              Declare Sub A1
              Declare Sub A2
              Declare Sub A3
              Declare Sub A4
              Declare Sub A5
              Declare Sub A6
              Declare Sub A7
              Declare Sub A8
              Declare Sub A9
              Declare Sub A10
              Declare Sub A11
              Declare Sub A12
              Declare Sub A13
              Declare Sub A14
              Declare Sub A15
              Declare Sub A16
              Declare Sub A17
              
              A = 1
              B = 200
              C = 50
              F = 500
              G = 99
              
              Config Debounce = 30
              
              Cls
              
              Main1:
              Cls
              Do
                Debounce Pinb.2 , 0 , A1
                Debounce Pinb.0 , 0 , A2
                Home
                Lcd "SELECT WAVEFORM?"
                Lowerline
                If A = 1 Then
                Lcd "WAVE IS:SINE  "
                Elseif A = 2 Then
                Lcd "WAVE IS:SQUARE "
                Else
                Lcd "WAVE IS:TRIANGLE"
                End If
              Loop
              
              Main2:
              Cls
              Do
                Debounce Pinb.2 , 0 , A3
                Debounce Pinb.3 , 0 , A4
                Debounce Pinb.4 , 0 , A5
                Debounce Pinb.5 , 0 , A6
                Debounce Pinb.0 , 0 , A7
                Debounce Pinb.1 , 0 , A0
                Home
                Lcd "SET FREQUENCY ? "
                Lowerline
                Lcd "F is:" ; B ; "Hz NEXT>"
              Loop
              
              Main3:
              Cls
              Do
                Debounce Pinb.2 , 0 , A8
                Debounce Pinb.3 , 0 , A9
                Debounce Pinb.4 , 0 , A10
                Debounce Pinb.5 , 0 , A11
                Debounce Pinb.0 , 0 , A12
                Debounce Pinb.1 , 0 , A0
                Home
                Lcd "SET DUTY CYCLE ?"
                Lowerline
                Lcd "D.C.is:" ; C ; "% NEXT>"
              Loop
              
              Main4:
              Cls
              Do
                Debounce Pinb.2 , 0 , A13
                Debounce Pinb.3 , 0 , A14
                Debounce Pinb.4 , 0 , A15
                Debounce Pinb.5 , 0 , A16
                Debounce Pinb.0 , 0 , A17
                Debounce Pinb.1 , 0 , A0
                Home
                Lcd "SET AMPLITUDE ? "
                Lowerline
                Lcd "AMP.is:" ; G ; "% NEXT>"
              Loop
              
              Main5:
                H = G
                G = G - 14
                G = G * 3                        'damne tabdil be hex
                F = F / B                        'mohasebe T *500
                D = F * C                        'mohasebe takhire 1
                E = 100 - C
                E = F * E                        'mohasebe takhire 2
                D = D / 10
                E = E / 10
                Cls
                Lcd "WAVE F DC AMP"
                Lowerline
                If A = 1 Then
                Goto Main6
                Elseif A = 2 Then
                Goto Main7
                Else
                Goto Main8
                End If
              Main6:
                Lcd "SIN. " ; B ; " " ; "50 " ; H
                G = G / 2
                Do
                For I = 0 To 360 Step 3
                J = I
                J = Deg2rad(j)
                J = Sin(j)
                J = J * G
                J = Int(j)
                J = J + 128
                Portd = J
                For L = 1 To D
                nop
                Next L
                Next I
                Loop
              
              Main7:
                Lcd "SQU. " ; B ; " " ; C ; " " ; H
                Do
                Portd = G
                For L = 1 To D
                Waitus 25
                Next L
                Portd = 0
                For L = 1 To E
                Waitus 25
                Next L
                Loop
              
              Main8:
                Lcd "TRI. " ; B ; " " ; C ; " " ; H
                Do
                For M = 1 To G
                Portd = M
                For L = 1 To D
                nop
                Next L
                Next M
                For M = G To 1 Step -1
                Portd = M
                For L = 1 To E
                nop
                Next L
                Next M
                Loop
              
              
              
              End                             'end program
              
              Sub A0:
                Goto Main1
              End Sub A0
              
              Sub A1:
              If A < 3 Then
                Incr A
                Else
                A = 1
                End If
                Goto Main1
              End Sub A1
              
              Sub A2:
                Goto Main2
              End Sub A2
              
              
              Sub A3:
              If B < 500 Then
                Incr B
                Else
                B = 500
                End If
                Goto Main2
              End Sub A3
              
              Sub A4:
              If B > 0 Then Decr B
                Goto Main2
              End Sub A4
              
              Sub A5:
              If B < 480 Then
                B = B + 20
                Else
                B = 500
                End If
                Goto Main2
              End Sub A5
              
              Sub A6:
              If B > 20 Then B = B - 20
                Goto Main2
              End Sub A6
              
              Sub A7:
                Goto Main3
              End Sub A7
              
              Sub A8:
              If C < 99 Then
                Incr C
                Else
                C = 99
                End If
                Goto Main3
              End Sub A8
              
              Sub A9:
              If C > 0 Then Decr C
                Goto Main3
              End Sub A9
              
              Sub A10:
              If C < 90 Then
                C = C + 10
                Else
                C = 99
                End If
                Goto Main3
              End Sub A10
              
              Sub A11:
              If C > 10 Then C = C - 10
                Goto Main3
              End Sub A11
              
              Sub A12:
                Goto Main4
              End Sub A12
              
              Sub A13:
              If G < 99 Then
                Incr G
                Else
                G = 99
                End If
                Goto Main4
              End Sub A13
              
              Sub A14:
              If G > 14 Then Decr G
                Goto Main4
              End Sub A14
              
              Sub A15:
              If G < 90 Then
                G = G + 10
                Else
                G = 99
                End If
                Goto Main4
              End Sub A15
              
              Sub A16:
              If G > 24 Then G = G - 10
                Goto Main4
              End Sub A16
              
              Sub A17:
                Goto Main5
              End Sub A17
              اینم فایل ها :
              http://persianupload.com/kleeja/do.php?filename=139765207257561.rar
              البته این یک فانکشن ژنراتور هست که موج های مختلف رو تولید می کنه
              حالا ممنون میشم تو بسکام یه برنامه بنویسید که بتونه دیوتی سایکل رو تغییر بده و البته اگه بشه برای فرکانس هم کاری کرد خیلی خوب میشه مثلا فرکانس یا دستی با کیبورد تعیین بشه و یا با ولوم و یا حتی در برنامه مشخص بشه که در این صورت برنامه باید طوری بشه که با محاسبات و دونستن فرکانس PWM رو تولید کنه.
              بازم از برنامه های بسیار عالیتون ممنونم.
              سلام
              خواهش میکنم ...
              نظر لطفتونه ...
              البته همونطور که میدونید من بسکام بلد هستم اما نه کامل ...
              خودم با زبان بیسیک شروع کردم ولی نمیدونم چرا زمانی که از بیسیک به زبون محبوب سی کوچ کردم دیگه از بیسیک بدم میاد ...
              در کل ...
              درست کردن این امکاناتی که خواستید زیاد سخت نیست ...
              نمونه این پروژه رو براتون میگذارم ... البته با کدویژن
              خودتون دیگه تبدیلش کنید ...
              کد:
              #include <mega8.h>
              #include <delay.h>
              #define ADC_VREF_TYPE 0x40
              
              // Read the AD conversion result
              unsigned int read_adc(unsigned char adc_input)
              {
                ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                // Delay needed for the stabilization of the ADC input voltage
                delay_us(10);
                // Start the AD conversion
                ADCSRA|=0x40;
                // Wait for the AD conversion to complete
                while ((ADCSRA & 0x10)==0);
                ADCSRA|=0x10;
                return ADCW;
              }
              
              
              void main(void)
              {
                // Declare your local variables here
                unsigned int a=0,b=0;
                PORTB=0x00;
                DDRB=0x06;
                // Timer/Counter 1 initialization
                // Clock source: System Clock
                // Clock value: 8000.000 kHz
                // Mode: Fast PWM top=ICR1
                // OC1A output: Discon.
                // OC1B output: Non-Inv.
                // Noise Canceler: Off
                // Input Capture on Falling Edge
                // Timer1 Overflow Interrupt: Off
                // Input Capture Interrupt: Off
                // Compare A Match Interrupt: Off
                // Compare B Match Interrupt: Off
                TCCR1A=0x22;
                TCCR1B=0x19;
                // ADC initialization
                // ADC Clock frequency: 62.500 kHz
                // ADC Voltage Reference: AVCC pin
                ADMUX=ADC_VREF_TYPE & 0xff;
                ADCSRA=0x87;
              
                while (1)
                {
                  a = read_adc(0)*64;
                  b = (float)((float)read_adc(1)/(float)1023)*(float)a;
                  ICR1H = a >> 8;
                  ICR1L = (unsigned char)(a & 0x00FF);
                  OCR1BH = b >> 8;
                  OCR1BL = (unsigned char)(b & 0x00FF);
                  delay_ms(50);
                }
              }
              http://s5.picofile.com/file/8120309268/ADC_PWM.zip.html

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

              دیدگاه


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

                نوشته اصلی توسط Saman.Asadi
                سلام
                درست کردن این امکاناتی که خواستید زیاد سخت نیست ...
                نمونه این پروژه رو براتون میگذارم ... البته با کدویژن
                موفق باشید
                بسیار بسیار عالی بود آقای اسدی
                ای کاش یه تشکر * 100 هم بود :mrgreen: میشد استفاده کرد اینجا
                فقط یه سوال مقدار فرکانس بین چقدر تا چقدر توی این برنامه ی حرفه ای قابل تغییر هست ؟
                ممنون

                sigpic

                دیدگاه


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

                  نوشته اصلی توسط ناصر منتظری
                  بسیار بسیار عالی بود آقای اسدی
                  ای کاش یه تشکر * 100 هم بود :mrgreen: میشد استفاده کرد اینجا
                  فقط یه سوال مقدار فرکانس بین چقدر تا چقدر توی این برنامه ی حرفه ای قابل تغییر هست ؟
                  ممنون
                  قربان شما
                  نظر لطفتونه
                  خجالتم ندین :">
                  تو شبیه سازی با فرکانس داخلی 8 مگا از 122 هرتز تا [s]123کیلو هرتز[/s] (12.5کیلوهرتز) میتونه تولید کنه
                  اگر فرکانس اسیلاتور را روی 16 مگا تنظیم کنید سرعت آن بیشتر میشود ...
                  البته روی بردبرد نویز میگیره و باید روی برد تستش کنی ...
                  موفق باشید

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

                  دیدگاه


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

                    آقا سامان
                    همچینم برنامه ای که نوشتید ساده نیستا !!!
                    یعنی باید بدونه آدم داره چیکار میکنه تا برنامه رو متوجه بشه.
                    اما خوشم اومد !
                    نسبت به بقیه آموزشهایی که در این زمینه هست،شما خوب توضیح دادید.

                    موفق باشید
                    * هر گاه خدا بخواهد بنده ای را خوار کند، دانش را از او دور سازد.
                    * سخن بگویید تا شناخته شوید، زیرا که انسان در زیر زبان خود پنهان است.
                    *بدترین دوست،آ‌ کسی است که برای او به رنج و زحمت افتی.
                    حضرت علی(ع)
                    آموزش AVR به ساده ترین زبان ممکن : Noise.Blog.IR

                    دیدگاه


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

                      نوشته اصلی توسط احسان نوری
                      آقا سامان
                      همچینم برنامه ای که نوشتید ساده نیستا !!!
                      یعنی باید بدونه آدم داره چیکار میکنه تا برنامه رو متوجه بشه.
                      اما خوشم اومد !
                      نسبت به بقیه آموزشهایی که در این زمینه هست،شما خوب توضیح دادید.

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

                      دیدگاه


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

                        نوشته اصلی توسط Saman.Asadi
                        ممنونم
                        نظر لطفتونه
                        نمیدونم شاید پیچیده باشه ولی شاید چون برنامه خیلی طولانی شده فکر میکنید که خیلی سخته ...
                        شما همین برنامه رو فقط با یک PWM راه اندازی کنید و به اون نگاه کنید و پیش خودتون تحلیل کنید ...
                        میبینید که آنقدری که فکر میکردید هم پیچیده نیست ...
                        موفق باشید
                        یه مسئله ای که ذهن منو درگیر کرده اینه که اگه به جای هر 1 ال ای دی ، بخوایم از 10 ال ای دی استفاده کنیم (دسته های 10 تایی)،مسئله جبران جریان رو چطوری باید حل کنیم با توجه به اینکه اینجا ولتاژ دیگه ثابت نیست !
                        * هر گاه خدا بخواهد بنده ای را خوار کند، دانش را از او دور سازد.
                        * سخن بگویید تا شناخته شوید، زیرا که انسان در زیر زبان خود پنهان است.
                        *بدترین دوست،آ‌ کسی است که برای او به رنج و زحمت افتی.
                        حضرت علی(ع)
                        آموزش AVR به ساده ترین زبان ممکن : Noise.Blog.IR

                        دیدگاه


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

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

                          دیدگاه


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

                            نوشته اصلی توسط احسان نوری
                            یه مسئله ای که ذهن منو درگیر کرده اینه که اگه به جای هر 1 ال ای دی ، بخوایم از 10 ال ای دی استفاده کنیم (دسته های 10 تایی)،مسئله جبران جریان رو چطوری باید حل کنیم با توجه به اینکه اینجا ولتاژ دیگه ثابت نیست !
                            از ترانزیستور استفاده کن


                            vcc
                            |
                            led
                            |
                            c /
                            |--micro---1k ohm ---b
                            e < \
                            |
                            gnd__







                            دیدگاه


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

                              نوشته اصلی توسط VAHID_HP
                              از ترانزیستور استفاده کن


                              vcc
                              |
                              led
                              |
                              c /
                              |--micro---1k ohm ---b
                              e < \
                              |
                              gnd__

                              مث اینکه شما متوجه کار نیستی !
                              سوئیچ کردن با ترانزیستور که کاری نداره.
                              مسئله اینجاست که میخوایم از PWM استفاده کنیم و ولتاژ ثابت نیست !!!
                              * هر گاه خدا بخواهد بنده ای را خوار کند، دانش را از او دور سازد.
                              * سخن بگویید تا شناخته شوید، زیرا که انسان در زیر زبان خود پنهان است.
                              *بدترین دوست،آ‌ کسی است که برای او به رنج و زحمت افتی.
                              حضرت علی(ع)
                              آموزش AVR به ساده ترین زبان ممکن : Noise.Blog.IR

                              دیدگاه


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

                                نوشته اصلی توسط احسان نوری
                                مث اینکه شما متوجه کار نیستی !
                                سوئیچ کردن با ترانزیستور که کاری نداره.
                                مسئله اینجاست که میخوایم از PWM استفاده کنیم و ولتاژ ثابت نیست !!!
                                من از همین روش برای ساخت تابلو ثابت استفاده میکنم و با خاموش و روشن کردن سریع ترانزیستور ال.ای.دی هایی که تو مسیر قرار گرفتن رو خاموش و روشن میکنم.
                                اینم برنامش که خیلیم ساده و ال.ای.دی ها رو هم با ترانزیستور سوییچ کردم:

                                کد:
                                $regfile = "m8def.dat "
                                $crystal = 1000000
                                Config Portd = Output
                                Dim W As Byte , W1 As Byte , V As Byte , S As Byte , F As Byte
                                A Alias Portd.3
                                B Alias Portd.5
                                Do
                                '************************************************************** 1
                                For F = 1 To 5
                                ''''''''''''''''''''''''
                                For V = 0 To 22 Step 1
                                W = Lookup(v , Show)
                                A = 1 : B = 0
                                Waitms W
                                W = Lookup(v , Show1)
                                A = 0 : B = 1
                                Waitms W
                                Next V
                                '''''''''''''''''''''''
                                For V = 22 To 0 Step -1
                                W = Lookup(v , Show)
                                A = 1 : B = 0
                                Waitms W
                                W = Lookup(v , Show1)
                                A = 0 : B = 1
                                Waitms W
                                Next V
                                Next F
                                Loop
                                End
                                Show:
                                Data 20 , 19 , 18 , 17 , 16 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0.4 , 0.2 , 0
                                Show1:
                                Data 0 , 0.2 , 0.4 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20

                                دیدگاه

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