اطلاعیه

Collapse
No announcement yet.

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

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

  • Saviour
    replied
    پاسخ : (برنامه اصلاح شد) چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!

    سلام خدمت آقا سامان عزیز
    نمیدونم به این تاپیک سر میزنید یا خیر!!!
    ولی من این برنامه رو استفاده کردم واسه سه کاری و چند افکت دیگه هم بهش اضافه کردم، مثل موج مکزیکی، ولی تو این افکت، ال ای دی ها پرش دارند!!! چرا؟نمونه کدم رو هم ارسال میکنم لطف کنید یه نگاهی بهش بندازید
    کد:
    #include <mega8.h>#include <delay.h>
    
    
    #define     Set_LED1         PORTB.0 = 1
    #define     Set_LED2         PORTB.1 = 1
    #define     Set_LED3         PORTB.2 = 1
    #define     Set_LED4         PORTB.3 = 1
    #define     Set_LED5         PORTB.4 = 1
    #define     Set_LED6         PORTB.5 = 1
    #define     Set_LED7         PORTB.6 = 1
    #define     Set_LED8         PORTB.7 = 1
    #define     Set_LED9         PORTD.0 = 1
    #define     Set_LED10        PORTD.1 = 1
    #define     Set_LED11        PORTD.2 = 1
    #define     Set_LED12        PORTD.3 = 1
    #define     Set_LED13        PORTD.4 = 1
    #define     Set_LED14        PORTD.5 = 1
    #define     Set_LED15        PORTD.6 = 1
    #define     Set_LED16        PORTD.7 = 1
    #define     Set_LED17        PORTC.0 = 1
    #define     Set_LED18        PORTC.1 = 1
    #define     Set_LED19        PORTC.2 = 1
    #define     Set_LED20        PORTC.3 = 1
    
    
    #define     BLUE             PORTB.0=PORTB.1=PORTB.2=PORTB.3=PORTB.4=PORTB.5=PORTB.6=PORTB.7=PORTD.0=PORTD.1
    #define     RED              PORTD.2=PORTD.3=PORTD.4=PORTD.5=PORTD.6=PORTD.7=PORTC.0=PORTC.1=PORTC.2=PORTC.3
    #define     byte            unsigned char
    #define     PB              PORTB
    #define     PD              PORTD
    #define     PC              PORTC
    #define     TIME            100
    #define     max_var_PWM     100
    #define     Max_LED         20
    #define     Delay1          30  //ms
    #define     Delay2          400 //ms
    #define     D_3             40
    
    
    #define     ON              1
    #define     OFF             0
    
    
    // Declare your global variables here
    byte    a = max_var_PWM , pwm[Max_LED+3],q=0;
    flash byte  rain[]=
    {100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
    ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    rain1[]=
    {100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
    ,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100};
    interrupt [TIM0_OVF] void timer0_comp_isr(void)
    {
    TCNT0 = 95;
    if(a)
        {
        if(!q)
            {
            if(a == pwm[1]){Set_LED20;Set_LED1;}
            if(a == pwm[2]){Set_LED19;Set_LED2;}
            if(a == pwm[3]){Set_LED18;Set_LED3;}
            if(a == pwm[4]){Set_LED17;Set_LED4;}
            if(a == pwm[5]){Set_LED16;Set_LED5;}
            if(a == pwm[6]){Set_LED15;Set_LED6;}
            if(a == pwm[7]){Set_LED14;Set_LED7;}
            if(a == pwm[8]){Set_LED13;Set_LED8;}
            if(a == pwm[9]){Set_LED12;Set_LED9;}
            if(a == pwm[10]){Set_LED11;Set_LED10;}
            }
        else if(q==1)
            {
            if(a == pwm[20])Set_LED20;
            if(a == pwm[19])Set_LED19;
            if(a == pwm[18])Set_LED18;
            if(a == pwm[17])Set_LED17;
            if(a == pwm[16])Set_LED16;
            if(a == pwm[15])Set_LED15;
            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(q==2)
            {
            if(a == pwm[20]){Set_LED20;Set_LED1;}
            if(a == pwm[18]){Set_LED19;Set_LED2;}
            if(a == pwm[16]){Set_LED18;Set_LED3;}
            if(a == pwm[14]){Set_LED17;Set_LED4;}
            if(a == pwm[12]){Set_LED16;Set_LED5;}
            if(a == pwm[10]){Set_LED15;Set_LED6;}
            if(a == pwm[8]){Set_LED14;Set_LED7;}
            if(a == pwm[6]){Set_LED13;Set_LED8;}
            if(a == pwm[4]){Set_LED12;Set_LED9;}
            if(a == pwm[2]){Set_LED11;Set_LED10;}
            }
        else if(q==3)
            {
            if(a == pwm[1])Set_LED20;
            if(a == pwm[2])Set_LED19;
            if(a == pwm[3])Set_LED18;
            if(a == pwm[4])Set_LED17;
            if(a == pwm[5])Set_LED16;
            if(a == pwm[6])Set_LED15;
            if(a == pwm[7])Set_LED14;
            if(a == pwm[8])Set_LED13;
            if(a == pwm[9])Set_LED12;
            if(a == pwm[10])Set_LED11;
            if(a == pwm[11])Set_LED10;
            if(a == pwm[12])Set_LED9;
            if(a == pwm[13])Set_LED8;
            if(a == pwm[14])Set_LED7;
            if(a == pwm[15])Set_LED6;
            if(a == pwm[16])Set_LED5;
            if(a == pwm[17])Set_LED4;
            if(a == pwm[18])Set_LED3;
            if(a == pwm[19])Set_LED2;
            if(a == pwm[20])Set_LED1;
            }
        }
    if(--a == 255)
        {
        a = max_var_PWM;
        PORTD=0;
        PORTB=0;
        PORTC=0;
        }
    }
    
    
    void main(void)
    {
    byte  a,b,c;
    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")
      }
    
    
    while (1)
          {
          // Place your code here 
          for(c=0;c<5;c++)
                {
                for(b=0;b<3;b++)
                   {
                   for(x1=0;x1<39;x1++)
                      {
                      for(x2=y1;x2>0;x2--)
                          {
                          pwm[x2+1]=pwm[x2];
                          }
                      pwm[1]=rain1[x1];
                      delay_ms(Delay1);
                      }
                   }
                if(q++==3) q=0;
                delay_ms(Delay2);
                }
          
          for(c=0;c<0;c++)
                {
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    BLUE=ON;
                    delay_ms(D_3);
                    BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=ON;
                    delay_ms(D_3);
                    RED=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=BLUE=ON;
                    delay_ms(D_3);
                    RED=BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*4);
                }
          
          for(c=0;c<0;c++)
                {
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    BLUE=ON;
                    delay_ms(D_3);
                    BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*4);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=ON;
                    delay_ms(D_3);
                    RED=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*10);
                }
          
          for(c=0;c<0;c++)
                {
                #asm("cli")
                PD=PB=PC=0;
                delay_ms(300);
                PD=PB=PC=255;
                delay_ms(300);
                }      
          #asm("sei")                
          }
    }
    جدیدترین ویرایش توسط Saviour; 2017/02/04, 20:56.

    یک دیدگاه بنویسید:


  • hamed.zahedi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    سلام
    لطفا بگید برای اینکه بخوایم کل پورت رو رو یه سطح ولتاژ نگه داریم چیکار باید کرد؟
    برای فلاشر میخوام
    تا بتونم نور و کم و زیاد کنم

    یک دیدگاه بنویسید:


  • sjaber
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    سلام دوستان
    من این برنامه رو از یه سایت پیدا کردم ولی نمیدونم چرا سرعت چشمک زدن led ها این قدر کمه لطفا اشکالشو بهم بگید
    برنامه:
    [FONT=Yekan]$regfile = "m8def.dat"[/FONT]$crystal = 1000000
    '=============================
    Config Portd = Output
    Dim C As Byte
    Dim X As Byte
    Dim Led(8) As Byte , A As Byte


    '=============================
    Config Timer0 = Timer , Prescale = 1
    On Ovf0 Rgbpwm
    Enable Timer0
    Enable Interrupts
    For X = 0 To 8
    Led(x) = 0


    Next


    Do
    Led(1) = 100
    Led(2) = 60
    Led(3) = 120
    Led(4) = 220
    Loop
    End
    Rgbpwm:
    Timer0 = 0
    Incr C
    If C = 0 Then Portd = &B11111111
    If Led(1) = C Then Reset Portd.0
    If Led(2) = C Then Reset Portd.1
    If Led(3) = C Then Reset Portd.2
    If Led(4) = C Then Reset Portd.3
    Return


    یک دیدگاه بنویسید:


  • ehsanbagheri
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط majidmalvandi نمایش پست ها
    درود بر شما.
    دیود شاتکی رو دقیقا موازی با دیود داخلی ماسفت IRF540N بستم.آند دیود به سورس ماسفت-کاتد دیود به درین ماسفت
    مشکلم با فرکانسه.
    میکرو مگا 16=تایمر کانتر 1 با مد هشت بیتیPWM=فیوز بیت کریستال داخلی میکرو 8مگاهرتز هست.از داخل برنامه فرکانس را روی 2 مگاهرتز تنظیم کردم تا Waitms 1000 یک ثانیه واقعی بشه.
    پرسکل رو 1 میکنم=موتور از دیوتی 50 به بعد حرکت میکنه با گشتاور کم تو دور پایین.خیلی اهسته و بیصدا=اما شاتکی تا مرز سوختن میره.اگه دیوتی روی همون 50 باشه بعد 1 دقیقه شاتکی میسوزه.بعد اینکه شاتکی سوخت درجا ماسفت شروع میکنه به داغ شدن و سوختن

    وقتی پرسکل رو 8 میکنم=موتور از دیوتی 20 حرکت میکنه با گشتاور بال تو دور پایین=اما موتور صوت میکشه

    وقتی پرسکل رو 64 میکنم= موتور قار قار میکنه.

    حالا چیکار کنم که هم موتور سوت نکشه؟
    هم گشتاور تو دور پایین بالا باشه؟
    هم شاتکی داغ نکنه؟

    سپاس از توجه شما.
    این که موتور صوت میکشه دلیلش فرکانس کریر یا همون فرکانس موج pwm هست فرکانس شنوایی انسان از 20 هرتز هست تا 20 کیلوهرتز خب اکر فرکانس تو این محدوده باشه به دلیل لرزش خیلی کم سیمپیچ موتور صدایی ازش شنیده میشه که این لرزش هم خوب نیست وبه مرور باعث آسیب به موتور میشه که تو درایو هایه پیشرفته تو خروجی یه سلف به صورت فیلتر نصب میشه که این فرکانس رو تا حدودی فیلتر میکنه اگر شما بتونی فرکانس رو تا حد 21 کیلو هرتز هم ببری صدایه موتور خیلی خیلی کم میشه
    هر چه فرکانس بیشتر بشه صدایه موتور کمتر میشه و موتور نرم تر کار میکنه ولی محدودیت هم وجود داره یکی از این محدودیت ها اثر پوستی هست که هرچه فرکانس بیشتر بشه الکترون ها بیشتر تمایل پیدا میکنند از قسمت بیرونی هادی حرکت کنند و تا عمق کمتری از هادی جریان الکترون داریم و این باعث میشه هادی گرم بشه شما تا جایی که امکان داره و محدودیت ایجاد نمیشه واست فرکانس رو ببر بالا من تو درایو هایه معروف و صنعتی دیدم حدودا 22 کیلوهرتز هست فرکانس

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : هم گشتاور تو دور پایین بالا باشه؟

    نوشته اصلی توسط Majid_Malvandi
    هم گشتاور تو دور پایین بالا باشه؟
    دوست عزیز از این که این پرسش شما را ندیدم ، ببخشید ...
    در مورد این پرسش شما باید گفت که شما احتیاج به یک مدار بسته دارید نه یک مدار باز ...
    مداری که شما کار میکنید بدون نمونه برداری از خروجی است ...
    شما باید یک شفت انکدر روی موتور وصل کنید و دور آن را بخوانید و زمانی که گشتاور زیاد شد دور آن پایین می آید و شما از اینجا متوجه خواهید شد که دور آن پایین آمده و باید جریان آن را به نسبت زیاد کنید ...
    این نمونه موتورها در بازار هم وجود دارد البته قیمت آنها گران است ولی در عوض دقت و قدرت و سرعت و هوشمندی آنها بسیار بالاست ...
    نمونه موتوری که میتوانم به شما معرفی کنم سرو موتورهای AC سه فازه هستند ...
    ارزانترین مارکی که میتوانم به شما معرفی کنم دلتا است ...
    400 وات با گشتاور 1.27 نیوتن متر است البته این مدل اینرسی پایین است که قیمت آن حدودا&quot; 1.5 میلیون تومان است ...
    این مدلی که گفته شد شفت انکدر 160,000 پالس دارد ... به بیان دیگر در هر دور 160هزار پالس تولید میکند و این پالسها انتقال به میکروکنترلر داخلی درایور آن داده میشود ... شما کاری با این پالسها ندارید ... و تنها کاری که میکنید آن است که به پایه های دایرکت و پالس و فعالساز پالسهای مورد نظر را به درایور موتور میدهید ...
    موفق باشید ...

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط Majid_Malvandi
    درود بر شما.
    دیود شاتکی رو دقیقا موازی با دیود داخلی ماسفت IRF540N بستم.آند دیود به سورس ماسفت-کاتد دیود به درین ماسفت
    مشکلم با فرکانسه.
    میکرو مگا 16=تایمر کانتر 1 با مد هشت بیتیPWM=فیوز بیت کریستال داخلی میکرو 8مگاهرتز هست.از داخل برنامه فرکانس را روی 2 مگاهرتز تنظیم کردم تا Waitms 1000 یک ثانیه واقعی بشه.
    پرسکل رو 1 میکنم=موتور از دیوتی 50 به بعد حرکت میکنه با گشتاور کم تو دور پایین.خیلی اهسته و بیصدا=اما شاتکی تا مرز سوختن میره.اگه دیوتی روی همون 50 باشه بعد 1 دقیقه شاتکی میسوزه.بعد اینکه شاتکی سوخت درجا ماسفت شروع میکنه به داغ شدن و سوختن

    وقتی پرسکل رو 8 میکنم=موتور از دیوتی 20 حرکت میکنه با گشتاور بال تو دور پایین=اما موتور صوت میکشه

    وقتی پرسکل رو 64 میکنم= موتور قار قار میکنه.

    حالا چیکار کنم که هم موتور سوت نکشه؟
    هم گشتاور تو دور پایین بالا باشه؟
    هم شاتکی داغ نکنه؟

    سپاس از توجه شما.
    درود خداوند بر تو
    عزیز دل برادر کاملا درست اشتباه کردی ... :mrgreen:
    دیود را جای خوبی قرار ندادی چون که جریان سلفی برگشتی از موتور خنثی نشده ... و زمانی که جریان موتور قطع میشه ولتاژی برابر با چند صد ولت یا هزار ولت ایجاد خواهد شد و این مساله باعث میشود تا به دیود و ماسفت آسیب وارد کند و طرز درست بستن دیود باید کاتد دیود را به مثبت تغذیه و آند آن را به درین ماسفت متصل کنید ... به این شکل بستن مدار که دیود در این وضعیت قرار دارد در اصطلاح میگویند دیود هرزگرد است ... یعنی جریان برگشتی از موتور را خنثی میکند ...
    برای جلوگیری از صدای بد موتور هم باید فرکانس آن را در مرز بین 40 هرتز تا 100 هرتز نگه دارید ... (بسته به هر موتور فرکانسش فرق میکنه)
    موفق باشید ...

    یک دیدگاه بنویسید:


  • majidmalvandi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    درود بر شما.
    دیود شاتکی رو دقیقا موازی با دیود داخلی ماسفت IRF540N بستم.آند دیود به سورس ماسفت-کاتد دیود به درین ماسفت
    مشکلم با فرکانسه.
    میکرو مگا 16=تایمر کانتر 1 با مد هشت بیتیPWM=فیوز بیت کریستال داخلی میکرو 8مگاهرتز هست.از داخل برنامه فرکانس را روی 2 مگاهرتز تنظیم کردم تا Waitms 1000 یک ثانیه واقعی بشه.
    پرسکل رو 1 میکنم=موتور از دیوتی 50 به بعد حرکت میکنه با گشتاور کم تو دور پایین.خیلی اهسته و بیصدا=اما شاتکی تا مرز سوختن میره.اگه دیوتی روی همون 50 باشه بعد 1 دقیقه شاتکی میسوزه.بعد اینکه شاتکی سوخت درجا ماسفت شروع میکنه به داغ شدن و سوختن

    وقتی پرسکل رو 8 میکنم=موتور از دیوتی 20 حرکت میکنه با گشتاور بال تو دور پایین=اما موتور صوت میکشه

    وقتی پرسکل رو 64 میکنم= موتور قار قار میکنه.

    حالا چیکار کنم که هم موتور سوت نکشه؟
    هم گشتاور تو دور پایین بالا باشه؟
    هم شاتکی داغ نکنه؟

    سپاس از توجه شما.

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط Majid_Malvandi
    درود بر دوستان.

    با pwm یک سافت استارتر برای موتور دی سی ساختم.
    موتور 24 ولت دی سی میباشد و بدون بار تا 300 میلی امپر جریان کشی دارد.
    مشکلی که هست فقط موقع سافت استارت دیود شاتکی بینهایت داغ میکنه.بعدش که موتور حرکت کرد سرد میشه.
    دیود هم دیود دوبل شاتکی هست.از دیود هایی که داخل منابع سویچینگ استفاده میشه.

    ایا دیود باید عوض بشه ؟؟؟؟

    سپاس.
    درود بر شما
    دیود را دقیقا کجا استفاده کردید؟
    نقشه بدید تا راهنمایی کنم
    موفق باشی

    یک دیدگاه بنویسید:


  • zamanimahdi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط Majid_Malvandi
    درود بر دوستان.

    با pwm یک سافت استارتر برای موتور دی سی ساختم.
    موتور 24 ولت دی سی میباشد و بدون بار تا 300 میلی امپر جریان کشی دارد.
    مشکلی که هست فقط موقع سافت استارت دیود شاتکی بینهایت داغ میکنه.بعدش که موتور حرکت کرد سرد میشه.
    دیود هم دیود دوبل شاتکی هست.از دیود هایی که داخل منابع سویچینگ استفاده میشه.

    ایا دیود باید عوض بشه ؟؟؟؟

    سپاس.
    اولا سوال کلا بی ربطه
    دوما فکر میکنم چون سلفی هست ولتاژ زیادی دو طرفش میفته که دیود جواب نمیده

    یک دیدگاه بنویسید:


  • majidmalvandi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    درود بر دوستان.

    با pwm یک سافت استارتر برای موتور دی سی ساختم.
    موتور 24 ولت دی سی میباشد و بدون بار تا 300 میلی امپر جریان کشی دارد.
    مشکلی که هست فقط موقع سافت استارت دیود شاتکی بینهایت داغ میکنه.بعدش که موتور حرکت کرد سرد میشه.
    دیود هم دیود دوبل شاتکی هست.از دیود هایی که داخل منابع سویچینگ استفاده میشه.

    ایا دیود باید عوض بشه ؟؟؟؟

    سپاس.

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط Montazer_110
    با سلام خدمت آقای اسدی
    من یه پروژه نورپردازی دارم که باید 80 ال ای دی 1وات رو بصورت آبشاری یا همون شهاب سنگ روشن کنم، خواستم از مدارهای مولتی پلکسر و ... استفاده کنم که کنترل PWM با اونها رو بلد نبودم، و خواستم برم سراغ Xmega که باز هم تعداد پایه هاش 80 تا نیست!! میشه لطف کنین و راهنمایی کنین :redface:
    درود بر شما
    برنامه نوشته شده آماده است ...
    البته با میکروی 640 یا 1280 یا 2560
    فقط باید یک سری تغییراتی به انجام برسانید ...
    موفق باشید

    نوشته اصلی توسط sjaber
    سلام اقای اسدی
    راستش من هم از دست بسکام خسته شدم خیلی دلم میخواد با سی وبرنامه کد ویژن استفاده کنم ولی مقاله یا جزوه خوبی پیدا نکردم
    لطفا کتاب یا مقاله ای که به خوبی کد ویژن وزبان سی معرفی کنید :sad: :sad: :sad: :sad: :sad:
    درود بر شما
    والا ...
    خود من هم با تمرین و تمرین و تمرین یاد گرفتم ...
    یه کتابی هست به شما معرفی میکنم... برای بچه های کامپیوتر هست ولی نیازی نیست که تا آخرش هم یاد بگیرید چون برای ما کاربردی نداره ... و فقط تا وسطش نیازه که یاد بگیری ...
    کتاب گسترش علوم پایه ++C
    نویسندش هم حمیدرضا مقسمی
    من خودم با این کتاب شروع کردم
    http://gostaresh-pub.com/BookDetile.php?SID=163
    و به خوبی یاد گرفتم البته با کمک یکی از بچه های کامپیوتر ...
    البته این هم هست ...
    http://gostaresh-pub.com/BookDetile.php?SID=691
    این هم هست ولی فکر کنم سطح این پایینتر باشه ... چون رنگش آبی هست ...
    http://gostaresh-pub.com/BookDetile.php?SID=754
    فقط به دنبال تمرین باشید ... با پشتکار میتوانید به خوبی یاد بگیرید ...
    زبان سی یک زبانی هست که قابلیت بسیار زیاد دارد ... مطمئن باشید اگر خوب یاد بگیرید پشیمان نخواهید شد ...
    اگر شما زبان سی را به خوبی یاد بگیرید در تمامی میکروها و بیشتر کامپایلرها و نرم افزارهای شی گرایی کاربرد دارد ...
    موفق باشید

    یک دیدگاه بنویسید:


  • sjaber
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط سامان اسدی
    درود بر شما ...
    بله درسته
    بررسی کردم ...
    ولی این دیگه مقصر من نیستم ...
    مقصر کامپایلر بد بسکام هست ...
    دقیقا همین کد را روی کدویژن امتحان کردم و عالی عالی جواب میده ....
    بدون یک ذره مکث و قطعی ...
    [code=c]
    /************************************************** ***
    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 : 1 PWM
    Resolution : 100 States (0 To 99)
    Date : 18/Jan/2016
    Time : 2142
    Author : Saman.Asadi www.ECA.ir
    Author&#039;s Email : Saman.asadi.ir@gmail.com
    http://www.eca.ir/forum2/index.php?topic=90246.0
    Chip type : ATmega8
    Program type : Application
    AVR Core Clock frequency : 8 MHz
    Memory model : Small
    Data Stack size : 256
    ************************************************** ***/
    #include &lt;mega8.h&gt; //for ATmega8 or ATmega8L or ATmega8A
    #include &lt;delay.h&gt;

    #define Max_Variable_PWM 99
    #define Set_PWM Max_Variable_PWM
    #define Reset_PWM 0

    unsigned char Counter_PWM , pwm[3];

    interrupt [TIM2_COMP] void timer2_comp_isr(void);

    //pwm[1] ===&gt; PORTD.0

    void main(void)
    {
    signed char x;
    //Config all
    //Config timers
    //Config PORTS
    {
    DDRD |= 0x01;
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 KHz
    // Mode: CTC top=OCR2
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2 = 0x0A;
    OCR2 = 0x99;
    TCNT2= 0x00;
    //Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK |= 0x80;
    // Global enable interrupts
    #asm(&quot;sei&quot
    }//End Config ...


    while(1)
    {
    for(x=0;x&lt;100;x++)
    {
    pwm[1]=x;
    delay_ms(50);
    }
    for(x=99;x&gt;0;x--)
    {
    pwm[1]=x;
    delay_ms(50);
    }
    }
    }


    // Timer 2 output compare interrupt service routine
    interrupt [TIM2_COMP] void timer2_comp_isr(void)
    {
    if(Counter_PWM)
    {
    if(Counter_PWM == pwm[1]) PORTD |= 0x01;
    }
    if(--Counter_PWM == 255)
    {
    Counter_PWM = Max_Variable_PWM;
    PORTD &amp;= 0xFE;
    }
    }
    [/code]
    این کد در کدویژن هست ...
    این هم کد در بسکام
    [code=qbasic]
    &#039;******************************************** *********
    &#039;Project : 1 PWM
    &#039;Resolution : 100 States (0 To 99)
    &#039;Date : 18/Jan/2016
    &#039;Time : 2125
    &#039;Author : Saman.Asadi www.ECA.ir
    &#039;Author&#039;s Email : Saman.asadi.ir@gmail.com
    &#039;http://www.eca.ir/forum2/index.php?topic=90246.0
    &#039;Chip type : ATmega8
    &#039;Program type : Application
    &#039;AVR Core Clock frequency : 8 MHz
    &#039;******************************************** *********
    $regfile = &quot;m8def.dat&quot; &#039;for ATmega8 or ATmega8A
    $crystal = 8000000
    Max_Variable_PWM Alias 99
    Set_PWM Alias Max_Variable_PWM
    Reset_PWM Alias 0

    Dim Counter_pwm As Byte , Pwm(3) As Byte

    &#039;Config All =============================================
    Config Timer2 = TIMER , Prescale = 8
    Enable Compare2
    ON Compare2 T2
    &#039; Timer/Counter 2 initialization
    &#039; Clock source: System Clock
    &#039; Clock value: 1000.000 KHz
    &#039; Mode: CTC top=OCR2
    &#039; OC2 output: Disconnected
    Assr = &amp;H00
    TCCR2 = &amp;H0A
    OCR2 = &amp;H99
    Tcnt2 = &amp;H00
    &#039;Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK = &amp;H80
    &#039;Global enable interrupts
    Enable Interrupts
    &#039;Config Outputs
    DDRD = &amp;H01 OR DDRD
    &#039;End Config ============================================

    Dim X1 As Byte

    Do
    &#039;******************************

    For X1 = 0 To 99 Step 1
    Pwm(1) = X1
    Waitms 50
    Next X1
    For X1 = 99 To 0 Step -1
    Pwm(1) = X1
    Waitms 50
    Next X1
    Loop
    End


    T2:
    If Counter_pwm &gt; 0 Then
    If Counter_pwm = Pwm(1) Then PORTD = &amp;H01 OR PORTD
    End If
    Decr Counter_pwm
    If Counter_pwm = 255 Then
    Counter_pwm = Max_variable_pwm
    PORTD = &amp;HFE AND PORTD
    End If
    Return
    [/code]

    توی دوره کاردانی که بودم اینقدر اشکال از بسکام گرفتم که حد و حساب نداشت ...
    خیلی خیلی عذر میخوام ولی نظر شخصی منه ...
    بسکام اصلا جالب نیست ...
    از نظر خودم کدویژن بهترین نرم افزار برای این کاره ...
    دومین نرم افزاری که من پیشنهاد میکنم اتمل استودیو است ... (به همین دلیل ترتیب نرم افزارها را به این شکل در نرم افزارم قرار دادم)

    موفق باشید ...
    سلام اقای اسدی
    راستش من هم از دست بسکام خسته شدم خیلی دلم میخواد با سی وبرنامه کد ویژن استفاده کنم ولی مقاله یا جزوه خوبی پیدا نکردم
    لطفا کتاب یا مقاله ای که به خوبی کد ویژن وزبان سی معرفی کنید :sad: :sad: :sad: :sad: :sad:

    یک دیدگاه بنویسید:


  • Montazer_110
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    با سلام خدمت آقای اسدی
    من یه پروژه نورپردازی دارم که باید 80 ال ای دی 1وات رو بصورت آبشاری یا همون شهاب سنگ روشن کنم، خواستم از مدارهای مولتی پلکسر و ... استفاده کنم که کنترل PWM با اونها رو بلد نبودم، و خواستم برم سراغ Xmega که باز هم تعداد پایه هاش 80 تا نیست!! میشه لطف کنین و راهنمایی کنین :redface:

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

    نوشته اصلی توسط stk
    با سلام و خسته نباشید
    آقای مهندس برنامه ردیف کردم
    در مورد افکت ها نظرتون چیه ؟ با تشکر
    درود بر شما
    ببخشید که دیر پاسخ میدم
    بله دیدم ...
    افکتهای بسیار جالبی هستن ... ولی برای اینکه مهندسی معکوس کنید یه خورده زمان گیر هست ... خدا کنه که فکر نکنید میخوام منتی بگذارم ... ولی زمانی نمیتونم برای این کار اختصاص بدم ... واقعا سرم خیلی شلوغه ... نمیتونم الکی یه قولی بدم و نتونم انجامش بدم ...
    نوشته اصلی توسط stk
    سلام اقای مهندس
    مدار را بستم ولی رگولاتور 5 ولت زیاد گرم میشه و میکرو ۱۰۰ میلی امپر جریان میکشه ایا عادی هست ؟؟ رگورلاتور 7805cv هست خروجی میکرو هم به ۱۶ ال ای دی به دو پورت متصل هست هر ال ای دی 5 میلی امپر مصرف میکنه .
    بله درسته این عادی است ... به دلیل اینکه منابع تغذیه رگولاتوری تلفات دارند و زمانی که شما جریانی میکشید شروع به گرم شدن میکنند ... اگر شما بتوانید ولتاژ ورودی را تا حدی کم کنید تلفات آن هم کمتر میکنید... مثلا اگر بتوانید ولتاژ ورودی رگولاتور را بین 7.5 و 9 ولت نگه دارید مناسبه ... برای جلوگیری از ایجاد حرارت بایستی از منابع سوئیچینگ(کلیدی) استفاده کنید ...
    این منابع شاید به ظاهر کمی گرانتر باشند ولی از لحاظ سبکی و قدرت حرف اول را میزنند ... در توانهای خیلی بالاتر دیگه نمیشه از رگولاتور استفاده کرد چون به شدت تلفات ایجاد میشه ... تلفات که بیشتر بشه گرما بیشتر میشه و گرما که بیشتر بشه احتمال سوختنش هم بیشتر میشه ... گرما که بیشتر بشه باید به فکر سیستم خنک کننده ای باشید ... که این خود هزینه ها را بالا می برد ... با وجود اینکه در CNC های بزرگ از منابع سوئیچینگ قدرتمندی استفاده میشود ولی باز هم گرمای زیادی ایجاد میکند که برای جلوگیری از این گرماها از کولر گازی استفاده میکنند ...
    بحث کجا بود به کجا کشید ... :mrgreen: فقط خواستم اطلاعات بدم ...
    موفق باشید ....

    یک دیدگاه بنویسید:


  • stk
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    سلام اقای مهندس
    مدار را بستم ولی رگولاتور 5 ولت زیاد گرم میشه و میکرو ۱۰۰ میلی امپر جریان میکشه ایا عادی هست ؟؟ رگورلاتور 7805cv هست خروجی میکرو هم به ۱۶ ال ای دی به دو پورت متصل هست هر ال ای دی 5 میلی امپر مصرف میکنه .

    یک دیدگاه بنویسید:

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