اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط سامان اسدی
    سلام
    کار سختی نیست
    شما میتوانید عدد را از ADC بخوانید و آن را مساوی با یکی از خانه های(اندیس) مورد نظر آرایه مقدار دهی کنید ...

    موفق باشید
    با سلام و تشکر

    تعداد آرایه باید 255 تای باشه؟

    دیدگاه


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

      نوشته اصلی توسط soltanfarid
      با سلام و تشکر

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

      دیدگاه


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

        سلام

        وقتی برنامه ی به زبان بیسیک رو خوندم این سوال برام پیش اومد که دوستان چرا از دستور pulseout استفاده نکردن ؟؟؟!؟!!!!؟؟ :eek:
        اگه در یه حلقه با دستور pulseout رو پین هایی پالس ایجاد کنیم مثل اینه که رو همه ی اون پین ها pwm داریم!


        مثلا :
        کد:
        do
        pulseout porta,0,a
        pulseout porta,1,b
        pulseout porta,2,c
        pulseout porta,3,d
        pulseout porta,4,e
        pulseout porta,5,f
        pulseout porta,6,g
        pulseout porta,7,h
        
        loop
        حالا تمام پین های پورت a دارن pwm ایجاد میکنن!




        دیدگاه


          پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR &#

          نوشته اصلی توسط mobin-m
          سلام

          وقتی برنامه ی به زبان بیسیک رو خوندم این سوال برام پیش اومد که دوستان چرا از دستور pulseout استفاده نکردن ؟؟؟!؟!!!!؟؟ :eek:
          اگه در یه حلقه با دستور pulseout رو پین هایی پالس ایجاد کنیم مثل اینه که رو همه ی اون پین ها pwm داریم!


          مثلا :
          کد:
          do
          pulseout porta,0,a
          pulseout porta,1,b
          pulseout porta,2,c
          pulseout porta,3,d
          pulseout porta,4,e
          pulseout porta,5,f
          pulseout porta,6,g
          pulseout porta,7,h
          
          loop
          حالا تمام پین های پورت a دارن pwm ایجاد میکنن!
          خیر جانم ...
          اگر میشد که ، این همه فکر خرج نمیکردم ...
          بعدش هم این دستور برای زمانی به کار میره که یک تک پالس بخواهید با مدت زمانی که برای آن تعریف میکنید ...
          تازه با فرض این که موج PWM را ایجاد کنه همه با هم اجرا نمیکنه ... یعنی اینکه خط به خط ایجاد میشه ....
          اون برنامه ای که نوشتم تمام پایه ها با هم PWM ایجاد میکنه ... و تمام پایه ها مستقل از همدیگر ... !!!
          البته نه اینکه فرکانسهاشون با هم فرق کنه ... منظور این است که دیوتی سایکل ها از هم مستقل هستند ...

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

          دیدگاه


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

            نوشته اصلی توسط سامان اسدی
            با بسکام میخوای یا کدویژن؟

            میخام خودم بنویسم

            با کدویژن

            الگوریتم ش دست تم بیاد کافی برام

            خودم ننویسم سودی نداره برام

            با تشکر از حسن نیت شما که بدون چشم داشتی پاسخ میدید

            دیدگاه


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

              با تشکر از دوستان عزیز و مخصوصا جناب مهندس اسدی که واقعا زحمت کشیدند

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

              -چطور باید باهاش کار کرد
              -چطور میشه افکت نوشت
              -چطور میشه تغییرات ایجاد کرد
              -آیا میشه جوری کد رقص نور نوشت ک توی یک سری از جاها از این PWM استفاده کنیم و یک جاهایی نه؟

              و سوالاتی از این قبیل ! اگر لطف بفرمایید آموزش کاملی بدید واقعا ممنون میشم ...

              دیدگاه


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

                نوشته اصلی توسط Mohammad_2007
                با تشکر از دوستان عزیز و مخصوصا جناب مهندس اسدی که واقعا زحمت کشیدند

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

                -چطور باید باهاش کار کرد
                -چطور میشه افکت نوشت
                -چطور میشه تغییرات ایجاد کرد
                -آیا میشه جوری کد رقص نور نوشت ک توی یک سری از جاها از این PWM استفاده کنیم و یک جاهایی نه؟

                و سوالاتی از این قبیل ! اگر لطف بفرمایید آموزش کاملی بدید واقعا ممنون میشم ...
                به ارایه ها مقدار بده
                کترین مقدار = کمترین نور یا خاموش
                بیشترین مقدار = بیشترین نور کاملا روشن
                اینطوری برنامه فلاشر خودتو بنویس حالا هر جا که خواستی pwmبزاری نقدار ارایه ها رو عوض کن
                http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                دیدگاه


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

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

                  میخام خودم بنویسم

                  با کدویژن

                  الگوریتم ش دست تم بیاد کافی برام

                  خودم ننویسم سودی نداره برام

                  با تشکر از حسن نیت شما که بدون چشم داشتی پاسخ میدید
                  دوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از ADC بخوانید و عدد را مساوی با 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 : 32-channel PWM (Rain LED)
                  Version : 2.1
                  Date : 2/27/2014
                  Author : Saman.Asadi
                  www.ECA.ir
                  Chip type : ATmega16
                  Program type : Application
                  AVR Core Clock frequency: 8.000000 MHz
                  Memory model : Small
                  External RAM size : 0
                  Data Stack size : 256
                  ************************************************** ***/
                  #include <mega16a.h>
                  #include <delay.h>

                  #define ADC_VREF_TYPE 0x60
                  // Read the 8 most significant bits
                  // of the AD conversion result
                  unsigned char 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 ADCH;
                  }

                  #define led PORTB.0
                  #define max_var_PWM 100
                  unsigned char a = max_var_PWM;
                  unsigned char pwm[35];

                  // Timer 0 output compare interrupt service routine
                  interrupt [TIM0_COMP] void timer0_comp_isr(void)
                  {
                  if(a == pwm[1])led=1;
                  if(--a == 255)
                  {
                  a = max_var_PWM;
                  PORTB = 0;
                  }
                  }

                  void main(void)
                  {
                  unsigned char x;
                  //Config all
                  {
                  //Config PORTS
                  DDRB = 0xFF;

                  //Config timers
                  // Timer/Counter 0 initialization
                  // Clock source: System Clock
                  // Clock value: 1000.000 kHz
                  // Mode: CTC top=OCR0
                  // OC0 output: Disconnected
                  TCCR0=0x0A;
                  OCR0=150;
                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=0x02;
                  // Global enable interrupts
                  #asm("sei&quot

                  //Config ADC
                  // ADC initialization
                  // ADC Clock frequency: 62.500 kHz
                  // ADC Voltage Reference: AVCC pin
                  // ADC Auto Trigger Source: ADC Stopped
                  // Only the 8 most significant bits of
                  // the AD conversion result are used
                  ADMUX=ADC_VREF_TYPE & 0xff;
                  ADCSRA=0x87;
                  }
                  //End Config ......
                  while(1)
                  {
                  x = read_adc(0) / 2.55;
                  pwm[1] = x ;
                  delay_ms(50);
                  }
                  }
                  [/code]
                  توضیحات پایین هم بخوانید بهتر متوجه خواهید شد ...

                  نوشته اصلی توسط Mohammad_2007
                  با تشکر از دوستان عزیز و مخصوصا جناب مهندس اسدی که واقعا زحمت کشیدند
                  ممنون از ابراز لطفتون

                  نوشته اصلی توسط Mohammad_2007
                  تایپک رو کامل خوندم همه چیز اینجا خوب هست ، فقط کاش زحمت میکشیدید و روش کار با این کدهارو یاد میدادین که

                  -چطور باید باهاش کار کرد
                  اگر واقعا تنها یک بار با دقت کامل خوانده باشید خیلی راحت می توانید با آن کار کنید ...
                  دقیقا پست اول :
                  نوشته اصلی توسط سامان اسدی
                  ================================================== ==================
                  یک توضیح مختصر در مورد برنامه :
                  برنامه طوری طراحی شده که با استفاده از آرایه میتوانیم مقدار تک تک PWM ها را تغییر بدهیم
                  آرایه ای که []pwm نام دارد را میتوانید اندیس آن را برای PWM دلخواهتان تنظیم کنید
                  بازه مقدار آرایه PWM از 0 تا 99 است که نشانگر دیوتی سایکل است :biggrin:
                  این آرایه یه جورایی میشه گفت که مثل رجیستر عمل میکنه . یعنی اینکه تا مقدار به آن بدهیم PWM تنظیم میشود .
                  ================================================== ==================
                  من واقعا در تعجبم که چرا دوستان میگن که ما تاپیک رو خواندیم ولی یاد نگرفتیم !!!!

                  نوشته اصلی توسط Mohammad_2007
                  -چطور میشه افکت نوشت
                  اون دیگه مشکل از من نیست
                  خودتون باید برنامه نویسی رو خوب بلد بشوید و بدونید که اعداد رو چطوری جایگزین کنید و با اعداد چطوری بازی کنید... !!!

                  نوشته اصلی توسط Mohammad_2007
                  -چطور میشه تغییرات ایجاد کرد
                  http://www.eca.ir/forum2/index.php?topic=90246.msg604568#msg604568
                  این پست رو نگاه کن ...

                  نوشته اصلی توسط Mohammad_2007
                  -آیا میشه جوری کد رقص نور نوشت ک توی یک سری از جاها از این PWM استفاده کنیم و یک جاهایی نه؟
                  بله میشه
                  مثلا عدد بالاترین حد را به اسم مستعار روشن و عدد 0 را به اسم مستعار خاموش شدن تعریف کنید ...
                  توی زبان سی :
                  کد:
                  #define	on_LED	max_var_PWM
                  #define	off_LED	0
                  و در قسمت کد نویسی توی حلقه اصلی باید نوشت ...
                  کد:
                  while(1)
                  {
                  	pwm[1] = on_LED;
                  	delay_ms(500);
                  	pwm[1] = off_LED;
                  	delay_ms(500);
                  }
                  همین ...
                  حالا اگر خواستیم که به عنوان pwm استفاده کنیم ...
                  کد:
                  while(1)
                  {
                  	for(x=0;x<100;x++)
                  	{
                  		pwm[1] = x;
                  		delay_ms(10);	
                  	}
                  }
                  تنها کافی هست که به آرایه مورد نظر (مثلا [pwm[1 ) مقدار صفر تا 99 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

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

                  دیدگاه


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

                    ممنون ار پیگیریت سامان جان
                    ببین منظور من اینه
                    مثلا این افکت رو چطور باید توی برنامه شما بنویسم؟
                    درضمن نمیخوام خاموش داشته باشم میخوام جای خاموش شدن کم نور بشن ، مثلا 1/3 نور اصلی

                    کد:
                    for(i=1;i<=128;i*=2)
                    {
                    PORTB=i;
                    }
                    ممنون از لطفت

                    دیدگاه


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

                      نوشته اصلی توسط Mohammad_2007
                      ممنون ار پیگیریت سامان جان
                      ببین منظور من اینه
                      مثلا این افکت رو چطور باید توی برنامه شما بنویسم؟
                      درضمن نمیخوام خاموش داشته باشم میخوام جای خاموش شدن کم نور بشن ، مثلا 1/3 نور اصلی

                      کد:
                      for(i=1;i<=128;i*=2)
                      {
                      PORTB=i;
                      }
                      ممنون از لطفت
                      آهان ...
                      اینجوری سوال رو مطرح میکردی بهتر متوجه میشدم ...
                      دوستان عزیز دقت کنید که دیگه اینجا توی این برنامه نباید اینطور برنامه را نوشت چون به طور مداوم رجیستر PORTx در pwm در حال تغییر است ... بنابر این از این روش نباید پیش رفت ...
                      باید کاری کنیم که مقدار pwmها یکی پس از دیگری مقدار داده شود و مقدار قبلی صفر شود ...
                      بنابراین برنامه را باید به صورت کدهای زیر نوشت ...
                      کد:
                      for(x=1;x<9;x++)pwm[x]=0;
                      for(x=1;x<9;x++)
                      {
                      	pwm[x] = on_LED;
                      	delay_ms(500);
                      }
                      
                      ===================================
                      for(x=1;x<9;x++)pwm[x]=0;
                      for(x=8;x>0;x--)
                      {
                      	pwm[x] = on_LED;
                      	delay_ms(500);
                      }
                      
                      ===================================
                      for(x=1;x<9;x++)pwm[x]=0;
                      pwm[1] = on_LED;
                      for(x=1;x<8;x++)
                      {
                      	pwm[x+1] = pwm[x];
                      	pwm[x] = off_LED;
                      	delay_ms(500);
                      }
                      
                      ===================================
                      for(x=1;x<9;x++)pwm[x]=0;
                      pwm[8] = on_LED;
                      for(x=8;x>1;x--)
                      {
                      	pwm[x-1] = pwm[x];
                      	pwm[x] = off_LED;
                      	delay_ms(500);
                      }
                      برنامه ها را تک تک تحلیل میکنیم و به رفتارهای آنها می پردازیم ...
                      این تیکه از برنامه:
                      کد:
                      for(x=1;x<9;x++)pwm[x]=0;
                      for(x=1;x<9;x++)
                      {
                      	pwm[x] = on_LED;
                      	delay_ms(500);
                      }
                      رفتار :
                      کد:
                      pwm[1]=0
                      pwm[2]=0
                      pwm[3]=0
                      pwm[4]=0
                      pwm[5]=0
                      pwm[6]=0
                      pwm[7]=0
                      pwm[8]=0
                      --------
                      pwm[1]=on_LED
                      delay_ms(500)
                      pwm[2]=on_LED
                      delay_ms(500)
                      pwm[3]=on_LED
                      delay_ms(500)
                      pwm[4]=on_LED
                      delay_ms(500)
                      pwm[5]=on_LED
                      delay_ms(500)
                      pwm[6]=on_LED
                      delay_ms(500)
                      pwm[7]=on_LED
                      delay_ms(500)
                      pwm[8]=on_LED
                      delay_ms(500)
                      این تیکه از برنامه:
                      کد:
                      for(x=1;x<9;x++)pwm[x]=0;
                      for(x=8;x>0;x--)
                      {
                      	pwm[x] = on_LED;
                      	delay_ms(500);
                      }
                      رفتار :
                      کد:
                      pwm[1]=0
                      pwm[2]=0
                      pwm[3]=0
                      pwm[4]=0
                      pwm[5]=0
                      pwm[6]=0
                      pwm[7]=0
                      pwm[8]=0
                      --------
                      pwm[8]=on_LED
                      delay_ms(500)
                      pwm[7]=on_LED
                      delay_ms(500)
                      pwm[6]=on_LED
                      delay_ms(500)
                      pwm[5]=on_LED
                      delay_ms(500)
                      pwm[4]=on_LED
                      delay_ms(500)
                      pwm[3]=on_LED
                      delay_ms(500)
                      pwm[2]=on_LED
                      delay_ms(500)
                      pwm[1]=on_LED
                      delay_ms(500)
                      این تیکه از برنامه:
                      کد:
                      for(x=1;x<9;x++)pwm[x]=0;
                      pwm[1] = on_LED;
                      for(x=1;x<8;x++)
                      {
                      	pwm[x+1] = pwm[x];
                      	pwm[x] = off_LED;
                      	delay_ms(500);
                      }
                      رفتار :
                      کد:
                      pwm[1]=0
                      pwm[2]=0
                      pwm[3]=0
                      pwm[4]=0
                      pwm[5]=0
                      pwm[6]=0
                      pwm[7]=0
                      pwm[8]=0
                      --------
                      pwm[1]=on_LED
                      --------
                      pwm[2]=pwm[1]
                      pwm[1]=off_LED
                      delay_ms(500)
                      pwm[3]=pwm[2]
                      pwm[2]=off_LED
                      delay_ms(500)
                      pwm[4]=pwm[3]
                      pwm[3]=off_LED
                      delay_ms(500)
                      pwm[5]=pwm[4]
                      pwm[4]=off_LED
                      delay_ms(500)
                      pwm[6]=pwm[5]
                      pwm[5]=off_LED
                      delay_ms(500)
                      pwm[7]=pwm[6]
                      pwm[6]=off_LED
                      delay_ms(500)
                      pwm[8]=pwm[7]
                      pwm[7]=off_LED
                      delay_ms(500)
                      این تیکه از برنامه:
                      کد:
                      for(x=1;x<9;x++)pwm[x]=0;
                      pwm[8] = on_LED;
                      for(x=8;x>1;x--)
                      {
                      	pwm[x-1] = pwm[x];
                      	pwm[x] = off_LED;
                      	delay_ms(500);
                      }
                      رفتار :
                      کد:
                      pwm[1]=0
                      pwm[2]=0
                      pwm[3]=0
                      pwm[4]=0
                      pwm[5]=0
                      pwm[6]=0
                      pwm[7]=0
                      pwm[8]=0
                      --------
                      pwm[8]=on_LED
                      --------
                      pwm[7]=pwm[8]
                      pwm[8]=off_LED
                      delay_ms(500)
                      pwm[6]=pwm[7]
                      pwm[7]=off_LED
                      delay_ms(500)
                      pwm[5]=pwm[6]
                      pwm[6]=off_LED
                      delay_ms(500)
                      pwm[4]=pwm[5]
                      pwm[5]=off_LED
                      delay_ms(500)
                      pwm[3]=pwm[4]
                      pwm[4]=off_LED
                      delay_ms(500)
                      pwm[2]=pwm[3]
                      pwm[3]=off_LED
                      delay_ms(500)
                      pwm[1]=pwm[2]
                      pwm[2]=off_LED
                      delay_ms(500)
                      روی برنامه هایی که نوشتم خوب فکر کنید ... بسیار ساده است ولی با یه خورده تغییرات خاص میتوانید با همین تیکه های ساده افکتهای بسیار جالب تری ایجاد کنید ...

                      موفق باشید

                      اضافه شده در تاریخ :
                      نوشته اصلی توسط Mohammad_2007
                      درضمن نمیخوام خاموش داشته باشم میخوام جای خاموش شدن کم نور بشن ، مثلا 1/3 نور اصلی
                      ببخشید یه نکته یادم رفت بگم ...
                      اگر خواستید که خاموش نشود باید به جای off_LED از مقدار میانه PWM که تقریبا 50 میشود را مقدار دهی کنید که همین را میتوانید در بالا دیفاین کنید ...
                      یا اینکه هر مقداری که دلخواهتون هست آن را مقداردهی یا در قسمت بالا آن عدد مورد نظر را دیفاین و از آن در برنامه نویسی استفاده کنید ...

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

                      دیدگاه


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

                        نوشته اصلی توسط سامان اسدی
                        آهان ...
                        اینجوری سوال رو مطرح میکردی بهتر متوجه میشدم ...
                        دوستان عزیز دقت کنید که دیگه اینجا توی این برنامه نباید اینطور برنامه را نوشت چون به طور مداوم رجیستر PORTx در pwm در حال تغییر است ... بنابر این از این روش نباید پیش رفت ...
                        باید کاری کنیم که مقدار pwmها یکی پس از دیگری مقدار داده شود و مقدار قبلی صفر شود ...
                        بنابراین برنامه را باید به صورت کدهای زیر نوشت ...
                        کد:
                        for(x=1;x<9;x++)pwm[x]=0;
                        for(x=1;x<9;x++)
                        {
                        	pwm[x] = on_LED;
                        	delay_ms(500);
                        }
                        
                        ===================================
                        for(x=1;x<9;x++)pwm[x]=0;
                        for(x=8;x>0;x--)
                        {
                        	pwm[x] = on_LED;
                        	delay_ms(500);
                        }
                        
                        ===================================
                        for(x=1;x<9;x++)pwm[x]=0;
                        pwm[1] = on_LED;
                        for(x=1;x<8;x++)
                        {
                        	pwm[x+1] = pwm[x];
                        	pwm[x] = off_LED;
                        	delay_ms(500);
                        }
                        
                        ===================================
                        for(x=1;x<9;x++)pwm[x]=0;
                        pwm[8] = on_LED;
                        for(x=8;x>1;x--)
                        {
                        	pwm[x-1] = pwm[x];
                        	pwm[x] = off_LED;
                        	delay_ms(500);
                        }
                        برنامه ها را تک تک تحلیل میکنیم و به رفتارهای آنها می پردازیم ...
                        این تیکه از برنامه:
                        کد:
                        for(x=1;x<9;x++)pwm[x]=0;
                        for(x=1;x<9;x++)
                        {
                        	pwm[x] = on_LED;
                        	delay_ms(500);
                        }
                        رفتار :
                        کد:
                        pwm[1]=0
                        pwm[2]=0
                        pwm[3]=0
                        pwm[4]=0
                        pwm[5]=0
                        pwm[6]=0
                        pwm[7]=0
                        pwm[8]=0
                        --------
                        pwm[1]=on_LED
                        delay_ms(500)
                        pwm[2]=on_LED
                        delay_ms(500)
                        pwm[3]=on_LED
                        delay_ms(500)
                        pwm[4]=on_LED
                        delay_ms(500)
                        pwm[5]=on_LED
                        delay_ms(500)
                        pwm[6]=on_LED
                        delay_ms(500)
                        pwm[7]=on_LED
                        delay_ms(500)
                        pwm[8]=on_LED
                        delay_ms(500)
                        این تیکه از برنامه:
                        کد:
                        for(x=1;x<9;x++)pwm[x]=0;
                        for(x=8;x>0;x--)
                        {
                        	pwm[x] = on_LED;
                        	delay_ms(500);
                        }
                        رفتار :
                        کد:
                        pwm[1]=0
                        pwm[2]=0
                        pwm[3]=0
                        pwm[4]=0
                        pwm[5]=0
                        pwm[6]=0
                        pwm[7]=0
                        pwm[8]=0
                        --------
                        pwm[8]=on_LED
                        delay_ms(500)
                        pwm[7]=on_LED
                        delay_ms(500)
                        pwm[6]=on_LED
                        delay_ms(500)
                        pwm[5]=on_LED
                        delay_ms(500)
                        pwm[4]=on_LED
                        delay_ms(500)
                        pwm[3]=on_LED
                        delay_ms(500)
                        pwm[2]=on_LED
                        delay_ms(500)
                        pwm[1]=on_LED
                        delay_ms(500)
                        این تیکه از برنامه:
                        کد:
                        for(x=1;x<9;x++)pwm[x]=0;
                        pwm[1] = on_LED;
                        for(x=1;x<8;x++)
                        {
                        	pwm[x+1] = pwm[x];
                        	pwm[x] = off_LED;
                        	delay_ms(500);
                        }
                        رفتار :
                        کد:
                        pwm[1]=0
                        pwm[2]=0
                        pwm[3]=0
                        pwm[4]=0
                        pwm[5]=0
                        pwm[6]=0
                        pwm[7]=0
                        pwm[8]=0
                        --------
                        pwm[1]=on_LED
                        --------
                        pwm[2]=pwm[1]
                        pwm[1]=off_LED
                        delay_ms(500)
                        pwm[3]=pwm[2]
                        pwm[2]=off_LED
                        delay_ms(500)
                        pwm[4]=pwm[3]
                        pwm[3]=off_LED
                        delay_ms(500)
                        pwm[5]=pwm[4]
                        pwm[4]=off_LED
                        delay_ms(500)
                        pwm[6]=pwm[5]
                        pwm[5]=off_LED
                        delay_ms(500)
                        pwm[7]=pwm[6]
                        pwm[6]=off_LED
                        delay_ms(500)
                        pwm[8]=pwm[7]
                        pwm[7]=off_LED
                        delay_ms(500)
                        این تیکه از برنامه:
                        کد:
                        for(x=1;x<9;x++)pwm[x]=0;
                        pwm[8] = on_LED;
                        for(x=8;x>1;x--)
                        {
                        	pwm[x-1] = pwm[x];
                        	pwm[x] = off_LED;
                        	delay_ms(500);
                        }
                        رفتار :
                        کد:
                        pwm[1]=0
                        pwm[2]=0
                        pwm[3]=0
                        pwm[4]=0
                        pwm[5]=0
                        pwm[6]=0
                        pwm[7]=0
                        pwm[8]=0
                        --------
                        pwm[8]=on_LED
                        --------
                        pwm[7]=pwm[8]
                        pwm[8]=off_LED
                        delay_ms(500)
                        pwm[6]=pwm[7]
                        pwm[7]=off_LED
                        delay_ms(500)
                        pwm[5]=pwm[6]
                        pwm[6]=off_LED
                        delay_ms(500)
                        pwm[4]=pwm[5]
                        pwm[5]=off_LED
                        delay_ms(500)
                        pwm[3]=pwm[4]
                        pwm[4]=off_LED
                        delay_ms(500)
                        pwm[2]=pwm[3]
                        pwm[3]=off_LED
                        delay_ms(500)
                        pwm[1]=pwm[2]
                        pwm[2]=off_LED
                        delay_ms(500)
                        روی برنامه هایی که نوشتم خوب فکر کنید ... بسیار ساده است ولی با یه خورده تغییرات خاص میتوانید با همین تیکه های ساده افکتهای بسیار جالب تری ایجاد کنید ...

                        موفق باشید

                        اضافه شده در تاریخ : ببخشید یه نکته یادم رفت بگم ...
                        اگر خواستید که خاموش نشود باید به جای off_LED از مقدار میانه PWM که تقریبا 50 میشود را مقدار دهی کنید که همین را میتوانید در بالا دیفاین کنید ...
                        یا اینکه هر مقداری که دلخواهتون هست آن را مقداردهی یا در قسمت بالا آن عدد مورد نظر را دیفاین و از آن در برنامه نویسی استفاده کنید ...

                        موفق باشید
                        big likkkkkkkkkkkkkkkkkkkkkkkkkkkkke
                        http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                        دیدگاه


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

                          سلام


                          از کدوم ورژن کدویژن استفاده کنیم بهتر است؟

                          دیدگاه


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

                            سلام و درود،
                            جناب اسدی و دیگر دوستان صاحب نظر یک سوال فنی داشتم که در نظر همه احتمالا خیلی مشخص است و در چندین کتاب آموزشی نیز توسط اساتید به نام نمونه کدهای این بحث گفته شده که تماما غلط بود و جواب نادرست می داد. خواستم اگر پاسخی عملی (تست شده در سخت افزار یا شبیه ساز) دارید که مطمئن هستید جواب می دهد راهنمایی بفرمایید.
                            بنده قصد دارم توسط تایمر در ATmega32 یک زوج پالس ایجاد کنم به قرار شکل زیر:

                            این شکل موج بصورت پریودیک تکرار می شود. قصد دارم در کد تنظیمات جوری باشد که بتوانم مقادیر W,D1,D2,D3 را به دلخواه انتخاب کنم و البته دقت بالایی مدنظرم است. یعنی پهنای پالس ها در حدود دویست نانو ثانیه و D2 نیز در همین حدود چند صد نانو ثانیه باشد.
                            شاید بیش از دو سه ماه باشد که خودم و یکی از دوستانم مشغول سر و کله زدن با AVR هستیم اما جواب های عجیبی میگیریم. یا تاخیر ها بسیار زیاد است یا اصلا رفتار خروجی غیرقابل پیشبینی است. خلاصه عملا مایوس شدیم و تصمیم گرفتیم از روش ایجاد تاخیر در پورت های ورودی خروجی معمولی این پالس را ایجاد کنیم که البته مشکلات دیگری بوجود می آورد. در هر حال از دوستان اگر کسی راهنمایی عملی داشت ممنون می شوم بفرماید.

                            دیدگاه


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

                              نوشته اصلی توسط soltanfarid
                              سلام


                              از کدوم ورژن کدویژن استفاده کنیم بهتر است؟
                              3.12
                              http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                              دیدگاه


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

                                نوشته اصلی توسط سامان اسدی
                                آهان ...
                                اینجوری سوال رو مطرح میکردی بهتر متوجه میشدم ...
                                دوستان عزیز دقت کنید که دیگه اینجا توی این برنامه نباید اینطور برنامه را نوشت چون به طور مداوم رجیستر PORTx در pwm در حال تغییر است ... بنابر این از این روش نباید پیش رفت ...
                                باید کاری کنیم که مقدار pwmها یکی پس از دیگری مقدار داده شود و مقدار قبلی صفر شود ...
                                بنابراین برنامه را باید به صورت کدهای زیر نوشت ...
                                کد:
                                for(x=1;x<9;x++)pwm[x]=0;
                                for(x=1;x<9;x++)
                                {
                                	pwm[x] = on_LED;
                                	delay_ms(500);
                                }
                                
                                ===================================
                                for(x=1;x<9;x++)pwm[x]=0;
                                for(x=8;x>0;x--)
                                {
                                	pwm[x] = on_LED;
                                	delay_ms(500);
                                }
                                
                                ===================================
                                for(x=1;x<9;x++)pwm[x]=0;
                                pwm[1] = on_LED;
                                for(x=1;x<8;x++)
                                {
                                	pwm[x+1] = pwm[x];
                                	pwm[x] = off_LED;
                                	delay_ms(500);
                                }
                                
                                ===================================
                                for(x=1;x<9;x++)pwm[x]=0;
                                pwm[8] = on_LED;
                                for(x=8;x>1;x--)
                                {
                                	pwm[x-1] = pwm[x];
                                	pwm[x] = off_LED;
                                	delay_ms(500);
                                }
                                برنامه ها را تک تک تحلیل میکنیم و به رفتارهای آنها می پردازیم ...
                                این تیکه از برنامه:
                                کد:
                                for(x=1;x<9;x++)pwm[x]=0;
                                for(x=1;x<9;x++)
                                {
                                	pwm[x] = on_LED;
                                	delay_ms(500);
                                }
                                رفتار :
                                کد:
                                pwm[1]=0
                                pwm[2]=0
                                pwm[3]=0
                                pwm[4]=0
                                pwm[5]=0
                                pwm[6]=0
                                pwm[7]=0
                                pwm[8]=0
                                --------
                                pwm[1]=on_LED
                                delay_ms(500)
                                pwm[2]=on_LED
                                delay_ms(500)
                                pwm[3]=on_LED
                                delay_ms(500)
                                pwm[4]=on_LED
                                delay_ms(500)
                                pwm[5]=on_LED
                                delay_ms(500)
                                pwm[6]=on_LED
                                delay_ms(500)
                                pwm[7]=on_LED
                                delay_ms(500)
                                pwm[8]=on_LED
                                delay_ms(500)
                                این تیکه از برنامه:
                                کد:
                                for(x=1;x<9;x++)pwm[x]=0;
                                for(x=8;x>0;x--)
                                {
                                	pwm[x] = on_LED;
                                	delay_ms(500);
                                }
                                رفتار :
                                کد:
                                pwm[1]=0
                                pwm[2]=0
                                pwm[3]=0
                                pwm[4]=0
                                pwm[5]=0
                                pwm[6]=0
                                pwm[7]=0
                                pwm[8]=0
                                --------
                                pwm[8]=on_LED
                                delay_ms(500)
                                pwm[7]=on_LED
                                delay_ms(500)
                                pwm[6]=on_LED
                                delay_ms(500)
                                pwm[5]=on_LED
                                delay_ms(500)
                                pwm[4]=on_LED
                                delay_ms(500)
                                pwm[3]=on_LED
                                delay_ms(500)
                                pwm[2]=on_LED
                                delay_ms(500)
                                pwm[1]=on_LED
                                delay_ms(500)
                                این تیکه از برنامه:
                                کد:
                                for(x=1;x<9;x++)pwm[x]=0;
                                pwm[1] = on_LED;
                                for(x=1;x<8;x++)
                                {
                                	pwm[x+1] = pwm[x];
                                	pwm[x] = off_LED;
                                	delay_ms(500);
                                }
                                رفتار :
                                کد:
                                pwm[1]=0
                                pwm[2]=0
                                pwm[3]=0
                                pwm[4]=0
                                pwm[5]=0
                                pwm[6]=0
                                pwm[7]=0
                                pwm[8]=0
                                --------
                                pwm[1]=on_LED
                                --------
                                pwm[2]=pwm[1]
                                pwm[1]=off_LED
                                delay_ms(500)
                                pwm[3]=pwm[2]
                                pwm[2]=off_LED
                                delay_ms(500)
                                pwm[4]=pwm[3]
                                pwm[3]=off_LED
                                delay_ms(500)
                                pwm[5]=pwm[4]
                                pwm[4]=off_LED
                                delay_ms(500)
                                pwm[6]=pwm[5]
                                pwm[5]=off_LED
                                delay_ms(500)
                                pwm[7]=pwm[6]
                                pwm[6]=off_LED
                                delay_ms(500)
                                pwm[8]=pwm[7]
                                pwm[7]=off_LED
                                delay_ms(500)
                                این تیکه از برنامه:
                                کد:
                                for(x=1;x<9;x++)pwm[x]=0;
                                pwm[8] = on_LED;
                                for(x=8;x>1;x--)
                                {
                                	pwm[x-1] = pwm[x];
                                	pwm[x] = off_LED;
                                	delay_ms(500);
                                }
                                رفتار :
                                کد:
                                pwm[1]=0
                                pwm[2]=0
                                pwm[3]=0
                                pwm[4]=0
                                pwm[5]=0
                                pwm[6]=0
                                pwm[7]=0
                                pwm[8]=0
                                --------
                                pwm[8]=on_LED
                                --------
                                pwm[7]=pwm[8]
                                pwm[8]=off_LED
                                delay_ms(500)
                                pwm[6]=pwm[7]
                                pwm[7]=off_LED
                                delay_ms(500)
                                pwm[5]=pwm[6]
                                pwm[6]=off_LED
                                delay_ms(500)
                                pwm[4]=pwm[5]
                                pwm[5]=off_LED
                                delay_ms(500)
                                pwm[3]=pwm[4]
                                pwm[4]=off_LED
                                delay_ms(500)
                                pwm[2]=pwm[3]
                                pwm[3]=off_LED
                                delay_ms(500)
                                pwm[1]=pwm[2]
                                pwm[2]=off_LED
                                delay_ms(500)
                                روی برنامه هایی که نوشتم خوب فکر کنید ... بسیار ساده است ولی با یه خورده تغییرات خاص میتوانید با همین تیکه های ساده افکتهای بسیار جالب تری ایجاد کنید ...

                                موفق باشید

                                اضافه شده در تاریخ : ببخشید یه نکته یادم رفت بگم ...
                                اگر خواستید که خاموش نشود باید به جای off_LED از مقدار میانه PWM که تقریبا 50 میشود را مقدار دهی کنید که همین را میتوانید در بالا دیفاین کنید ...
                                یا اینکه هر مقداری که دلخواهتون هست آن را مقداردهی یا در قسمت بالا آن عدد مورد نظر را دیفاین و از آن در برنامه نویسی استفاده کنید ...

                                موفق باشید


                                گذاشتن تاخیر در حد میلی ثانیه ، تایمر را به هم نمیزند؟؟

                                اضافه شده در تاریخ :
                                نوشته اصلی توسط سامان اسدی
                                درود بر دوستاندوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از ADC بخوانید و عدد را مساوی با 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 : 32-channel PWM (Rain LED)
                                Version : 2.1
                                Date : 2/27/2014
                                Author : Saman.Asadi
                                www.ECA.ir
                                Chip type : ATmega16
                                Program type : Application
                                AVR Core Clock frequency: 8.000000 MHz
                                Memory model : Small
                                External RAM size : 0
                                Data Stack size : 256
                                ************************************************** ***/
                                #include <mega16a.h>
                                #include <delay.h>

                                #define ADC_VREF_TYPE 0x60
                                // Read the 8 most significant bits
                                // of the AD conversion result
                                unsigned char 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 ADCH;
                                }

                                #define led PORTB.0
                                #define max_var_PWM 100
                                unsigned char a = max_var_PWM;
                                unsigned char pwm[35];

                                // Timer 0 output compare interrupt service routine
                                interrupt [TIM0_COMP] void timer0_comp_isr(void)
                                {
                                if(a == pwm[1])led=1;
                                if(--a == 255)
                                {
                                a = max_var_PWM;
                                PORTB = 0;
                                }
                                }

                                void main(void)
                                {
                                unsigned char x;
                                //Config all
                                {
                                //Config PORTS
                                DDRB = 0xFF;

                                //Config timers
                                // Timer/Counter 0 initialization
                                // Clock source: System Clock
                                // Clock value: 1000.000 kHz
                                // Mode: CTC top=OCR0
                                // OC0 output: Disconnected
                                TCCR0=0x0A;
                                OCR0=150;
                                // Timer(s)/Counter(s) Interrupt(s) initialization
                                TIMSK=0x02;
                                // Global enable interrupts
                                #asm("sei&quot

                                //Config ADC
                                // ADC initialization
                                // ADC Clock frequency: 62.500 kHz
                                // ADC Voltage Reference: AVCC pin
                                // ADC Auto Trigger Source: ADC Stopped
                                // Only the 8 most significant bits of
                                // the AD conversion result are used
                                ADMUX=ADC_VREF_TYPE & 0xff;
                                ADCSRA=0x87;
                                }
                                //End Config ......
                                while(1)
                                {
                                x = read_adc(0) / 2.55;
                                pwm[1] = x ;
                                delay_ms(50);
                                }
                                }
                                [/code]
                                توضیحات پایین هم بخوانید بهتر متوجه خواهید شد ...
                                ممنون از ابراز لطفتون
                                اگر واقعا تنها یک بار با دقت کامل خوانده باشید خیلی راحت می توانید با آن کار کنید ...
                                دقیقا پست اول :من واقعا در تعجبم که چرا دوستان میگن که ما تاپیک رو خواندیم ولی یاد نگرفتیم !!!!
                                اون دیگه مشکل از من نیست
                                خودتون باید برنامه نویسی رو خوب بلد بشوید و بدونید که اعداد رو چطوری جایگزین کنید و با اعداد چطوری بازی کنید... !!!
                                http://www.eca.ir/forum2/index.php?topic=90246.msg604568#msg604568
                                این پست رو نگاه کن ...
                                بله میشه
                                مثلا عدد بالاترین حد را به اسم مستعار روشن و عدد 0 را به اسم مستعار خاموش شدن تعریف کنید ...
                                توی زبان سی :
                                کد:
                                #define	on_LED	max_var_PWM
                                #define	off_LED	0
                                و در قسمت کد نویسی توی حلقه اصلی باید نوشت ...
                                کد:
                                while(1)
                                {
                                	pwm[1] = on_LED;
                                	delay_ms(500);
                                	pwm[1] = off_LED;
                                	delay_ms(500);
                                }
                                همین ...
                                حالا اگر خواستیم که به عنوان pwm استفاده کنیم ...
                                کد:
                                while(1)
                                {
                                	for(x=0;x<100;x++)
                                	{
                                		pwm[1] = x;
                                		delay_ms(10);	
                                	}
                                }
                                تنها کافی هست که به آرایه مورد نظر (مثلا [pwm[1 ) مقدار صفر تا 99 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

                                موفق باشید

                                اگر بخاهیم مقدار یک پین را به پین دیگری شیفت دهیم با تاخیری چه کار باید کرد؟؟

                                دیدگاه

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