اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    این شکل موج بصورت پریودیک تکرار می شود. قصد دارم در کد تنظیمات جوری باشد که بتوانم مقادیر W,D1,D2,D3 را به دلخواه انتخاب کنم و البته دقت بالایی مدنظرم است. یعنی پهنای پالس ها در حدود دویست نانو ثانیه و D2 نیز در همین حدود چند صد نانو ثانیه باشد.
    شاید بیش از دو سه ماه باشد که خودم و یکی از دوستانم مشغول سر و کله زدن با AVR هستیم اما جواب های عجیبی میگیریم. یا تاخیر ها بسیار زیاد است یا اصلا رفتار خروجی غیرقابل پیشبینی است. خلاصه عملا مایوس شدیم و تصمیم گرفتیم از روش ایجاد تاخیر در پورت های ورودی خروجی معمولی این پالس را ایجاد کنیم که البته مشکلات دیگری بوجود می آورد. در هر حال از دوستان اگر کسی راهنمایی عملی داشت ممنون می شوم بفرماید.
    کاش یه تاپیک جدید میزدید تا بحث تاپیک pwm منحرف نشه .
    شما با avr اگه کلاک خارجی 16 مگ بزارید و تقسیم بر n تایمر رو طوری بزارید که با فرکانس cpu هم کلاک باشه ( تقسیم بر 1 ) هر پالس معرف 65 نانو ثانیه است . بنابراین رسیدن به دقت مورد نظر شما بعید به نظر میرسه. چون به خاطر شکل موجتون حالت سخت افزاری نمیشه و حتما باید نرم افزاری ( حتی تو زیر روال وقفه تایمر ) پیاده بشه .
    اتفاقا رفتار خروجی کاملا مشخصه . فصل تایمر رو از کتاب جناب سپاسیار بخونید تا با ریزه کاری های تایمر ( مثل glitch ) بیشتر اشنا بشید .
    إِنَّ الَّذِینَ یُحِبُّونَ أَنْ تَشِیعَ الْفاحِشَهُ فِی الَّذِینَ آمَنُوا لَهُمْ عَذابٌ أَلِیمٌ فِی الدُّنْیا وَ الْآخِرَهِ وَ اللَّهُ یَعْلَمُ وَ أَنْتُمْ لا تَعْلَمُونَ.
    کسانى که دوست دارند زشتی ها در میان مردم با ایمان شیوع یابد عذاب دردناکى براى آنها در دنیا و آخرت است، و خداوند میداند و شما نمی‏دانید. (نور19)

    دیدگاه


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

      نوشته اصلی توسط سامان اسدی
      درود بر دوستاندوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از 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 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

      موفق باشید
      چرا آرایه pwm را سی وپنج تایی اتخاب کردیم؟

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

      کد:
      if(a == pwm[1])led=1;
      برای بار اول که اجرا میشه a=100 هست چطور خودشو تنظیم میکنه با pwm??

      دیدگاه


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

        نوشته اصلی توسط " سید محمد "
        کاش یه تاپیک جدید میزدید تا بحث تاپیک pwm منحرف نشه .
        شما با avr اگه کلاک خارجی بزارید و تقسیم بر n تایمر رو پوری بزارید که با فرکانس cpu هم کلاک باشه ( تقسیم بر 1 ) هر پالس معرف 65 نانو ثانیه است .
        اتفاقا رفتار خروجی کاملا مشخصه . فصل تایمر رو از کتاب جناب سپاسیار بخونید تا با ریزه کاری های تایمر ( مثل glitch ) بیشتر اشنا بشید .
        با توجه به اینکه بحث های گوناگونی مرتبط با تایمر در این تاپیک مطرح شده بود و ایجاد این نوع پالس هم خودش از روشهای مختلف مثل PWM میتونه ایجاد بشه به نظرم رسید در این تاپیک مطرح کنم سوال رو بهتر باشه. خیلی متوجه راه حل شما نشدم!؟ با منبع خارجی پالس ایجاد کنم یعنی؟ خب استفاده از منابع خارجی که کلا صورت مسئله رو یک چیز دیگه میکنه من قصدم هست بدون استفاده از منابع خارجی حتی المقدور این کار رو انجام بدم. تقریبا شش هفت کتاب مختلف آموزش AVR دارم که هیچکدام بدرد نمی خوره و فقط برای کار های معمولی راه انداختن جواب داره حالا این کتابی هم که فرمودید میگردم امیدوارم چیز قابل توجهی گفته باشه چون تا به حال که جز این بوده

        دیدگاه


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

          نوشته اصلی توسط soltanfarid
          گذاشتن تاخیر در حد میلی ثانیه ، تایمر را به هم نمیزند؟؟
          خیر ... به شرطی که تاخیر در حلقه اصلی برنامه باشد و نه در زیر برنامه تایمر ...

          نوشته اصلی توسط soltanfarid
          اگر بخاهیم مقدار یک پین را به پین دیگری شیفت دهیم با تاخیری چه کار باید کرد؟؟
          کد:
          for(x=2;x<9;x++)
          {
          	pwm[x-1] = pwm[x];
          	delay_ms(100);
          }
          
          for(x=8;x>1;x++)
          {
          	pwm[x] = pwm[x-1];
          	delay_ms(100);
          }
          نوشته اصلی توسط soltanfarid
          چرا آرایه pwm را سی وپنج تایی اتخاب کردیم؟
          مساله ای نداره ....
          شما همون رو بسته به نیازتون کمترش کنید ...

          نوشته اصلی توسط soltanfarid
          با یه تیکه کد کنار نمیام
          کد:
          if(a == pwm[1])led=1;
          برای بار اول که اجرا میشه a=100 هست چطور خودشو تنظیم میکنه با pwm??
          دوست عزیز شاید بعضی مواقع لازم نباشه خود سورس برنامه را تجزیه و تحلیل کنیم ...
          و شاید لازم باشه که تنها کار کردن با آن را یاد بگیریم ...
          شما برنامه رو از همون پست دوم کپی کنید و تنها کافیه که با انتخاب متغیر pwm و اندیس آرایه PWMها را تغییر بدهیم ...
          همین ...

          نوشته اصلی توسط arsin
          با توجه به اینکه بحث های گوناگونی مرتبط با تایمر در این تاپیک مطرح شده بود و ایجاد این نوع پالس هم خودش از روشهای مختلف مثل PWM میتونه ایجاد بشه به نظرم رسید در این تاپیک مطرح کنم سوال رو بهتر باشه. خیلی متوجه راه حل شما نشدم!؟ با منبع خارجی پالس ایجاد کنم یعنی؟ خب استفاده از منابع خارجی که کلا صورت مسئله رو یک چیز دیگه میکنه من قصدم هست بدون استفاده از منابع خارجی حتی المقدور این کار رو انجام بدم. تقریبا شش هفت کتاب مختلف آموزش AVR دارم که هیچکدام بدرد نمی خوره و فقط برای کار های معمولی راه انداختن جواب داره حالا این کتابی هم که فرمودید میگردم امیدوارم چیز قابل توجهی گفته باشه چون تا به حال که جز این بوده
          دوست عزیز شما پالسهایی نیاز دارید که در حد 200 نانویی ایجاد بشه ...
          بهتر این است که با میکروهای Xmega و ARM کار کنید ... چون سرعت آنها بسیار بالاتر است ...
          تازه فکر کنم که Xmega هم نتواند این کار را کند ...
          و تنها میکرویی که میتواند به داد شما برسد ARM است نه AVR ...

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

          دیدگاه


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

            نوشته اصلی توسط سامان اسدی
            درود بر دوستاندوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از 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 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

            موفق باشید
            سلام

            ممنون برای برنامه مهندس اسدی
            وقتی این برنامه را پیاده سازی میکنم به صورت چشمک زن در می آید

            دیدگاه


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

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

              ممنون برای برنامه مهندس اسدی
              وقتی این برنامه را پیاده سازی میکنم به صورت چشمک زن در می آید
              سرعت کلاک و تنظیم فیرزبیتها رو دقت کن
              http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

              دیدگاه


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

                نوشته اصلی توسط MAHDI ZAMANI
                سرعت کلاک و تنظیم فیرزبیتها رو دقت کن
                سلام

                گذاشتم روی 8 مگاهرتز داخلی ولی دیگه پروگرم نمیشه میکرو یعنی باید میکرو عوض کنم؟

                دیدگاه


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

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

                  گذاشتم روی 8 مگاهرتز داخلی ولی دیگه پروگرم نمیشه میکرو یعنی باید میکرو عوض کنم؟
                  سلام
                  برنامه خودتون رو بگذارید تا ببینم ...
                  به گمانم فیوزبیتها رو اشتباهی تنظیم کردی
                  CKSEL0=0
                  CKSEL1=0
                  CKSEL2=1
                  CKSEL3=0

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

                  دیدگاه


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

                    نوشته اصلی توسط سامان اسدی
                    سلام
                    برنامه خودتون رو بگذارید تا ببینم ...
                    به گمانم فیوزبیتها رو اشتباهی تنظیم کردی
                    CKSEL0=0
                    CKSEL1=0
                    CKSEL2=1
                    CKSEL3=0

                    موفق باشید
                    سلام مهندس

                    دقیقا همین شکلی پروگرم کردم

                    با کمک پتانسیو متر روی پین صفر پورت شش pdm می اندازد

                    کد:
                    /*****************************************************
                    This program was produced by the
                    CodeWizardAVR V1.25.8 Professional
                    Automatic Program Generator
                    © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
                    http://www.hpinfotech.com
                    
                    Project : 
                    Version : 
                    Date  : 5/11/2015
                    Author : F4CG              
                    Company : F4CG              
                    Comments: 
                    
                    
                    Chip type      : ATmega8
                    Program type    : Application
                    Clock frequency   : 1.000000 MHz
                    Memory model    : Small
                    External SRAM size : 0
                    Data Stack size   : 256
                    *****************************************************/
                    
                    #include <mega8.h> 
                    #include <delay.h> 
                    #define ADC_VREF_TYPE 0x60 
                    
                    unsigned char data,sata;
                    
                    
                    
                    
                     unsigned int 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;
                    }
                    
                    // Timer 0 overflow interrupt service routine
                    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                    {  
                       
                     
                       if(PIND.6==1)
                         { 
                            PORTD.6=0; 
                            
                          
                           
                          
                            TCNT0=sata;
                          }
                        if(PIND.6==0)
                         { 
                          
                          PORTD.6=1; 
                          
                         
                        
                          TCNT0=data;
                          
                          } 
                    
                    // Place your code here
                    
                    }
                    
                    
                    
                     
                    
                    
                    
                    
                    
                    // Read the AD conversion result
                    
                    
                    // Declare your global variables here
                    
                    
                    void main(void)
                    {
                    // Declare your local variables here
                    
                    // Input/Output Ports initialization
                    // Port B initialization
                    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTB=0x00;
                    DDRB=0x00;
                    
                    // Port C initialization
                    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTC=0x00;
                    DDRC=0x00;
                    
                    // Port D initialization
                    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTD=0x00;
                    DDRD=0xFF;
                    
                    // Timer/Counter 0 initialization
                    // Clock source: System Clock
                    // Clock value: 1000.000 kHz
                    TCCR0=0x02;
                    TCNT0=0x00;
                    
                    // Timer/Counter 1 initialization
                    // Clock source: System Clock
                    // Clock value: Timer 1 Stopped
                    // Mode: Normal top=FFFFh
                    // OC1A output: Discon.
                    // OC1B output: Discon.
                    // Noise Canceler: Off
                    // Input Capture on Falling Edge
                    // Timer 1 Overflow Interrupt: Off
                    // Input Capture Interrupt: Off
                    // Compare A Match Interrupt: Off
                    // Compare B Match Interrupt: Off
                    TCCR1A=0x00;
                    TCCR1B=0x00;
                    TCNT1H=0x00;
                    TCNT1L=0x00;
                    ICR1H=0x00;
                    ICR1L=0x00;
                    OCR1AH=0x00;
                    OCR1AL=0x00;
                    OCR1BH=0x00;
                    OCR1BL=0x00;
                    
                    // Timer/Counter 2 initialization
                    // Clock source: System Clock
                    // Clock value: Timer 2 Stopped
                    // Mode: Normal top=FFh
                    // OC2 output: Disconnected
                    ASSR=0x00;
                    TCCR2=0x00;
                    TCNT2=0x00;
                    OCR2=0x00;
                    
                    // External Interrupt(s) initialization
                    // INT0: Off
                    // INT1: Off
                    MCUCR=0x00;
                    
                    // Timer(s)/Counter(s) Interrupt(s) initialization
                    TIMSK=0x01;
                    
                    // Analog Comparator initialization
                    // Analog Comparator: Off
                    // Analog Comparator Input Capture by Timer/Counter 1: Off
                    ACSR=0x80;
                    SFIOR=0x00;
                    
                    // ADC initialization
                    // ADC Clock frequency: 500.000 kHz
                    // ADC Voltage Reference: AVCC pin
                    ADMUX=ADC_VREF_TYPE & 0xff;
                    ADCSRA=0x82;
                    
                    // Global enable interrupts
                    #asm("sei")
                    
                    while (1)
                       { 
                        
                       data=read_adc(0);
                      sata=256-data; 
                      
                       
                       
                      
                       
                        
                        
                          
                       // Place your code here
                    
                       };
                    }

                    دیدگاه


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

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

                      دقیقا همین شکلی پروگرم کردم

                      با کمک پتانسیو متر روی پین صفر پورت شش pdm می اندازد

                      کد:
                      /*****************************************************
                      This program was produced by the
                      CodeWizardAVR V1.25.8 Professional
                      Automatic Program Generator
                      © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
                      http://www.hpinfotech.com
                      
                      Project : 
                      Version : 
                      Date  : 5/11/2015
                      Author : F4CG              
                      Company : F4CG              
                      Comments: 
                      
                      
                      Chip type      : ATmega8
                      Program type    : Application
                      Clock frequency   : 1.000000 MHz
                      Memory model    : Small
                      External SRAM size : 0
                      Data Stack size   : 256
                      *****************************************************/
                      
                      #include <mega8.h> 
                      #include <delay.h> 
                      #define ADC_VREF_TYPE 0x60 
                      
                      unsigned char data,sata;
                      
                      
                      
                      
                       unsigned int 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;
                      }
                      
                      // Timer 0 overflow interrupt service routine
                      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                      {  
                         
                       
                         if(PIND.6==1)
                           { 
                              PORTD.6=0; 
                              
                            
                             
                            
                              TCNT0=sata;
                            }
                          if(PIND.6==0)
                           { 
                            
                            PORTD.6=1; 
                            
                           
                          
                            TCNT0=data;
                            
                            } 
                      
                      // Place your code here
                      
                      }
                      
                      
                      
                       
                      
                      
                      
                      
                      
                      // Read the AD conversion result
                      
                      
                      // Declare your global variables here
                      
                      
                      void main(void)
                      {
                      // Declare your local variables here
                      
                      // Input/Output Ports initialization
                      // Port B initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                      PORTB=0x00;
                      DDRB=0x00;
                      
                      // Port C initialization
                      // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                      // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                      PORTC=0x00;
                      DDRC=0x00;
                      
                      // Port D initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                      PORTD=0x00;
                      DDRD=0xFF;
                      
                      // Timer/Counter 0 initialization
                      // Clock source: System Clock
                      // Clock value: 1000.000 kHz
                      TCCR0=0x02;
                      TCNT0=0x00;
                      
                      // Timer/Counter 1 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 1 Stopped
                      // Mode: Normal top=FFFFh
                      // OC1A output: Discon.
                      // OC1B output: Discon.
                      // Noise Canceler: Off
                      // Input Capture on Falling Edge
                      // Timer 1 Overflow Interrupt: Off
                      // Input Capture Interrupt: Off
                      // Compare A Match Interrupt: Off
                      // Compare B Match Interrupt: Off
                      TCCR1A=0x00;
                      TCCR1B=0x00;
                      TCNT1H=0x00;
                      TCNT1L=0x00;
                      ICR1H=0x00;
                      ICR1L=0x00;
                      OCR1AH=0x00;
                      OCR1AL=0x00;
                      OCR1BH=0x00;
                      OCR1BL=0x00;
                      
                      // Timer/Counter 2 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 2 Stopped
                      // Mode: Normal top=FFh
                      // OC2 output: Disconnected
                      ASSR=0x00;
                      TCCR2=0x00;
                      TCNT2=0x00;
                      OCR2=0x00;
                      
                      // External Interrupt(s) initialization
                      // INT0: Off
                      // INT1: Off
                      MCUCR=0x00;
                      
                      // Timer(s)/Counter(s) Interrupt(s) initialization
                      TIMSK=0x01;
                      
                      // Analog Comparator initialization
                      // Analog Comparator: Off
                      // Analog Comparator Input Capture by Timer/Counter 1: Off
                      ACSR=0x80;
                      SFIOR=0x00;
                      
                      // ADC initialization
                      // ADC Clock frequency: 500.000 kHz
                      // ADC Voltage Reference: AVCC pin
                      ADMUX=ADC_VREF_TYPE & 0xff;
                      ADCSRA=0x82;
                      
                      // Global enable interrupts
                      #asm("sei")
                      
                      while (1)
                         { 
                          
                         data=read_adc(0);
                        sata=256-data; 
                        
                         
                         
                        
                         
                          
                          
                            
                         // Place your code here
                      
                         };
                      }
                      سلام
                      این که برنامه من نیست ...
                      الان چه کمکی میتونم بکنم؟
                      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                      معرفی نرم افزار Codewizard PWM
                      با من بیشتر آشنا شوید

                      دیدگاه


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

                        نوشته اصلی توسط سامان اسدی
                        سلام
                        این که برنامه من نیست ...
                        الان چه کمکی میتونم بکنم؟
                        تو این برنامه که نوشتم چه طور میتونم تاخیر بندازم مثلا همین پین علاوه بر کنترل روشنایی بتوان چشمک زن بشود ؟

                        دیدگاه


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

                          نوشته اصلی توسط سامان اسدی
                          سلام
                          این که برنامه من نیست ...
                          الان چه کمکی میتونم بکنم؟
                          سلام

                          برنامه شما با اندکی تغییر

                          کد:
                          /*****************************************************
                          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 <mega8.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 PORTD.7
                          #define max_var_PWM 100
                          unsigned char a = max_var_PWM;
                          unsigned char pwm[35];
                           
                          // Timer 0 output compare interrupt service routine
                          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                          { 
                              
                           
                            if(a == pwm[1])led=1;
                            if(--a == 255)
                            {
                              a = max_var_PWM;
                              PORTD = 0;  
                              
                              
                            }
                            
                                 
                                 
                            
                                 
                                 
                          }
                           
                          void main(void)
                          {
                            unsigned char x;
                            //Config all
                            {    
                              //Config PORTS
                              DDRD = 0xFF;
                              
                              //Config timers
                              // Timer/Counter 0 initialization
                              // Clock source: System Clock
                              // Clock value: 1000.000 kHz
                              // Mode: CTC top=OCR0
                              // OC0 output: Disconnected
                              TCCR0=0x02;
                              TCNT0=150;   
                              // Timer(s)/Counter(s) Interrupt(s) initialization
                              TIMSK=0x01;
                              // Global enable interrupts
                              #asm("sei")
                              
                              //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); 
                              
                              
                              
                                
                            }
                          }

                          دیدگاه


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

                            نوشته اصلی توسط soltanfarid
                            تو این برنامه که نوشتم چه طور میتونم تاخیر بندازم مثلا همین پین علاوه بر کنترل روشنایی بتوان چشمک زن بشود ؟
                            برنامه شما با اندکی تغییر

                            کد:
                            /*****************************************************
                            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 <mega8.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 PORTD.7
                            #define max_var_PWM 100
                            unsigned char a = max_var_PWM;
                            unsigned char pwm[35];
                             
                            // Timer 0 output compare interrupt service routine
                            interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                            { 
                                
                             
                              if(a == pwm[1])led=1;
                              if(--a == 255)
                              {
                                a = max_var_PWM;
                                PORTD = 0;  
                                
                                
                              }
                              
                                   
                                   
                              
                                   
                                   
                            }
                             
                            void main(void)
                            {
                              unsigned char x;
                              //Config all
                              {    
                                //Config PORTS
                                DDRD = 0xFF;
                                
                                //Config timers
                                // Timer/Counter 0 initialization
                                // Clock source: System Clock
                                // Clock value: 1000.000 kHz
                                // Mode: CTC top=OCR0
                                // OC0 output: Disconnected
                                TCCR0=0x02;
                                TCNT0=150;   
                                // Timer(s)/Counter(s) Interrupt(s) initialization
                                TIMSK=0x01;
                                // Global enable interrupts
                                #asm("sei")
                                
                                //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); 
                                
                                
                                
                                  
                              }
                            }
                            سلام
                            ببخشید دیر پاسخ میدم ...

                            توی این لینک دقیقا همین سوال شده و پاسخ هم دادم
                            http://www.eca.ir/forum2/index.php?topic=90246.msg706110#msg706110

                            دوستان عزیز تورو خدا تاپیک رو مطالعه کنید ...
                            خواهشااااا ....
                            ممنون از همکاریتون


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

                            دیدگاه


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

                              با سلام

                              تعداد مطالب زیاده. اگه امکانش هست یه خلاصه و بلوک دیاگرام از روش pwm کردن همه پایه های Avr رو ذکر کنید.

                              با تشکر

                              دیدگاه


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

                                نوشته اصلی توسط cortex-m3
                                با سلام

                                تعداد مطالب زیاده. اگه امکانش هست یه خلاصه و بلوک دیاگرام از روش pwm کردن همه پایه های Avr رو ذکر کنید.

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

                                نوشته اصلی توسط سامان اسدی
                                یک توضیح مختصر در مورد برنامه :
                                برنامه طوری طراحی شده که با استفاده از آرایه میتوانیم مقدار تک تک PWM ها را تغییر بدهیم
                                آرایه ای که []pwm نام دارد را میتوانید اندیس آن را برای PWM دلخواهتان تنظیم کنید
                                بازه مقدار آرایه PWM از 0 تا 99 است که نشانگر دیوتی سایکل است :biggrin:
                                این آرایه یه جورایی میشه گفت که مثل رجیستر عمل میکنه . یعنی اینکه تا مقدار به آن بدهیم PWM تنظیم میشود .
                                برنامه را کپی کنید و به آرایه pwm و اندیس مورد نظر مقدار بدهید ...
                                همین ...
                                موفق باشید
                                [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                                معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                                معرفی نرم افزار Codewizard PWM
                                با من بیشتر آشنا شوید

                                دیدگاه

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