اطلاعیه

Collapse
No announcement yet.

کمک: تولید موج PWM با تایمر 0

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

    کمک: تولید موج PWM با تایمر 0

    سلام
    من می خواهم در مد Fast PWM پالسی با فرکانس 50 هرتز درست کنم که بتوانم عرض (دوره) پالس رو از 1 تا 2 میلی ثانیه تغییر بدم.
    (مثلا با 1 شدن PB1، با هر بار یک شدن PB2 ، یک دهم میلی ثانیه کاهش و در صورت 0 شدن PB1 ، با هر بار یک شدن آن یک دهم میلی ثانیه کاهش یابد.)
    در واقع من می خواهم برای کنترل موتور براشلس از طریق دادن این سیگنال به اسپید کنترلر استفاده کنم...
    - اصلا می شه با TCNT0 این کار رو انجام داد؟ (با توجه به این که نیاز به سینوسی بودن اون نیست برای ورود به اسپید کنترلر)
    - آیا با تغییر مقدار OCR0 در همین MODE می شه زمانش رو تغییر داد؟ (منظورم همون عرض پالسه)

    یه برنامه هم نوشتم ولی فکر کنم (:redface که مشکل داره!! (در اینجا مقدار اولیه ی duty cycle بیست درصده و همین طور میشه افزایشش داد)
    از کریستال 16 مگاهرتز هم استفاده شده. و از atmega16
    کد:
    #include <mega16.h> 
    interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
    { 
    TCNT0=0x06; 
    } 
    void main(void) 
    { 
    PORTB=0x00; 
    DDRB=0x08; 
     
    // Timer/Counter 0 initialization 
    // Clock source: System Clock 
    // Clock value: 250.000 kHz 
    // Mode: Fast PWM top=FFh 
    // OC0 output: Non-Inverted PWM 
    TCCR0=0x6B; 
    TCNT0=0xf5; //TCNT0 = 245
    OCR0=0x38; //OCR0 = 56 
    // Timer(s)/Counter(s) Interrupt(s) initialization 
    TIMSK=0x01; 
    // Global enable interrupts 
    #asm("sei") 
    while (1){ 
       if(PIND.0==0)OCR0=++OCR0; 
        if(PIND.1==0)OCR0=--OCR0; 
        delay_ms(200);  
     };
    }
    لطفا اساتید راهنمایی کنن و اگه فقط درست و غلطش رو هم بگین خیلی ممنونم!! :agree:
    هر سوزنی که برای غیر خدا زدم به دستم فرو رفت (شیخ رجبعلی خیاط)

    #2
    پاسخ : کمک: تولید موج PWM با تایمر 0

    سلام

    احتمالا برنامه از جایی کپی نشده؟ ، چون فکر برنامه درست است ولی مقادیر اولیه مشکل دارد.

    ببنید :
    1- با تایمر0 در مد fastpwm با کریستال 16 مگاهرتز میتوان موج مربعی با حداقل فرکانس حدود 61 هرتز ساخت (با استفاده از پری اسکیلر 1024) و با این شرایط اصلا و به هیچ عنوان نمیشه 50 هرتز ساخت .

    2- فکر برنامه کاملا درست است و اگر میخواهید موج خروجی به مقادیر مد نظرتون برسد، بایستی در فرضیات مساله تون دست ببرید.
    بهترین کار (به نظر من) استفاده از کریستال 11.0592 مگاهرتز به جای 16 مگاهرتز است.
    که در این صورت بایستی برنامه اینگونه نوشته شود:
    کد:
    #include <mega16.h> 
    #define xtal 11059200
    #include <delay.h>
    interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
    { 
    	TCNT0=0x28; 
    }
    void main(void) 
    {  
    	PORTD.0=1; //pull up
    	PORTD.1=1; //pull up
    	DDRB=0x08; 
    	TCNT0=0x28; //TCNT0 = 40
    	OCR0=0x6B; //OCR0 = 107
    	TIMSK=0x01;  
    	#asm("sei")
    	TCCR0=0x6D;
    	while (1)
    	{ 
    		if( (PIND.0==0) && ((OCR0+1)>=0x28) ) OCR0++; 
    		if( (PIND.1==0) && ((OCR0-1)>=0x28) ) OCR0--;
    		delay_ms(200);  
    	}
    }
    (برنامه را کامپایل نکردم و همینجوری تو notepad ++ نوشتم ، ولی فکر نمیکنم اشکالی داشته باشه)
    راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
    کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
    نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
    انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

    دیدگاه

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