اطلاعیه

Collapse
No announcement yet.

PWM در WINAVR

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

    PWM در WINAVR

    می خواستم از PWM در WINAVR استفاده کنم اگه سورس ساده ای توانست گیر بیاره یا کسی PWM در WINAVR آشنا بود بی دریغ سپاس گذارمکمکی بکند. :smile:

    اضافه شده در تاریخ :
    این هم سورس
    #include <avr\io.h>

    #include <avr\iom8.h>

    #define outp(a, b) b = a




    int main(void) {

    /* set OC2 for PWM output*/

    outp((1<<PINB3), DDRB);

    /*set timer counter initial value*/

    TCNT2=0x00;

    /*Set timer output compare register*/

    OCR2=0x80;

    /*start timer:

    without presscaler

    Non inverted mode in OC2 pin;

    phase corect PWM*/

    outp((1<<FOC2)|(1<<COM21)|(1<<CO M20)|(1<<WGM20)|(1<<CS00), TCCR2);

    for (; {

    /* loop forever timer does the job*/




    }

    }
    [url=http://[url=http://winavr.scienceprog.com/avr-gcc-tutorial/control-avr-8-bit-timer-counter2-using-winavr.html]http://winavr.scienceprog.com/avr-gc...inavr.html</a>
    حالا یکی که می تونه توضیح بده.
    Difficult But possible
    به اميد ايراني آباد.
    http://art-net.ir

    #2
    پاسخ : PWM در WINAVR

    با سلام
    (شرمنده اگر تکراری است)
    یک نکته که معمولا در کامپایلر c برای avr استفاده میآ‌شود، شیفت دادن برای مقدارآ‌دهی اولیه است. به این صورت که فرض کنید شما میآ‌خواهید رجیستر TCCR2 را مقداردهی کنید به صورتی که مثلا در مد phase correct pwm و .... باشه. شما با رجوع به دیتا شیت میآ‌بینید که باید به عنوان مثال بیتآ‌های ۳ ۴ ۶ باید مقدار یک داشته باشند. یک روش اینه که شما عدد باینری یا هگز معادل رو محاسبه کنید و مثلا بنویسید:
    TCCR2 = 0x38; // 01011000
    ولی یک روش قشنگآ‌تر وجود داره! اگر به دیتا شیت دقت کنید میآ‌بینید که در رجیستر TCCR2 اسم بیت ۳ به عنوان مثال COM20، بیت ۴ COM21 و بیت ۶ FOC2 است. حالا کافی است به جای قبلی بنویسید:
    TCCR2 = (1&lt;&lt;COM20) | (1&lt;&lt;COM21) | (1&lt;&lt;FOC2)
    همونآ‌ طور که خودتون هم میآ‌دونید علامت &gt;&gt; به معنی شیفت به چپ است. به عنوان مثال (1&lt;&lt;COM20) به این معنی است که عدد یک را به اندازه COM20 شیفت بده یعنی در مثال ما ۳ واحد که اینجا عدد 00001000 درست میآ‌شود. در اخر همهآ‌ی این اعداد را با هم OR میآ‌کنیم تا بیتآ‌های مورد نظر یک شوند:
    00001000
    00010000
    01000000
    ---------------OR
    01011000
    دقت کنید که این روش شاید در نگاه اول مسخره به نظر برسه ولی خوانایی تنظیمات رو بیشتر میآ‌کنه و به راحتی میآ‌توان فهمید که یک رجیستر به چه صورت ست شده است. نکته دیگر: این محاسبات چون مقادیرش از قبل مشخصه، در زمان کامپایل محاسبات انجام میآ‌شه و خود AVR این محسبات رو انجام نمیآ‌ده.
    من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

    دیدگاه

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