اطلاعیه

Collapse
No announcement yet.

درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

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

    درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

    من روی آی سی ATMEGA32 دیپ میخوام از پایه PB4 و PB5 که همون OCR1B و OCR1A میشه میخوام جداگانه پالس PWM تولید کنم و به المنت و موتور بدم.

    رجیسترشون به چه شکل هست؟
    -برای OCR1B چی بزنم که فقط همین کار کنه؟
    -برای OCR1A چی بزنم که اینم جدا کار کنه؟

    هم موج PWM و هم Prescale ممنون.
    *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

    #2
    پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

    نوشته اصلی توسط shoniz نمایش پست ها
    من روی آی سی ATMEGA32 دیپ میخوام از پایه PB4 و PB5 که همون OCR1B و OCR1A میشه میخوام جداگانه پالس PWM تولید کنم و به المنت و موتور بدم.

    رجیسترشون به چه شکل هست؟
    -برای OCR1B چی بزنم که فقط همین کار کنه؟
    -برای OCR1A چی بزنم که اینم جدا کار کنه؟

    هم موج PWM و هم Prescale ممنون.
    یعنی کسی انجام نداده؟
    همزمان از 2 پایه خروجی PWM بگیره؟
    *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

    دیدگاه


      #3
      پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

      نوشته اصلی توسط shoniz نمایش پست ها
      یعنی کسی انجام نداده؟
      همزمان از 2 پایه خروجی PWM بگیره؟
      سلام
      سوالتون کمی مبهمه. منظورتون دقیقا چیه و کجاش مشکل دارید؟

      دیدگاه


        #4
        پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        سوالتون کمی مبهمه. منظورتون دقیقا چیه و کجاش مشکل دارید؟
        میخوام از یک پایه OCR1B خروجی PWM بگیرم برای المنت و از پایه OCR1A خروجی بگیرم برای دور موتور
        *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

        دیدگاه


          #5
          پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

          نوشته اصلی توسط shoniz نمایش پست ها
          میخوام از یک پایه OCR1B خروجی PWM بگیرم برای المنت و از پایه OCR1A خروجی بگیرم برای دور موتور
          خوب بگیرید؛ مشکلتون چیه؟

          دیدگاه


            #6
            پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

            نوشته اصلی توسط hossein.m98 نمایش پست ها
            خوب بگیرید؛ مشکلتون چیه؟
            برای هر کدوم رجیسترش رو برام بنویسید

            مثلا راه اندازی اینقدر فرکانس روی OCR1B با این کد.
            اینقدر فرکانس برای OCR1A با این کد.

            من هرچی میزنم نمیشه.

            یا 0 هست یا 1 .

            نمیتونم تنظیم کنم.


            البته تو ویزارد هم بگید هم مابقیش رو انجام میدم.
            *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

            دیدگاه


              #7
              پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

              نوشته اصلی توسط shoniz نمایش پست ها
              برای هر کدوم رجیسترش رو برام بنویسید

              مثلا راه اندازی اینقدر فرکانس روی OCR1B با این کد.
              اینقدر فرکانس برای OCR1A با این کد.

              من هرچی میزنم نمیشه.

              یا 0 هست یا 1 .

              نمیتونم تنظیم کنم.


              البته تو ویزارد هم بگید هم مابقیش رو انجام میدم.
              خوب تایمر 1 کمی با دوتای دیگه فرق داره و حقم دارید کمی گیج بشید. ببینید من این کد رو داخل AVR-GCC (همون Atmel Studio) کمپایل کردم و تایمر رو توی مد شماره 10 که حالت تصحیح فازه (جدولش داخل صفحه 114 دیتاشیت ATMega32 هست) راه اندازی کردم. برای تست توی پروتئوس اومدم از PINA و PINB استفاده کردم که بتونم سخت افزاری مقدار دیوتی سایکل رو تغییر بدم. شما هم با کمی تغییر میتونید داخل کدویژن ازش استفاده کنید.
              مورد بعدی این که با یک کردن صفر مقابل WGM12 توی کدی که گذاشتم، میتونید مد تایمر رو به شماره 14 که PWM سریعه تبدیلش کنید.

              #include <avr/io.h>


              int main()
              {
              PORTA = 255;
              DDRA = 0;
              PORTB = 255;
              DDRB = 0;
              DDRD = (1<<4) | (1<<5);


              TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
              TCCR1B = (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
              ICR1 = 0xffff;


              while(1)
              {
              OCR1A = PINA * 257;
              OCR1B = PINB * 257;
              }
              }

              راستی اینم بگم کد بالا تایمر توی مد 16 بیتی قرار داره و با این وضعیت، با فرض اینکه کریستال 16 مگاهرتزی هم به میکروکنترلر متصل کنید، بیشتر از حدود 244 هرتز نمیتونید خروجی بگیرید! برای فرکانس بیشتر ناچاراید رزولوشن رو کم کنید. در این صورت باید مد تایمر رو عوض کنید. مثل کد زیر که تایمر 10 بیتی تنظیم شده و با کریستال 16 مگاهرتزی، میتونید حدود 15 کیلوهرتز خروجی بگیرید:

              #include <avr/io.h>


              int main()
              {
              PORTA = 255;
              DDRA = 0;
              PORTB = 255;
              DDRB = 0;
              DDRD = (1<<4) | (1<<5);


              TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10);
              TCCR1B = (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
              ICR1 = 0xffff;


              while(1)
              {
              OCR1A = PINA * 4;
              OCR1B = PINB * 4;
              }
              }
              جدیدترین ویرایش توسط hossein.m98; ۱۹:۳۴ ۱۳۹۹/۱۲/۲۶. دلیل: تکمیل

              دیدگاه


                #8
                پاسخ : درخواست رجیستر مربوط به OCR1B و OCR1A بصورت مجزا

                نوشته اصلی توسط hossein.m98 نمایش پست ها
                خوب تایمر 1 کمی با دوتای دیگه فرق داره و حقم دارید کمی گیج بشید. ببینید من این کد رو داخل AVR-GCC (همون Atmel Studio) کمپایل کردم و تایمر رو توی مد شماره 10 که حالت تصحیح فازه (جدولش داخل صفحه 114 دیتاشیت ATMega32 هست) راه اندازی کردم. برای تست توی پروتئوس اومدم از PINA و PINB استفاده کردم که بتونم سخت افزاری مقدار دیوتی سایکل رو تغییر بدم. شما هم با کمی تغییر میتونید داخل کدویژن ازش استفاده کنید.
                مورد بعدی این که با یک کردن صفر مقابل WGM12 توی کدی که گذاشتم، میتونید مد تایمر رو به شماره 14 که PWM سریعه تبدیلش کنید.

                #include <avr/io.h>


                int main()
                {
                PORTA = 255;
                DDRA = 0;
                PORTB = 255;
                DDRB = 0;
                DDRD = (1<<4) | (1<<5);


                TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
                TCCR1B = (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
                ICR1 = 0xffff;


                while(1)
                {
                OCR1A = PINA * 257;
                OCR1B = PINB * 257;
                }
                }

                راستی اینم بگم کد بالا تایمر توی مد 16 بیتی قرار داره و با این وضعیت، با فرض اینکه کریستال 16 مگاهرتزی هم به میکروکنترلر متصل کنید، بیشتر از حدود 244 هرتز نمیتونید خروجی بگیرید! برای فرکانس بیشتر ناچاراید رزولوشن رو کم کنید. در این صورت باید مد تایمر رو عوض کنید. مثل کد زیر که تایمر 10 بیتی تنظیم شده و با کریستال 16 مگاهرتزی، میتونید حدود 15 کیلوهرتز خروجی بگیرید:

                #include <avr/io.h>


                int main()
                {
                PORTA = 255;
                DDRA = 0;
                PORTB = 255;
                DDRB = 0;
                DDRD = (1<<4) | (1<<5);


                TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10);
                TCCR1B = (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
                ICR1 = 0xffff;


                while(1)
                {
                OCR1A = PINA * 4;
                OCR1B = PINB * 4;
                }
                }
                ممنون
                فکر میکنم مشکلم حل شد با این نمونه ای که دادید.
                تصحیح فاز

                عالیه امروز تست میکنم
                *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

                دیدگاه

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