اطلاعیه

Collapse
No announcement yet.

فرکانس موج PWM

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

    فرکانس موج PWM

    دوستان سلام
    همه ما میدونیم با تغییر فرکانس اسیلاتور و Prescale در مد pwm میتوان فرکانس pwm را تعیین کرد.
    حالا یه سوال اگه ما یه فرکانس 58 کیلو هرتز بخوایم با مد pwm درست کنیم راهی هست یا نه .


    اضافه شده در تاریخ :
    راستی تو بسکام ما چه طوری pwmرو تو مدfast pwm راه اندازی کنیم؟؟
    نکنه فرق نمیکنه.......
    mer30

    #2
    پاسخ : فرکانس موج PWM

    اساتید سوال خیلی سخت بوده یا آسون؟؟؟؟
    بابا هیچ کس نمیدونه چطوری با هر میکرویی میشه pwmبا فرکانس 57.6khz ساخت چه با codvision یا bascom..
    لطفا راهنمایی کنین :sad: :sad: :sad: :sad:
    mer30

    دیدگاه


      #3
      پاسخ : فرکانس موج PWM

      جناب آقای محسن خان شما نگفتید با کدام میکروکنترلر و با کدام تایمر اون میخواهید این فرکانس رو تولید کنید..
      ولی با این حال فرض میکنیم شما از ATmega16 یا مشابه اون استفاده میکنید.
      در این میکروکنترلر تایمر های 0 و 2 در حالت معمول قادر به تولید PWM با فرکانس مورد نظر شما نیستند. چون حداکثر فرکانس ممکن در آنها 62500 HZ میباشد.
      اما شما با تایمر 1 میتوانید با خطائی اندک فرکانسی حول 58 کیلوهرتز را ایجاد کنید.
      برای این کار با فرض اینکه از اسیلاتور 8Mhz داخلی استفاده میکنید تایمر را در مد FAST PWM با مقدار TOP=OCR1A (مد آخر از جدول زیر) تنظیم نموده و پیش تقسیم کننده تایمر را برابر 1 قرار داده و مقدار OCR1A را برابر 137 قرار دهید. در این صورت فرکانس خروجی شما حدود 57971Hz خواهد بود. همچنین Duty Cycle پالس شما توسط OCR1B تعیین میشود که با توجه به مطالب بالا باید بین 1 الی 137 قرار داده شود.

      دیدگاه


        #4
        پاسخ : فرکانس موج PWM

        خیلی ممنون از جوابتون.
        من مایل به استفاده از میکرو mega16 و شماره تایمر هم فرقی نمیکنه (هر کدوم که دقیقتره) اما اگه قراره با این بازی دربیاره با هر چی که بشه فرقی نمیکنه.
        فقط اگه ممکنه در مورد اینکه مقدار prescaleرو بتونم بین 1 تا 256 قرار بدم و یا اگه راه داره با مقادیری بیشتر و با همون فرکانس 57.6khz راه بندازمش توضیح بدین و یه خورده در مورد راه اندازیش هم تو کد ویژن توضیح بدین.
        بعد من راستش در مورد آخر مطلبتون یه چیزو نفهمیدم:مگه اینطوری نیست که ما توی CODVISION توسط codeWizard تو تب تایمر وقسمت modeرو روی fast pwm top OCR1A تنظیم کنیم و در اینصورت ما همونجا تو قسمت clock value فرکانس 57.9 کیلو رو نداریم که. میشه اینو توضیح بدین؟
        mer30

        دیدگاه


          #5
          پاسخ : فرکانس موج PWM

          نوشته اصلی توسط mohsenmax70
          خیلی ممنون از جوابتون.
          من مایل به استفاده از میکرو mega16 و شماره تایمر هم فرقی نمیکنه (هر کدوم که دقیقتره) اما اگه قراره با این بازی دربیاره با هر چی که بشه فرقی نمیکنه.
          فقط اگه ممکنه در مورد اینکه مقدار prescaleرو بتونم بین 1 تا 256 قرار بدم و یا اگه راه داره با مقادیری بیشتر و با همون فرکانس 57.6khz راه بندازمش توضیح بدین و یه خورده در مورد راه اندازیش هم تو کد ویژن توضیح بدین.
          بعد من راستش در مورد آخر مطلبتون یه چیزو نفهمیدم:مگه اینطوری نیست که ما توی CODVISION توسط codeWizard تو تب تایمر وقسمت modeرو روی fast pwm top OCR1A تنظیم کنیم و در اینصورت ما همونجا تو قسمت clock value فرکانس 57.9 کیلو رو نداریم که. میشه اینو توضیح بدین؟
          سلام. بنده با کدویژن کار نمیکنم ولی به هر حال سعی میکنم جوابتون رو تحت کدویژن بدم.

          ببینید برای Prescale در واقع شما باید سه بیت کم ارزش رجیستر TCCR1B را مقدار دهی کنید. طبق جدول زیر :

          ولی چنانچه از کدویزارد در کدویژن استفاده میکنید نیازی به این کار نیست. در قسمت Clock Value این مورد به ترتیب جدول بالا از Prescale=0) Timer1 Stopped) سپس clock=8000,000 الی Clock=7813 یا همان Prescae=1024 در اختیار گذاشته شده ،ولی برای فرکانس مورد انتظار شما! به شکل زیر توجه کنید:

          شما باید تنظیمات رو مطابق شکل انجام بدید. این تنظیم برای فرکانس کریستال 8Mhz است. با این تنظیمات تایمر یک با همان فرکانس 8Mhz شروع به کار نموده و به صورت صعودی میشمارد و زمانی که به مقدار OCR1A رسید ریست شده و شمارش را دوباره از سر میگیرد. بنابر این برای اینکه بتوانید فرکانس حدود 57 یا 58 کیلو داشته باشید بهتره از کلاک برابر 8Mhz یا (Prescale=1 ) استفاده کنید. چون میتونید فرکانس رو دقیق تر بسازید. از Prescale=8 هم میتونید استفاده کنید ولی در این صورت خطا بسیار بیشتر خواهد بود.
          حالا برای اینکه فرکانس مورد نظر شما تولید بشه و طبق رابطه زیر که مربوط به FastPWM میشه :

          8000000/57600=138.89---> ~=139

          بنابر این مقداری که باید در OCR1a قرار بگیره یکی کمتر از مقدار بدست آمده یعنی 138 خواهد بود.
          با ریختن این عدد در OCR1A فرکانس برابر خواهد بود با:

          F=8000000/(1+138)=57553 Hz

          که نزدیک به 57600 هرتز است. Duty Cycle پالس تولیدی هم توسط OCR1B مشخص میشه.کد تولید شده توسط کدویژن هم به صورت زیر است:


          #include <mega16.h>
          void main(void)
          {

          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 8000.000 kHz
          // Mode: Fast PWM top=OCR1A
          // OC1A output: Discon.
          // OC1B output: Non-Inv.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer1 Overflow Interrupt: Off
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=0x23;
          TCCR1B=0x19;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;

          OCR1AH=0x00;
          OCR1AL=138;

          OCR1BH=0x00;
          OCR1BL=50; // Duty cycle= 50/(138+1) = 36%

          while (1)
          {
          // Place your code here

          }
          }

          دیدگاه


            #6
            پاسخ : فرکانس موج PWM

            سلام برادر.فقط اینطوری فکر کنم که کنترل دور موتورو از دست میدم و فقط از 1 تا 137 حالت سرعتی موتور میچرخه :درست میگم؟اما من به کنترل موتور اونم خیلی دقیق نیاز دارم با این موضوع چه کار کنم؟ :arrow:
            من حداقل prescale= 256 رو نیاز دارم .اگه بشه بیشترش هم کرد که دیگه عالیه تا بتونم موتورو کاملا دقیق تحت کنترل بگیرم. نظر شما چیه ؟ میشه برای این موضوع کاری کرد یا نه؟؟؟ مثلا بجای استفاده از کریستال 8mhz از 16mhz استفاده کنم؟
            mer30

            دیدگاه


              #7
              پاسخ : فرکانس موج PWM

              نوشته اصلی توسط mohsenmax70
              سلام برادر.فقط اینطوری فکر کنم که کنترل دور موتورو از دست میدم و فقط از 1 تا 137 حالت سرعتی موتور میچرخه :درست میگم؟اما من به کنترل موتور اونم خیلی دقیق نیاز دارم با این موضوع چه کار کنم؟ :arrow:
              من حداقل prescale= 256 رو نیاز دارم .اگه بشه بیشترش هم کرد که دیگه عالیه تا بتونم موتورو کاملا دقیق تحت کنترل بگیرم. نظر شما چیه ؟ میشه برای این موضوع کاری کرد یا نه؟؟؟ مثلا بجای استفاده از کریستال 8mhz از 16mhz استفاده کنم؟
              دوست عزیز ،فرکانس 57600 هرتز رو برای چه نوع موتوری نیاز دارید. اگر قصد دارید برای موتور DC استفاده کنید به نظر کمی زیاد میاد. معمولا موتور ها به فرکانس های کمتر از این نیاز دارند.
              در مورد مطلبی که فرمودید باید بگم این یک قاعده کلی در اکثر میکروکنترلر هاست که دقت(پله های) موج PWM با افزایش فرکانس موج PWM (البته در حالی که فرکانس سیستم تولید کننده PWM یعنی همان فرکانس کریستال ثابت باشد) کاهش میابد.
              همونطور که اشاره کردید برای افزایش دقت میتونید فرکانس میکروکنترلر رو افزایش بدید. اگر از کریستال 16Mhz استفاده کنید با تنظیمات ذکر شده در پست قبلی فقط کافیه مقدار OCR1A رو برابر 277 قرار بدید. به این ترتیب شما برای Duty Cycle پالس خروجی 278 پله خواهید داشت.
              مطلب دیگه ای که هست اینه که شما ظاهراً در مورد Precscale دچار اشتباه هستید. ببینید، Prescale یا همان پیش تقسیم کننده پالس ورودی از کلاک سیستم را طبق جدول ارائه شده در پست قبلی تقسیم نموده و به تحریک تایمر/کانتر اعمال میکند. اگر شما از Prescale=256 استفاده کنید چنانچه فرکانس میکروکنترلر برابر 8Mhz باشه فرکانس کلاک اعمال شده به تحریک تایمر برای شمارش 31250 هرتز خواهد شد که اصلاً کافی نیست. و چنانچه فرکانس میکرو 16Mhz باشه این کلاک اعمالی به تحریک تایمر 62500 هرتز خواهد بود. هر چند این فرکانس از مقدار خواسته شده از طرف شما بیشتر است ولی اولا با آن اختلاف زیادی دارد ثانیاً چون شمابرای تولید PWM باید به OCR1A یک مقداری بدید و حد اقل آن 2 میباشد باز هم این فرکانس بر عدد 2+1 تقسم شده
              که در نهایت فرکانس شما حدود 20Khz خواهد شد.
              بنابر این بهتر است حد اکثر کلاک ممکن را به تحریک تایمر اعمال کنید و با انتخاب مناسب مقدار OCR1A فرکانس خروجی را تنظیم نمائید.
              در واقع شما با این کار تقسیم فرکانس را با مقدار OCR1A انجام میدهید. که این کار چند مزیت دارد : دقت و رزولوشن پالس خروجی را افزایش داده اید(چون تعداد پله ها افزایش یافته)، انتخاب بیشتری برای تولید فرکانس های مختلف دارید (با توجه به افزایش بازه مقادیر قابل اعمال به OCR1A ) و ...

              دیدگاه


                #8
                پاسخ : فرکانس موج PWM

                سلام.
                آقا در مورد prescale خوب مگه اینطور نیست که ما هر قدر PRESCAL رو بیشتر انتخاب کنیم همونطور که شما هم گفتی دقت (پله ها) کمتر میشه :مثلا اگه ما prescale 256 رو انتخاب کنیم ، جدا از بحث مقدار فرکانسش ما از لحاظ دقت میتونیم تو 255پله عرض پالسو کم و زیاد کنیم.تو بسکام که اینطوریه یعنی عدد prescale همون رنج دقتیمون هست.خواهشا اگه دارم اشتباه میگم توضیح بده تا این موضوع برام جا بیفته . الان شما میگین تو codwizard در قسمت تایمرها فرکانس pwm برابر مقدار فرکانس clock Value هست؟
                من بیشتر کارامو همیشه با بسکام انجام میدادم اما برای اینکار ، چون بسکام بخاطر داشتن محدودیتهایی نمیتونه فرکانس و همچنین دقتpwm مورد بحث رو بده اومدم با codvision انجامش بدم. در واقع فکر میکنم بسکام از حالت Fast PWM پشتیبانی نمیکنه....

                همونطور که گفتم این یه موتور خاص هست به مشخصات زیر:
                DC MICRO ENCODER MOTOR:
                Nominal voltage=24V
                Terminal resistance=1.63ohm
                Output power=83.2W
                Efficiency,max=83%
                No-load speed=5900rpm
                No load current(with shaft Q 5mm)=0.129 A
                Stall torque=539mNm
                Fraction torque=4.9mNm
                Speed Constant=253rpm/V
                Slop of n-M curve=10.9rpm/mNm
                Rotor inductance=270uh
                آقا با عرض شرمندگی من چون تازهکارم نمیدونم چطوری اینجا یه فاییل عکسو بزارم باید عکسمو upload کنم تو یه سایتی و بعد لینکشو اینجا بزارم یا راه سادهتری هم هست؟
                راستی یه سوال از خودت دارم . شما خودت با چی کار می کنی اگه از بسکامو کدویژن بهتره ما رو اینا وقت نزاریم .دستت درد نکنه<<< :arrow:
                mer30

                دیدگاه


                  #9
                  پاسخ : فرکانس موج PWM

                  نوشته اصلی توسط mohsenmax70
                  سلام.
                  آقا در مورد prescale خوب مگه اینطور نیست که ما هر قدر PRESCAL رو بیشتر انتخاب کنیم همونطور که شما هم گفتی دقت (پله ها) کمتر میشه :مثلا اگه ما prescale 256 رو انتخاب کنیم ، جدا از بحث مقدار فرکانسش ما از لحاظ دقت میتونیم تو 255پله عرض پالسو کم و زیاد کنیم.تو بسکام که اینطوریه یعنی عدد prescale همون رنج دقتیمون هست.خواهشا اگه دارم اشتباه میگم توضیح بده تا این موضوع برام جا بیفته . الان شما میگین تو codwizard در قسمت تایمرها فرکانس pwm برابر مقدار فرکانس clock Value هست؟
                  من بیشتر کارامو همیشه با بسکام انجام میدادم اما برای اینکار ، چون بسکام بخاطر داشتن محدودیتهایی نمیتونه فرکانس و همچنین دقتpwm مورد بحث رو بده اومدم با codvision انجامش بدم. در واقع فکر میکنم بسکام از حالت Fast PWM پشتیبانی نمیکنه....
                  سلام.
                  ببینید بزرگترین مشکل شما اینه که با بسکام کار میکنید، که باعث شده دید کاملاً ناقصی از سخت افزار داشته باشید.
                  مقدار Prescale به خودی خود ربطی به دقت یا پله نداره. شما حتی اگر پیش تقسیم کننده رو برابر 256 هم قرار بدید باز هم میتونید (با تایمر 1) 16 بیت یا همان 65536 پله دقت داشته باشید. ولی در این صورت فرکانس PWM با فرض کریستال 16 مگاهرتز برابرخواهد بود با:
                  16000000/256(1+65535)
                  یعنی کمتر از 1 هرتز.

                  پس این فرکانس مورد نظر شماست که دقت یا پله ها رو تعیین میکنه.
                  بهتر است کمی در مورد تولید موج PWM توسط تایمر یک و مد FastPwm با مقدار TOP=OCR1A توضیح بدم تا موضوع روشن تر شود.
                  شما به تحریک تایمر، قطار پالس با فرکانس خاص اعمال میکنید تا از 0 رو به بالا بشمارد. این پالس همان خروجی پیش تقسیم کننده ( Prescale ) است که فرکانس کریستال را بر مقدار خود تقسیم کرده. فرض کنیم مقدار پیش تقسیم کننده برابر 8 و فرکانس کریستال 8Mhz باشد. پس فرکانس قطار پالسی که به تایمر اعمال شده 1Mhz است. پس یک میکرو ثانیه طول میکشد تا تایمر یک شماره افزایش پیدا کند. توجه داشته باشید که چون تایمر یک 16 بیتی است پس تا 65535 میتواند بشمارد. تایمر همیشه از 0 رو به بالا میشمارد و زمانی که به حداکثر مقدار خود رسید ریست شده و دوباره از مقدار 0 رو به بالا میشمارد. حالا این مقدار حد اکثر یا همان TOP در مد های مختلف فرق دارد و توسط جدول شماره 47 که در اولین پست خودم در این تاپیک قرار دادم مشخص میشود. در مدی که ما انتخاب کردیم این مقدار توسط مقدار ذخیره شده در رجیستر 16 بیتی OCR1A مشخص میشود. یعنی در این مد تایمر کار خود را شروع کرده و یک مقایسه کننده دائما مقدار تایمر را با OCR1A مقایسه کرده و به محض اینکه با آن برابر شد در پالس بعدی (این پالس به تعداد یک ضرب در مقدار پیش تقسم کننده سیکل از کلاک کریستال طول میکشد ) تایمر را ریست میکند. فرض کنیم مقدار OCR1A برابر 999 باشد . در این صورت زمانی که مقایسه کننده برابری مقدار تایمر را با این عدد تشخیص داد در پالس بعدی مقدار تایمر را صفر میکند. پس تایمر در هر 1000 پالسی که از خروجی پیش تقسیم کننده در یاقت میکند ریست میشود. و چون دوره تناوب هر پالس یک میکرو ثانیه بود پس تایمر در هر یک میلی ثانیه ریست میشود. یعنی ما یک فرکانس 1Khz داریم. حالا نقش OCR1B این وسط چیست؟
                  قبلاً گفتیم که Duty Cycle یا مقدار High پالس توسط OCR1B تعیین میشود. در حین اینکه تایمر میشمارد یک مقایسه کننده دیگر هو وجود دارد که مقدار تایمر را با OCR1B نیز مقایسه میکند. چنانچه مقایسه کننده برابری مقدار تایمر با این رجیستر را تشخیص داد تایمر را ریست نمیکند بلکه با توجه به 4 بیت پر ارزش جیستر کنترلی TCCR1A عمل میکند.

                  یعنی مطابق جدول زیر وضعیت پین های OC1A و OC1B را تغییر میدهد:


                  نکته ای که باید رعایت شود این است که مقدار OCR1B بین 0 تا OCR1A میتواند باشد و اگر از آن بیشتر باشد خروجی ثابت مانده و پالسی تشکیل نمیشود.

                  نوشته اصلی توسط mohsenmax70
                  خواهشا اگه دارم اشتباه میگم توضیح بده تا این موضوع برام جا بیفته . الان شما میگین تو codwizard در قسمت تایمرها فرکانس pwm برابر مقدار فرکانس clock Value هست
                  با توجه به توضیحات داده شده در بالا باید متوجه شده باشید که مقدار Clock Value همان فرکانس پالسی است که به تایمر اعمال شده. یعنی clock حاصل از خروجی پیش تقسیم کننده است.
                  و ربطی به فرکانس PWM ندارد. فرکانس PWM توسط مقدار OCR1A مشخص میشود.

                  نوشته اصلی توسط mohsenmax70
                  راستی یه سوال از خودت دارم . شما خودت با چی کار می کنی اگه از بسکامو کدویژن بهتره ما رو اینا وقت نزاریم .دستت درد نکنه<<< :arrow:
                  بنده خودم بیشتر با IAR کار میکنم و کمی هم با WinAVR.




                  دیدگاه


                    #10
                    پاسخ : فرکانس موج PWM

                    سلام .آقا توضیحات کامل بود دستت درست.
                    اما من وقتی در کدویزارد مقدار clock 8مگ و حالت fast pwm top=ocr1a و رو انتخاب میکنم و outb=none inv انتخاب میکنم و کریستال داخلی میکرو رو 8مگ داخلی تنظیم کردم و مقدار OCR1AHرو به138 و مقدار OCR1BH=50; گزاشتم و بعد میکرورو روشن کردم و با اسکوپ پایه PD4 یا oc1b رو گرفتم و فرکانسو خوندم که البته فرکانسو خود اسکوپ حساب کرده بود.شد 228.320hz
                    کجا اشتباه کردم....
                    اینم برنامه:


                    #include <mega16.h>


                    void main(void)
                    {

                    PORTA=0x00;
                    DDRA=0x00;

                    PORTB=0x00;
                    DDRB=0x00;

                    PORTC=0x00;
                    DDRC=0x00;

                    PORTD=0x00;
                    DDRD=0x10;

                    TCCR0=0x00;
                    TCNT0=0x00;
                    OCR0=0x00;

                    TCCR1A=0x23;
                    TCCR1B=0x19;
                    TCNT1H=0x00;
                    TCNT1L=0x00;
                    ICR1H=0x00;
                    ICR1L=0x00;
                    OCR1AH=138;
                    OCR1AL=0x00;
                    OCR1BH=50;
                    OCR1BL=0x00;

                    ASSR=0x00;
                    TCCR2=0x00;
                    TCNT2=0x00;
                    OCR2=0x00;

                    MCUCR=0x00;
                    MCUCSR=0x00;

                    TIMSK=0x00;

                    UCSRB=0x00;

                    ACSR=0x80;
                    SFIOR=0x00;

                    ADCSRA=0x00;

                    SPCR=0x00;

                    TWCR=0x00;

                    while (1)
                    {
                    // Place your code here

                    }
                    }
                    mer30

                    دیدگاه


                      #11
                      پاسخ : فرکانس موج PWM

                      نوشته اصلی توسط mohsenmax70
                      سلام .آقا توضیحات کامل بود دستت درست.
                      اما من وقتی در کدویزارد مقدار clock 8مگ و حالت fast pwm top=ocr1a و رو انتخاب میکنم و outb=none inv انتخاب میکنم و کریستال داخلی میکرو رو 8مگ داخلی تنظیم کردم و مقدار OCR1AHرو به138 و مقدار OCR1BH=50; گزاشتم و بعد میکرورو روشن کردم و با اسکوپ پایه PD4 یا oc1b رو گرفتم و فرکانسو خوندم که البته فرکانسو خود اسکوپ حساب کرده بود.شد 228.320hz
                      کجا اشتباه کردم....
                      سلام.
                      اسیلوسکوپ درست نشون میده . رجیستر 16 بیتی OCR1A از به هم پیوستن دو رجیستر 8 بیتی OCR1AL و OCR1AH تشکیل میشه. اشتباهی که در برنامه وجود داره اینه که عدد 138 در بایت پر ارزش OCR1A ریخته شده.
                      معادل هگز این عدد 8A است. که با توجه به اینکه اشتباهاً اون رو در OCR1H قرار دادیم مقدار کل رجیستر OCR1A برابر 0x8A00 میشه. که معادل عدد 35328 است که اختلاف واضحی با 138 داره.
                      همچنین این اشتباه در مقدار دهی رجیستر OCR1B نیز رخ داده. و عدد 50 در بایت پر ارزش این رجیستر 16 بیتی قرار گرفته.
                      بنابراین برای رفع این مورد باید عدد 138 رو در OCR1AL و عدد 50 رو در OCR1BL قرار بدید.
                      همچنین با توجه به اینکه در کامپایلر ها مقدار دهی به صورت 16 بیتی به راحتی انجام میشه بهتره که به جای مقدار دهی جداگانه و 8 بیتی مستقیماً خود OCR1A و OCR1B رو به صورت 16 بیتی مقدار بدید. یعنی :
                      کد:
                      OCR1A=138;
                      OCR1B=50;
                      به این ترتیب میتونید اونها رو تا 65535 مقداردهی کنید.

                      دیدگاه


                        #12
                        پاسخ : فرکانس موج PWM

                        سلام .آقا درست شد :nerd: دستت درست .
                        اما این بیت پرارزش و کم ارزش قضیه ش چیه که ما وقتی عدد 138 توی اون گذاشتیم فرکانسو بهم ریخته بود؟مگه نمیگی که OCR1AH,L هرکدوم یه تایمر
                        8بیتی هست؟ :question: پس چه فرقی میکنه که عددو به کدوم تایمر بدیم ...
                        mer30

                        دیدگاه


                          #13
                          پاسخ : فرکانس موج PWM

                          نوشته اصلی توسط mohsenmax70
                          اما این بیت پرارزش و کم ارزش قضیه ش چیه که ما وقتی عدد 138 توی اون گذاشتیم فرکانسو بهم ریخته بود؟مگه نمیگی که OCR1AH,L هرکدوم یه تایمر
                          8بیتی هست؟ :question: پس چه فرقی میکنه که عددو به کدوم تایمر بدیم ...
                          سلام.
                          اشتباه نکنید. OCR1A و OCR1B تایمر نیستند بلکه رجیستر های مقایسه کننده هستند . و دائم محتوای هرکدوم از اونها با مقدار رجیستر تایمر یعنی TCNT1 مقایسه میشه.
                          همونطور که قبلاً گفته شد هر کدام از این رجیستر های تایمر 1 شانزده بیتی هستند و از کنار هم قرار گرفتن دو رجیستر 8 بیتی تشکیل شدند.
                          رجیستر OCR1A از OCR1AL و OCR1AH تشکیل شده. همینطور رجیستر محتوای تایمر یعنی TCNT1 هم از دو رجیستر TCNT1L و TCNT1H تشکیل شده. در واقع در زمان مقایسه OCR1AL با TCNT1L مقایسه شده و OCR1AH هم با TCNT1H مقایسه میشه.برای رجیستر های 8 بیتی OCR1BL و OCR1BH هم به همین ترتیب است.
                          در زمان شمارش تایمر ، پس از هربار سرریز رجیستر TCNT1L (از عدد 255 به عدد 0 )یک رقم به محتوای TCNT1H اضافه میشه به این ترتیب این دو با هم تشکیل یک تایمر 16 بیتی میدهند.

                          دیدگاه


                            #14
                            پاسخ : فرکانس موج PWM

                            یه سوال ما برای تایمر 1 در مگا 16 دو تا پین داریم که یکیش OC1A و OC1B هست که تو برنامه قبل ما فرکانس PWM رو روی پین 18 که همون OC1B هست راه انداختیم اگه بگفته شما OC1A,B دو تا رجیستر جدا از هم هستند من میتونم مثلا یه پالس PWM روی OC1B با یه فرکانسی بندازم و برای OC1A هم یه فرکانس PWM مجزایی که فرکانسش با اونیکی رجیستر فرق کنه بندازم یا نه ؟ اگه دارم درست میگم ، برای این کار در برنامه کدویژن چی رو تغییر بدم؟ :arrow:(میخوام با تایمر 1 دو تا فرکانس pwm مجزا بسازم تو کدویژن برای OC!A به کدوم رجیستر باید مقدار بدم) :arrow: :arrow: :arrow:
                            mer30

                            دیدگاه


                              #15
                              پاسخ : فرکانس موج PWM

                              خیر.
                              چون هر دو رجیستر OCR1A,B مربوط به تایمر 1 هستند و هر دو با این تایمر کار میکنند بنا بر این فرکانس خروجی دو پین OC1A,B با هم برابره. و شما فقط میتونید DutyCycle متفاوتی در هر کدوم از پین ها داشته باشید. در ضمن در این مدی که ما انتخاب کردیم چون مقدار TOP برابر OCR1A است و به محض برابری تایمر با OCR1A تایمر ریست میشه خروجی OC1A همیشه ثابت میمونه و در آن شاهد پالس نخواهیم بود و فقط در OC1B موج PWM داریم.
                              اما برای اینکه بنونیم در هر دو پین پالس داشته باشیم میتونیم مد کاری رو عوض کرده و مد یکی مانده به آخر از جدول 47 دیتاشیت Mega16 که در آن مقدار TOP برابر رجیستر ICR1 خواهد بود رو انتخاب کنیم. یعنی به جای اینکه مقدار TOP رو در OCR1A بریزیم در ICR1 میریزیم. حالا رجیستر OCR1A درست مانند OCR1B عمل میکنه و فقط مشخص کننده DutyCycle فرکانس خروجی از پین OC1A خواهد بود. در این حالت هم باید توجه کنید که مقدار OCR1A,B نباید از مقدار TOP یعنی ICR1 بیشتر باشند. در غیر این صورت فرکانس تولید نمیشه.

                              دیدگاه

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