NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4827 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 8 از 8

موضوع: مشکل در تولید pwm

  1. #1
    کاربر علاقه مند مجتبی تاجیک آواتار ها
    تاریخ عضویت
    Jan 2011
    نوشته ها
    23
    تشکر
    12
    تشکر شده 2 بار در 2 پست

    پیش فرض مشکل در تولید pwm

    سلام ،

    برای راه اندازی روبات مسیر یاب کد زیر رو نوشتم ولی PWM درست کار نمیکنه و روبات با لرزش حرکت میکنه :

    کد:
    $regfile "m8def.dat"
    $crystal = 4000000
    
    ' Analog to didgital converter
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    ' PWM
    Config Portb.1 = Output , Portb.2 = Output
    Config Portd.0 = Output , Portd.1 = Output , Portd.2 = Output , Portd.3 = Output , Portb.7 = Input
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
    
    ' Sensor Left, Center, Right
    Dim L As Word , C As Word , R As Word
    
    ' PWM Variables
    Ddrb.7 = 0 : Portb.7 = 1
    Dim Speed As Word
    
    Do
      ' Get L, C, R sensor status
      L = Getadc(0)
      C = Getadc(1)
      R = Getadc(2)
        ' Check sensor status ( L= White, C= Black, R= White )
        If L > 513 And C < 513 And R > 513 Then
          Speed = 40000
          Portd.0 = 1 : Portd.1 = 0 : Portd.2 = 0 : Portd.3 = 1
          Pwm1a = Speed
          Pwm1b = Speed
        Else
          ' Check sensor status ( L= Black )
          If L < 513 Then
            Speed = 30000
            Portd.0 = 1 : Portd.1 = 0 : Portd.2 = 1 : Portd.3 = 0
            Pwm1a = Speed
            Pwm1b = Speed
          Else
            ' Check sensor status ( R= Black )
            If R < 513 Then
              Speed = 30000
              Portd.0 = 0 : Portd.1 = 1 : Portd.2 = 0 : Portd.3 = 1
              Pwm1a = Speed
              Pwm1b = Speed
        End If
       End If
      End If
    Loop
    End
    موتورهای روبات 2 تا موتور گریبکس دار 6 ولت 300 rpm هست و روبات با 3 تا سنسور کار میکنه که فکر میکنم برنامه ای هم که نوشتم بهینه نباشه .

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیر باز نشسته shayanmelody آواتار ها
    تاریخ عضویت
    Jan 2011
    نام
    شایان نیکزاد
    نوشته ها
    576
    تشکر
    283
    تشکر شده 1,038 بار در 473 پست

    پیش فرض

    سلام
    مهندس جان ! به جای pwm1a و pwm1 باید از compare1a و compare1b استفاده کنی.در ضمن اول بیا موتور ها تو تست کن و سرعت های مختلف رو ازش جواب بگیر بعد برنامه مسیریابی رو اضافه کن

  4. #3
    همکار M3R آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    مسعود
    نوشته ها
    710
    تشکر
    426
    تشکر شده 649 بار در 304 پست

    پیش فرض

    سلام دوست عزیز.
    این برنامه چند تا مشکل داره !!!
    اول اینکه برنامه ای که من براتون گذاشتم فقط برای آشنایی با pwm بود!!!
    مشکلات برنامه شما :
    اول اینکه شما از pwm 8بیتی استفاده کردید و مقدار pwm نمیتونه از 255 بیشتر باشه!!
    دوم اینکه مطمئنی که سنسورات همین مقدار رو میخونن؟
    پیشنهاد :
    اول به جای این که Else بنویسی بعد if بنویسی یه elseif بنویس و شرط رو جلوی elseif بزار تا نیازی به چند تا endif آخر کار (البته این قسمت برنامه شما مشکلی نداره !!) نباشه مثل زیر :
    if (a=20) then
    incr b
    elseif (a=40) then
    decr b
    elseif (a=60) then
    incr a
    endif
    دوم اینکه این شرط ها رو بردار و pwm هم مقدار دهی کن بعدش پایه هایی که وصل شده به ورودی l298 رو ست یا ریست کن و توجه کن که اگر ورودی اولی رو 1 کردی ورودی دوم رو 0 کن در غیر اینصورت دو سر موتور اختلاف پتانسیل نمیفته!!
    اون مدار پروتئوسی که گذاشتم فکر نکنم تو عمل مشکل داشته باشه اگه میتونی اونو ببند.

  5. #4
    کاربر علاقه مند مجتبی تاجیک آواتار ها
    تاریخ عضویت
    Jan 2011
    نوشته ها
    23
    تشکر
    12
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط m3r نمایش پست ها
    سلام دوست عزیز.
    این برنامه چند تا مشکل داره !!!
    اول اینکه برنامه ای که من براتون گذاشتم فقط برای آشنایی با pwm بود!!!
    مشکلات برنامه شما :
    اول اینکه شما از pwm 8بیتی استفاده کردید و مقدار pwm نمیتونه از 255 بیشتر باشه!!
    دوم اینکه مطمئنی که سنسورات همین مقدار رو میخونن؟
    پیشنهاد :
    اول به جای این که Else بنویسی بعد if بنویسی یه elseif بنویس و شرط رو جلوی elseif بزار تا نیازی به چند تا endif آخر کار (البته این قسمت برنامه شما مشکلی نداره !!) نباشه مثل زیر :
    if (a=20) then
    incr b
    elseif (a=40) then
    decr b
    elseif (a=60) then
    incr a
    endif
    دوم اینکه این شرط ها رو بردار و pwm هم مقدار دهی کن بعدش پایه هایی که وصل شده به ورودی l298 رو ست یا ریست کن و توجه کن که اگر ورودی اولی رو 1 کردی ورودی دوم رو 0 کن در غیر اینصورت دو سر موتور اختلاف پتانسیل نمیفته!!
    اون مدار پروتئوسی که گذاشتم فکر نکنم تو عمل مشکل داشته باشه اگه میتونی اونو ببند.
    سلام ،
    مدار رو مطمئنم درست بستم و درست کار میکنه و اختلاف بین سفید و سیاه سنسرورها هم درسته و درست کار میکنه ( با LCD تست کردم ) ، الان مشکل PWM هست ؛ کد رو به صورت زیر تغییر دادم :

    کد:
    $regfile "m8def.dat"
    $crystal = 8000000
    
    ' Analog to didgital converter
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    ' PWM
    Config Portb.1 = Output , Portb.2 = Output
    Config Portd.0 = Output , Portd.1 = Output , Portd.2 = Output , Portd.3 = Output , Portb.7 = Input
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024
    
    ' Sensor Left, Center, Right
    Dim L As Word , C As Word , R As Word
    
    ' PWM Variables
    Ddrb.7 = 0 : Portb.7 = 1
    Dim Speed As Word
    
    Do
      ' Get L, C, R sensor status
      L = Getadc(0)
      C = Getadc(1)
      R = Getadc(2)
        ' Check sensor status ( L= White, C= Black, R= White )
        If L > 513 And C < 513 And R > 513 Then
          Speed = 1000
          Portd.0 = 1 : Portd.1 = 0 : Portd.2 = 0 : Portd.3 = 1
        Elseif L < 513 Then
        ' Check sensor status ( L= Black )
          Speed = 1000
          Portd.0 = 1 : Portd.1 = 0 : Portd.2 = 1 : Portd.3 = 0
        Elseif R < 513 Then
        ' Check sensor status ( R= Black )
          Speed = 1000
          Portd.0 = 0 : Portd.1 = 1 : Portd.2 = 0 : Portd.3 = 1
        End If
      Compare1a = Speed
      Compare1b = Speed
    Loop
    End
    الان همه چی درست کار میکنه و موتورها بدون گیر حرکت میکنن ولی مشکل اینجاست که با سرعت خیلی بالا حرکت میکنن و روبات از پیست خارج میشه ، وقتی مقدار Speed رو کم کمتر از 1000 میزارم سرعت موتور کم نمیشه بلکه بسته به عددی که قارر دادم چند ثانیه موتورهای روش میشن و بعد خاموش میشن و دوباره روشن میشن و این روند ادامه داره ...

    چه طور باید این PWM رو ست کنم تا بتونم سرعت موتور ها رو کنترل کنم ؟ مشکل از فرکانسی که برای میکرو تنظیم کردم نیست ؟
    ویرایش توسط مجتبی تاجیک : 07-02-2011 در ساعت 12:32

  6. #5
    مدیر باز نشسته shayanmelody آواتار ها
    تاریخ عضویت
    Jan 2011
    نام
    شایان نیکزاد
    نوشته ها
    576
    تشکر
    283
    تشکر شده 1,038 بار در 473 پست

    پیش فرض

    دوست عزیز !
    شما بیا اول بجای دقت 10 بیتی از 8 بیتی استفاده کن چون بعضی وقت ها avr یک سری کارای عجیب انجام میده.حداقل واسه من بارها پیش اومده.فقط حواست باشه عدد از 255 بیشتر ندی.
    اون کاری که گفتم انجام دادی ؟ موتور هارو تنها تست کن . اعداد مختلف بده ببین سرعت تغییر میکنه یا نه.

  7. #6
    کاربر علاقه مند مجتبی تاجیک آواتار ها
    تاریخ عضویت
    Jan 2011
    نوشته ها
    23
    تشکر
    12
    تشکر شده 2 بار در 2 پست

    پیش فرض

    نقل قول نوشته اصلی توسط shayanmelody نمایش پست ها
    دوست عزیز !
    شما بیا اول بجای دقت 10 بیتی از 8 بیتی استفاده کن چون بعضی وقت ها avr یک سری کارای عجیب انجام میده.حداقل واسه من بارها پیش اومده.فقط حواست باشه عدد از 255 بیشتر ندی.
    اون کاری که گفتم انجام دادی ؟ موتور هارو تنها تست کن . اعداد مختلف بده ببین سرعت تغییر میکنه یا نه.
    عدد چی بیشتر از 255 نشه ؟ Speed ؟

    من شرط ها رو برداشتم و همه جوره تست کردم ، 8بیت ، 10 بیت و ... ، ولی مشکل همونه به جای اینکه سرعت کم بشه موتور چند ثانیه میچرخه و بسته به عددی که دادم میایسته و دوباره راه میافته .

  8. #7
    همکار M3R آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    مسعود
    نوشته ها
    710
    تشکر
    426
    تشکر شده 649 بار در 304 پست

    پیش فرض

    سلام.
    نمیدونم مشکل از چیه ولی یه کاری کن :
    کریستال رو بزار روی 1 مگاهرتز و پرسیکال همون 1024 خوبه (حدس میزنم از فرکانس باشه)
    عدد pwm رو بزار 500 (مد 10 بیتی) ببین موتورها درست کار میکنن؟
    اگه جواب نداد یه تستی با pwm هشت بیتی هم بکن.

  9. #8
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    سلام اگه هنوز جواب نگرفتی باید بگم که فرکانس PWM به Prescale بستگی داره و چون تو برنامه مقدارشو زیاد(256) نوشتی باعث لرزش در خروجی می شه اگه مقدار Prescale رو 1 بدی فرکانس PWM زیاد می شه و دیگه لرزشی در خروجی نداری.

موضوعات مشابه

  1. شارژر اتوماتیک باتری اتومبیل
    توسط Ma3ood در انجمن الکترونیک
    پاسخ: 0
    آخرين نوشته: 23-09-2013, 12:46
  2. آيا صفحه گرامافون توليد ميشه.
    توسط jonbakhsh در انجمن گفت و گوي آزاد
    پاسخ: 0
    آخرين نوشته: 26-01-2013, 02:22
  3. تولید pwm
    توسط soodi در انجمن AT91 series (ATMEL)
    پاسخ: 5
    آخرين نوشته: 10-10-2012, 13:13
  4. تولید فرکانس 1hz در پایه oc0
    توسط beh_do در انجمن AVR
    پاسخ: 1
    آخرين نوشته: 20-01-2010, 15:38
  5. پاسخ: 0
    آخرين نوشته: 19-03-2009, 08:34

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •