اطلاعیه

Collapse
No announcement yet.

مشکل با PWM

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

    مشکل با PWM

    سلام
    زمانی که بخوایم یه پالس با پهنای ثابت درست کنیم یه مقدار ثابت به OCR0 میدیم مثلا کد زیر:
    کد:
    #include <mega32a.h>
    void main()
    {
     DDRB=0xFF;
     TCNT0=0x00;
     OCR0=230;
     TCCR0=(1<<WGM00) | (1<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (0<<CS01) | (1<<CS00);
     while(1);
     }
    وبا تغییر OCR0 از صفر تا 255 عرض پالس رو تغییر میدیم ولی اگه بخوایم یه برنامه بنویسم که در طی چند ثانیه عرض پالس از حداق مقدار تا حداکثر مقدار تغییر کنه باید چی کار کرد.
    من OCR0=i میزارم و i رو حدودا از صفر تا 255 تغییر میدم ولی عرض پالس تغییر نمیکنه؟چون میخوام به در طول چند ثانیه عرض پالس تغییر کنه از delay استفاده میکنم.مشکل چیه؟
    مثلا کد زیر رو ببینید:
    کد:
    #include <mega32a.h>
    #include <delay.h>
    void main()
    {
      int i=10;
      DDRB=0xFF;
      while(1)
      {
       while(i<255)
       {
       TCNT0=0x00;
       OCR0=i;
       TCCR0=(1<<WGM00) | (1<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (0<<CS01) | (1<<CS00);
       delay_ms(500);
       i=i+5;
       }
      i=10;
      } 
     }

    #2
    پاسخ : مشکل با PWM

    متغیر i رو از نوع Int تعریف کردی. در حالی که باید char باشه تا از لحاظ بیت ها به ocr0 بخوره
    ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

    امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

    دیدگاه


      #3
      پاسخ : مشکل با PWM

      نوشته اصلی توسط AliRezaDAVE
      متغیر i رو از نوع Int تعریف کردی. در حالی که باید char باشه تا از لحاظ بیت ها به ocr0 بخوره
      تست میکنم.
      وقتی برنامه به دستور delay میرسه pwm متوقف نمیشه؟نباید از تایمر استفاده کرد؟

      دیدگاه


        #4
        پاسخ : مشکل با PWM

        شما به محض اینکه رجیستر کنترل رو مقدار دهی کنی و برای تایمر یک منبع کلاک تعیین کنی شروع به شمارش میکنه و به کار خودش ادامه میده تا این که منبع کلاک رو قطع کنید
        برنامه اتون هم درست کار میکنه. مشکلی نداره. شاید چون مقدار step متغیر i رو 5 گذاشتید تغییراتش خیلی محسوس نباشه. مقدارش رو زیاد کنید
        ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

        امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

        دیدگاه


          #5
          پاسخ : مشکل با PWM

          این مشکل حل شد.تشکر
          1-اگه در همین برنامه از حلقه های while خارج بشیم (چند خط به برنامه اضافه کنیم) pwm متوقف میشه؟اگه نمیشه در این حالت که OCR0 متغییره بایه عدد ثابت کار میکنه یا همون i?
          2-منظور از فرکانس pwm چیه؟در این حال که عرض پالس تغییر میکنه فرکانس ثابته یا متغیر؟
          3-برای راه اندازی موتور دی سی (به سرعت راه اندازی و درایور موتور کاری ندارم...) به همین شکل باید مقدار OCR0 رو از صفر تا 255 زیاد کنیم؟

          دیدگاه


            #6
            پاسخ : مشکل با PWM

            1- پست قبل گفتم تا زمانی که منبع کلاک تایمر قطع نشه، تایمر به کار خودش ادامه میده و کاری به برنامه نداره.
            ocr0 هم با آخرین مقداری که به خودش میگیره عمل میکنه
            2- فرکانس ثابته. هرسری تایمر از 0 تا 255 میشماره و هروقت مقدار شمارش شده با مقداری که درون ocr0 ریختی برابر شد خروجی رو یک یا صفر میکنه. شمارش از 0 تا 255 فرکانس پالس رو میسازه
            3- بله
            ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

            امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

            دیدگاه


              #7
              پاسخ : مشکل با PWM

              وقتی که از تایمر-کانتر استفاده میکنیم مثلا تایمر صفر دیگه پایه چهارم میکرو مگا 32 و16 PORTB.3 نیست و OC0 هست.چرا کدویزن OC0 رو نمیشناسه و میگه تعریف نشده؟چطوری میشه به این پایه وقتی از تایمر استفاده میکنیم دسترسی داشته باشیم مثلا مقدارشو بخونیم؟

              دیدگاه


                #8
                پاسخ : مشکل با PWM

                نوشته اصلی توسط ((O-I-O))
                وقتی که از تایمر-کانتر استفاده میکنیم مثلا تایمر صفر دیگه پایه چهارم میکرو مگا 32 و16 PORTB.3 نیست و OC0 هست.چرا کدویزن OC0 رو نمیشناسه و میگه تعریف نشده؟چطوری میشه به این پایه وقتی از تایمر استفاده میکنیم دسترسی داشته باشیم مثلا مقدارشو بخونیم؟
                oc0 یا ocr0؟؟؟؟
                منظورتون از اینکه این پایه رو بخونید چیه؟؟؟؟
                هروقت تایمر قطع بشه این پایه هم آزاد میشه. البته میتونید با تنظیم بیت های com00 و com01 هم طوری عمل کنید که اصلا با پایه میکرو کاری نداشته باشه
                ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

                امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

                دیدگاه


                  #9
                  پاسخ : مشکل با PWM

                  سلام
                  میشه برنامه ای که کار کرد رو بزارید اخه من هم همچین مشکلی رو دارم

                  مـــــــــــــــــــــمنون
                  آدلان پایا متخصص در حوضه ربات های پرنده
                  https://adlanpaya.ir/

                  دیدگاه


                    #10
                    پاسخ : مشکل با PWM

                    نوشته اصلی توسط avr68
                    سلام
                    میشه برنامه ای که کار کرد رو بزارید اخه من هم همچین مشکلی رو دارم

                    مـــــــــــــــــــــمنون
                    بفرما داداش:
                    این کار میکنه:
                    کد:
                    #include <mega32a.h>
                    #include <delay.h>
                    void main()
                    {
                      int i=10;
                      DDRB=0xFF;
                      while(1)
                      {
                       while(i<255)
                       {
                       TCNT0=0x00;
                       OCR0=i;
                       TCCR0=(1<<WGM00) | (1<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (0<<CS01) | (1<<CS00);
                       delay_ms(500);
                       i=i+5;
                       }
                      i=10;
                      } 
                     }
                    اینم اگه یه ال ای دی به پایه 4 میکرو وصل کنید کم نور و پر نورش میکنه:
                    کد:
                    #include <mega32a.h>
                    #include <delay.h>
                    void main()
                    {
                      char i=0;
                      DDRB=0xFF;
                      while(1)
                      {
                       while(i<255)
                       {
                       TCNT0=0x00;
                       OCR0=i;
                       TCCR0=(1<<WGM00) | (1<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (0<<CS01) | (1<<CS00);
                       delay_ms(5);
                       i=i+1;
                       }
                      while(i>0)
                      {
                       TCNT0=0x00;
                       OCR0=i;
                       TCCR0=(1<<WGM00) | (1<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (0<<CS01) | (1<<CS00);
                       delay_ms(5);
                       i=i-1;
                      } 
                      }
                     }

                    دیدگاه

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