NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3037 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 20 از 24

موضوع: کمک... کار با تایمر ها

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    Icon16 کمک... کار با تایمر ها

    من یه سوال دارم میشه دوستان کمک کنن .من تو تایمرا مشکل دارم اگر راهنماییم کنید ممنون میشم
    با استفاده از مد fast pwm (تایمر یک) یک پالس مربعی به گونه ای تولید کنید که با استفاده از دو کلید فشاری برای D.C و دو کلید فشاری برای فرکانس بتواند 100khz<f<1Mhz و دیوتی سایکل بین 35 تا 55 درصد تغییر کند.
    nرا خودمون باید تعیین کنیم
    F=4MHz

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    سوال یکم گنگه بیشتر توضیح بده

  4. #3
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    توضیحات شما کمه و باید بیشتر توضیح میدادین.
    با تایمر 1 avr میشه همچین کاری کرد. شما باید top تایمر 1 رو ICR1 انتخاب کنید. اونوقت با مقدار دهی مناسب به ICR1 میتونید فرکانس خروجی رو تنظیم کنید و با مقدار دهی به OCR1A و OCR1B میشه دیوتی سایکل رو تنظیم کرد.

  5. #4
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط esisafa نمایش پست ها
    توضیحات شما کمه و باید بیشتر توضیح میدادین.
    با تایمر 1 avr میشه همچین کاری کرد. شما باید top تایمر 1 رو ICR1 انتخاب کنید. اونوقت با مقدار دهی مناسب به ICR1 میتونید فرکانس خروجی رو تنظیم کنید و با مقدار دهی به OCR1A و OCR1B میشه دیوتی سایکل رو تنظیم کرد.
    این دقیقا سوال استاد بود و توضیح بیشتری ندادن ولی فکر کنم همین چیزی که شما گفتینو میخواد با توجه به درسی که دادن!!
    میشه شما درمورد گفتتون بیشتر توضیح بدید

    - - - Updated - - -

    نقل قول نوشته اصلی توسط erfanjeddy نمایش پست ها
    سوال یکم گنگه بیشتر توضیح بده
    توضیح بیشتری ندادن استاد والا
    ویرایش توسط mahdieh721 : 25-11-2015 در ساعت 11:31

  6. #5
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    ببینید شما وقتی با کدویژن و کدویزاردش کار میکنید، میتونید مقدار ماکزیمم تایمر1 در حالت pwm رو رجیستر ICR انتخاب کنید. با این کار شمارنده تایمر تا مقدار داده شده به رجیستر ICR میشماره دوباره صفر میشه و شمارش ادامه پیدا میکنه. حالا در داخل برنامه میتونید مقدار ICR رو تغییر بدین تا فرکانس خروجی تغییر کنه. مقدار OCR هم باید بین 0 و ICR باشه تا دیوتی سایکل مناسب تولید بشه.
    هر چه مقدار ICR کمتر بشه فرکانس بیشتر میشه و برعکس

  7. تشکرها از این نوشته :


  8. #6
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    توضیحات دوستمون به نظرم کافیه من دیگه چیزی نمیتونم اضافه کنم

  9. تشکرها از این نوشته :


  10. #7
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    میشه اگر میتونید کد این برنامه رو تا یه حدیشو برام بنویسید .... چون من خیلی گیج شدم
    من این مبحثو نفهمیدم کدو برنامه خوبیم پیدا نمیکنم که از روش بخونم ...اگر کسی میتونه کمکم کنه و یه سری توضیحاتم بده ممنونش میشم.
    ویرایش توسط mahdieh721 : 26-11-2015 در ساعت 15:23

  11. #8
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    یه نمونه میفرسم واست

  12. تشکرها از این نوشته :


  13. #9
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط erfanjeddy نمایش پست ها
    یه نمونه میفرسم واست
    شما کی میتونید برام بفرستید؟

  14. #10
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    وای شرمنده یادم رفته بود همین امشب میفرسم

  15. #11
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    اینو یه نگاه بنداز ببین سر در میاری چی شده

    کد:
    void PWM_Init_Start(){
    
    
    	DDRD = (1<<PORTD5);
    	TCNT1 = 984;
    	OCR1A = 998;
    	
    	TIMSK |= (1 << TOIE1); 
    	
    	TCCR1A |= (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
    	TCCR1B |= (1<<CS10) | (1<<WGM12);
    
    
    }
    
    
    void main(void)
    {
    	
    	sei();
    	PWM_Init_Start();
    	
    	while (1)
    	{
    	
    	}
    }
    
    
    ISR(TIMER1_OVF_vect)
    {
    	TCNT1 = 984;
    }

  16. تشکرها از این نوشته :


  17. #12
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط erfanjeddy نمایش پست ها
    اینو یه نگاه بنداز ببین سر در میاری چی شده

    کد:
    void PWM_Init_Start(){
    
    
        DDRD = (1<<PORTD5);
        TCNT1 = 984;
        OCR1A = 998;
        
        TIMSK |= (1 << TOIE1); 
        
        TCCR1A |= (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
        TCCR1B |= (1<<CS10) | (1<<WGM12);
    
    
    }
    
    
    void main(void)
    {
        
        sei();
        PWM_Init_Start();
        
        while (1)
        {
        
        }
    }
    
    
    ISR(TIMER1_OVF_vect)
    {
        TCNT1 = 984;
    }
    ممنون
    یه چیزایی میفهمم یه مشکل اساسی که من دارم اینه که تو سوالم چجوری باید به ocr و tcnt مقدار بدم یا مثلا فرکانس و دیوتی سایکل متغیر بسازم؟
    کتاب زیاد خوندم ولی خیلی گیج شدم استادم سوالی حل نکرده برامون متاسفانه

  18. #13
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    منم برای همین نکته این برنامرو نوشتم مقدار tcnt داخل isr ست میشه . دقت کن به tcnt1=984 که مقداریه برای مثال، شما یه متغیر باید جای 984 بزاری و اونو تغییر بدی این یعنی تایمر از 984 تا 1024 میشمره و هنگام ریست شدن وقفه اتفاق میفته و دوباره مقدار 984 رو مگیره. دیوتی با ocr1a تعیین میشه اونو متونی هرجایی تغییر بدی ولی دقت کن که مقدارش بین tcnt1 و 1024 باشه حتما

  19. #14
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط erfanjeddy نمایش پست ها
    منم برای همین نکته این برنامرو نوشتم مقدار tcnt داخل isr ست میشه . دقت کن به tcnt1=984 که مقداریه برای مثال، شما یه متغیر باید جای 984 بزاری و اونو تغییر بدی این یعنی تایمر از 984 تا 1024 میشمره و هنگام ریست شدن وقفه اتفاق میفته و دوباره مقدار 984 رو مگیره. دیوتی با ocr1a تعیین میشه اونو متونی هرجایی تغییر بدی ولی دقت کن که مقدارش بین tcnt1 و 1024 باشه حتما
    من همه ی اینارو به صورت تئوری بلدم ولی تو عمل که میرم نمیتونم بنویسم

  20. #15
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    میشه خواهش کنم یه مقدار از کد رو اگر میتونید برام بنویسید چون من باید همین تمرینو با یه مد دیگه هم بنویسم و سر اولی گیر کردم.... میخوام شیوه برنامه نویسی توی این مبحث رو یاد بگیرم

  21. #16
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    باشه در اسرع وقت واست مینویسم ولی من با gcc کار میکنم کدویژن استفاده نمیکنم. اصلاح تفاوت ها با خودت

  22. تشکرها از این نوشته :


  23. #17
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    قسمت کلید های فشاری فرضیه و خواندن کلیدها با شما ببخشید که توضیحات تو کد ننوشتم سوالی هست بپرسید

    کد:
    /* * CFile1.c
     *
     * Created: 12/3/2015 10:36:14 AM
     *  Author: erf
     */ 
    
    
    
    
    
    
    #define F_CPU 4000000UL
    #include <stdint.h>
    #include <avr/interrupt.h>
    
    
    #define TCNT100KVAL 984
    #define TCNT1MVAL	1020
    #define DUTYMIN	35
    #define DUTYMAX	55
    
    
    #define BUTTON 0  /*just for example*/
    
    
    volatile uint16_t freqVal;
    volatile uint8_t DutyVal;
    
    
    void PWM_Init_Start();
    void Freq_Inc();
    void Freq_Dec();
    void Duty_Inc();
    void Duty_Dec();
    void Timer_Stop();
    void Timer_Start();
    
    
    void main(void)
    {
    	freqVal = TCNT100KVAL;
    	DutyVal = 50;
    	
    	sei();
    	PWM_Init_Start();
    	
    	while (1)
    	{
    		switch(BUTTON)
    		{
    			case 1:
    				Freq_Inc();
    			break;
    			
    			case 2:
    				Freq_Dec();
    			break;
    				
    			case 3:
    				Duty_Inc();
    			break;
    			
    			case 4:
    				Duty_Dec();
    			break;
    		}
    	}
    }
    
    
    void Timer_Stop()
    {
    	TCCR1B &= ~(1<<CS10);
    }
    void Timer_Start()
    {
    	TCCR1B |= (1<<CS10); 
    }
    
    
    void PWM_Init_Start()
    {
    
    
    	DDRD = (1<<PORTD5);
    	TCNT1 = freqVal;
    	OCR1A = (1024 - freqVal) * (DutyVal/100);
    	
    	TIMSK |= (1 << TOIE1);
    	
    	TCCR1A |= (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
    	TCCR1B |= (1<<CS10) | (1<<WGM12);
    
    
    }
    
    
    void Freq_Inc()
    {
    	
    	if (freqVal < TCNT1MVAL)
    	{
    		Timer_Stop();
    		freqVal++;
    		OCR1A = (1024 - freqVal) * (DutyVal/100);
    		Timer_Start();
    	} 
    	
    }
    
    
    void Freq_Dec()
    {
    	
    	if (freqVal > TCNT100KVAL)
    	{
    		Timer_Stop();
    		freqVal--;
    		OCR1A = (1024 - freqVal) * (DutyVal/100);
    		Timer_Start();
    	}
    }
    
    
    
    
    void Duty_Inc()
    {
    	if (DutyVal<DUTYMAX)
    	{
    		Timer_Stop();
    		DutyVal++;
    		OCR1A = (1024 - freqVal) * (DutyVal/100);
    		Timer_Start();
    		
    	}
    }
    void Duty_Dec()
    {
    	Timer_Stop();
    	DutyVal--;
    	OCR1A = (1024 - freqVal) * (DutyVal/100);
    	Timer_Start();
    }
    
    
    ISR(TIMER1_OVF_vect)
    {
    	TCNT1 = freqVal;
    }

  24. تشکرها از این نوشته :


  25. #18
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط erfanjeddy نمایش پست ها
    قسمت کلید های فشاری فرضیه و خواندن کلیدها با شما ببخشید که توضیحات تو کد ننوشتم سوالی هست بپرسید

    کد:
    /* * CFile1.c
     *
     * Created: 12/3/2015 10:36:14 AM
     *  Author: erf
     */ 
    
    
    
    
    
    
    #define F_CPU 4000000UL
    #include <stdint.h>
    #include <avr/interrupt.h>
    
    
    #define TCNT100KVAL 984
    #define TCNT1MVAL    1020
    #define DUTYMIN    35
    #define DUTYMAX    55
    
    
    #define BUTTON 0  /*just for example*/
    
    
    volatile uint16_t freqVal;
    volatile uint8_t DutyVal;
    
    
    void PWM_Init_Start();
    void Freq_Inc();
    void Freq_Dec();
    void Duty_Inc();
    void Duty_Dec();
    void Timer_Stop();
    void Timer_Start();
    
    
    void main(void)
    {
        freqVal = TCNT100KVAL;
        DutyVal = 50;
        
        sei();
        PWM_Init_Start();
        
        while (1)
        {
            switch(BUTTON)
            {
                case 1:
                    Freq_Inc();
                break;
                
                case 2:
                    Freq_Dec();
                break;
                    
                case 3:
                    Duty_Inc();
                break;
                
                case 4:
                    Duty_Dec();
                break;
            }
        }
    }
    
    
    void Timer_Stop()
    {
        TCCR1B &= ~(1<<CS10);
    }
    void Timer_Start()
    {
        TCCR1B |= (1<<CS10); 
    }
    
    
    void PWM_Init_Start()
    {
    
    
        DDRD = (1<<PORTD5);
        TCNT1 = freqVal;
        OCR1A = (1024 - freqVal) * (DutyVal/100);
        
        TIMSK |= (1 << TOIE1);
        
        TCCR1A |= (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
        TCCR1B |= (1<<CS10) | (1<<WGM12);
    
    
    }
    
    
    void Freq_Inc()
    {
        
        if (freqVal < TCNT1MVAL)
        {
            Timer_Stop();
            freqVal++;
            OCR1A = (1024 - freqVal) * (DutyVal/100);
            Timer_Start();
        } 
        
    }
    
    
    void Freq_Dec()
    {
        
        if (freqVal > TCNT100KVAL)
        {
            Timer_Stop();
            freqVal--;
            OCR1A = (1024 - freqVal) * (DutyVal/100);
            Timer_Start();
        }
    }
    
    
    
    
    void Duty_Inc()
    {
        if (DutyVal<DUTYMAX)
        {
            Timer_Stop();
            DutyVal++;
            OCR1A = (1024 - freqVal) * (DutyVal/100);
            Timer_Start();
            
        }
    }
    void Duty_Dec()
    {
        Timer_Stop();
        DutyVal--;
        OCR1A = (1024 - freqVal) * (DutyVal/100);
        Timer_Start();
    }
    
    
    ISR(TIMER1_OVF_vect)
    {
        TCNT1 = freqVal;
    }
    خیلی لطف کردید
    فقط میشه بگید
    #define TCNT100KVAL 984
    #define TCNT1MVAL 1020

    برای چی هستن؟
    و اینکه از F_CPU هم جایی استفاده نشده؟

    این دوتارم نفهمیدم

    volatile uint16_t freqVal;
    volatile uint8_t DutyVal;
    ویرایش توسط mahdieh721 : 03-12-2015 در ساعت 20:34

  26. #19
    کاربر علاقه مند
    تاریخ عضویت
    Oct 2015
    نوشته ها
    30
    تشکر
    18
    تشکر شده 2 بار در 2 پست

    پیش فرض

    // Timer1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    // Place your code here
    TCNT1H=0x00;
    TCNT1L=0x00;

    }

    این تیکه کد با این قسمت که شما نوشتید مثل همن دیگه درسته؟
    ISR(TIMER1_OVF_vect)
    {
    TCNT1 = freqVal;
    }

  27. #20
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    به نظر که درست میاد

    - - - Updated - - -

    من یکم خلاصش کردم عدد تایمر ها رو میشه برحسب F_CPU بدست آورد ولی من برای 4 مگاهرتز حساب کردم و عددارو گذاشتم برای محاسبات فرکانس PWM قسمت تایمر 1 دیتاشیت رو بخون

صفحه 1 از 2 12 آخرینآخرین

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •