اطلاعیه

Collapse
No announcement yet.

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

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

    #91
    پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

    نوشته اصلی توسط PR-monster
    اقای اسدی میشه کد رو توضیح بدید لطفا؟!و در باره این کتابخونه
    #include <iobits.h>
    و یا تابع setbit در این کتاب خونه هست؟ دقیقا کارش چیه؟
    سلام

    ببین دوست عزیز همانطور که میدونید در کدویژن فقط میتوان مستقیما" با پورتهای A,B,C,D با دستور
    کد:
    PORTX.Y = 0
    PORTX.Y = 1
    کار میکنه ... و برای پورتهای پس از پورت D که میشه پورت E به بعد دیگه این دستورها کاربردی ندارند ... و باید از دستورهای کتابخانه خود کدویژن استفاده کنید تا بتوان پورتهای پس از D را ، راه اندازی کرد ...
    این کتابخانه سه تا دستور بیشتر نداره ...
    کد:
    SETBIT(PORTX,Y)
    CLRBIT(PORTX,Y)
    TGLBIT(PORTX,Y)
    دستور اولی برای یک کردن پایه خروجی به کار برده میشود
    دستور دومی برای صفر کردن پایه خروجی به کار برده میشود
    دستور سومی برای نات کردن یا تاگل کردن پایه خروجی به کار برده میشود (یعنی اگر صفر هست بشه یک و اگر یک باشه بشه صفر)
    توی اتمل استودیو هم از دستورهای sbi و cbi استفاده میشود ... من خودم یک کتابخانه نوشتم برای اتمل استودیو که خیلی از کارها رو راحت میکنه که اگر دقت کرده باشید توی پست چهارم این تاپیک گذاشتمش و میتونید به عنوان یک کتابخونه خوب مورد استفاده قرار بگیرید .
    اینجا رو ببین
    http://www.eca.ir/forum2/index.php?topic=90246.msg574074#msg574074
    کتابخونه رو توی این پست معرفی کردم ...
    [hr]
    نوشته اصلی توسط PR-monster
    در تابع اینتراپت هر بار مقدار a یک واحد کم میشه و مقدار اولیه 7 هست وقتی کم میشه به 0 میرسه و شرط if(a == 255) برقرار نمیشه !و اگه اضافه بشه به a از 0 تا 7 هیچوقت به a مقدار دهی نمیشه !
    البته من کلا در برنامه نویسی و avr تازه وارد هستم اگه اشتباه از من هست به حساب نادانی من بگزارید و ممنون میشم اگه بیشتر راهنمایی کنین
    اختیار دارید قربان ... نفرمایید ...
    اتفاقا" یکی از دوستان هم همین سوال رو کرد
    اینجا رو ببین
    http://www.eca.ir/forum2/index.php?topic=90246.msg602691#msg602691
    زمانی که متغیر صفر باشه و یکی ازش کم کنید قاعدتا" باید بشه منفی یک ولی چون شما متغیرتون رو از نوع بدون علامت تعریف کردید میشه 255 و به خاطر همین شرط رو گذاشتم اگر مساوی 255 شد اون رو مساوی مقدار ماکسیمم قرار بده ...

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

    دیدگاه


      #92
      پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟

      سلام مهندس.
      آقا من میخوام به این روش 2 تا LED رو کم نور و پور نور کنم. آی سی attiny13! حدالامکان باید حجم برنامه کم باشه! چون کارای دیکه هم باید این آیسی انجام بده!
      با بسکام میخوام. اگه اسمبلی هم باشه بهتره
      ممنون

      دیدگاه


        #93
        پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟

        نوشته اصلی توسط giga0101
        سلام مهندس.
        آقا من میخوام به این روش 2 تا LED رو کم نور و پور نور کنم. آی سی attiny13! حدالامکان باید حجم برنامه کم باشه! چون کارای دیکه هم باید این آیسی انجام بده!
        با بسکام میخوام. اگه اسمبلی هم باشه بهتره
        ممنون
        سلام
        عیدتون مبارک باشه
        مگه مجبور هستید که با PWM نرم افزاری اینکار رو بکنید ؟؟؟
        اگر با تایمر نمیخواهید کاری بکنید میتوانید با PWM خود میکرو کار کنید که تنها کافیه چند رجیستر را تنظیم کنید و PWM کار کنه و از همه مهمتر دیگه پردازشی نمیگیره ...
        این هم برنامش ...
        کد:
          $regfile = "attiny13.dat"
          $crystal = 9600000
        
          $hwstack=20
          $swstack=16
          $framesize = 20
        
          Clkpr = 128
          Clkpr = 0
        
          ' Input/Output Ports initialization
          ' Port B initialization
          ' Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
          ' State5=T State4=T State3=T State2=T State1=0 State0=0
          Portb = &H00
          Ddrb = &H03
        
          ' Timer/Counter 0 initialization
          ' Clock source: System Clock
          ' Clock value: 37.500 kHz
          ' Mode: Fast PWM top=&hFF
          ' OC0A output: Non-Inverted PWM
          ' OC0B output: Non-Inverted PWM
          Tccr0a = &HA3
          Tccr0b = &H04
          Tcnt0 = &H00
          Ocr0a = 100
          Ocr0b = 200
        
        
        
          Do
        
        
        
          Loop
          End
        میتوانید مقادیر 0 تا 255 را به دو رجیستر OCR0A و OCR0B مقداردهی کنید ...
        پایه های 5 و 6 هم PWM هستند .

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

        دیدگاه


          #94
          پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟

          سلام مهندس عید شما هم مبارک
          ایشالا... که همیشه موفق و سربلند باشید.
          ممنون بابت برنامتون. برای دو خروجی خوبه اما برای چهار خروجی مخصوصا پایه های غیر pwm دیگه نمیشه از این روش بهره برد.
          امکانش هست برنامه کم حجمی ایجاد کرد؟
          باز هم ممنونم از شما که اینقدر پیگیر هستید...

          دیدگاه


            #95
            پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟

            نوشته اصلی توسط giga0101
            سلام مهندس عید شما هم مبارک
            ایشالا... که همیشه موفق و سربلند باشید.
            ممنون بابت برنامتون. برای دو خروجی خوبه اما برای چهار خروجی مخصوصا پایه های غیر pwm دیگه نمیشه از این روش بهره برد.
            امکانش هست برنامه کم حجمی ایجاد کرد؟
            باز هم ممنونم از شما که اینقدر پیگیر هستید...
            منظورتون اینه که با PWM نرم افزاری میخواین کار کنید ؟؟؟
            بله میشه
            ولی چون تنها یک تایمر دارید و باید از این تایمر استفاده بشه دیگه نمیتونید از تایمر استفاده های دیگه ای کنید ...
            البته چون برای LED میخواین و دقت زیاد براتون مهم نیست 20 طیف و فرکانسش هم 100 هرتز میگیریم ...
            20 ضرب در 100 میشه 2000 . پس باید تایمر را روی 1/2000 ثانیه (500میکرو ثانیه) تنظیم کنید و با فرض اینکه فرکانس میکرو به صورت پیشفرض باشه (9.6 مگا هرتز) و مقسم فرکانسی روی 64 باشد مقدار تایمر باید روی 75 تنظیم شود بنابراین برنامه ای که شما میخواین اینجوری میشه ...
            کد:
              $regfile = "attiny13.dat"
              $crystal = 9600000
            
              $hwstack = 20
              $swstack = 16
              $framesize = 20
            
              Config Portb.0 = Output
              Config Portb.1 = Output
              Config Portb.2 = Output
              Config Portb.3 = Output
              Config Portb.4 = Output
            
              Led1 Alias Portb.0
              Led2 Alias Portb.1
              Led3 Alias Portb.2
              Led4 Alias Portb.3
              Led5 Alias Portb.4
            
              Max_var_pwm Alias 19
            
             Dim Pwm(6) As Byte , A As Byte
             A = Max_var_pwm
              'Config All =============================================
              'Config Timers
              'Config Ports
               Config Timer0 = Timer , Prescale = 64
               Enable Compare0a
               On Compare0a T0
               ' Timer / Counter 0 Initialization
               ' Clock source: System Clock
               ' Clock value: 150.000 kHz
               ' Mode: CTC top=OCR0A
               TCCR0A=&H02;
               TCCR0B=&H03;
               Ocr0a = &H4A;
               ' Global enable interrupts
               Enable Interrupts
              'End Config ============================================
              Clkpr = 128
              Clkpr = 0
            
              Pwm(1) = 4
              Pwm(2) = 8
              Pwm(3) = 12
              Pwm(4) = 16
              Pwm(5) = 19
              Do
            
              Loop
              End
            
            T0:
              If A > 0 Then
               If A = Pwm(1) Then Set Led1
               If A = Pwm(2) Then Set Led2
               If A = Pwm(3) Then Set Led3
               If A = Pwm(4) Then Set Led4
               If A = Pwm(5) Then Set Led5
              End If
              Decr A
              If A = 255 Then
               A = Max_var_pwm
               Portb = 0
              End If
            Return
            5تا PWM ساختم که بری حالشو ببری :nerd:
            موفق باشید
            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
            معرفی نرم افزار Codewizard PWM
            با من بیشتر آشنا شوید

            دیدگاه


              #96
              پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

              سلام مهندس من یه برنامه میخام البته بسکام کار میکنم وبرنامه نویسی هم در حد صفر ویک کردن پینهای میکرو تعریف زمان ویت وحلقه تکرار بلدم برای تابلو ثابت ال ای دی میخام حالا برنامه میخام طوری باشه مثلا هشت پین پرت دی کم نور(ال ای دیها) میشن وروی همون حالت کم نور میمونن حالا میاد روی کانالها مچرخه پرنور میشه بعد یه زمان کوتاه پرنور میشه و میره همینجوری به کانالهای بعدی؟
              از شدن میشه من فلاشرشو تومشهد دیدم فقط با میکرو اتمگا8 وزبان بیسیک باشه ممنون میشم راهنمایی کنین
              متشکرم

              دیدگاه


                #97
                پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                سلام
                جناب اسدی از بابت وقتی که میذارید بسیار سپاسگذارم

                مهندس من از طریق pwm میخام ولتاژی حدودا بین 1100 میلی ولت تا 2500 میلی ولت بگیرم

                بنابراین pwm باید ولتاژی بین بازه ی 1100 تا 2500 میلی بهم بده و در حالت عادی که از FAST PWM استفاده نمیکردم و PWM هم بین بازه ی 0 تا 1023 مقدار دهی میشد این مقدار رو بهم میداد

                ولی الان که شما FAST PWM رو روی 16 کیلو تنظیم کردید مقداردهی و بازه ی شمارش بین 0 تا 499 شد. بااین وجود بنظرتون مقدار ولتاژ رو تا 2.5 ولت میتونه ساپورت میکنه ؟


                ================================================== ====
                و در نهایت 2 تا سوال

                1=FAST PWM با PWM عادی چه فرقی میکنه ؟ ولتاژ خروجی یا چیز دیگه ایش فرق میکنه ؟

                2= فرکانس در PWM چه تاثیری داره ؟ حالا اگر مثلا 16 یا 10 کیلو باشه چه اتفاقی می افته ؟

                متشکرم
                یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                دیدگاه


                  #98
                  چگونه PWM را به ولتاژ DC تبدیل کنیم؟؟

                  نوشته اصلی توسط رسول21
                  سلام مهندس من یه برنامه میخام البته بسکام کار میکنم وبرنامه نویسی هم در حد صفر ویک کردن پینهای میکرو تعریف زمان ویت وحلقه تکرار بلدم برای تابلو ثابت ال ای دی میخام حالا برنامه میخام طوری باشه مثلا هشت پین پرت دی کم نور(ال ای دیها) میشن وروی همون حالت کم نور میمونن حالا میاد روی کانالها مچرخه پرنور میشه بعد یه زمان کوتاه پرنور میشه و میره همینجوری به کانالهای بعدی؟
                  از شدن میشه من فلاشرشو تومشهد دیدم فقط با میکرو اتمگا8 وزبان بیسیک باشه ممنون میشم راهنمایی کنین
                  متشکرم
                  سلام
                  ببین دوست عزیز ...
                  ابتدا باید برنامه نویسی رو خوب یاد بگیری تا بدونی میخوای چیکار کنی و ... اینجور حرفا ...
                  بعد بری سراغ PWM که کار کردن با اون خیلی لذت بخشه ...
                  PWM به مجموعه پالسی گفته میشه که فرکانس ثابت داره و فقط دیوتی سایکل (میزان درصد یک بودن به کل دوره تناوب ) آن فرق میکند ...

                  حتما توی درس تحلیل مدار الکتریکی یا تکنیک پالس این رو خواندید که مقدار ولتاژ متوسط یک موج مربعی را باید با انتگرال یا به عبارت دیگه مساحت یک دوره تناوب به دست آوریم ...
                  مثلا" :
                  موجی دارای 50% دیوتی سایکل (duty cycle) و با سطح ولتاژهای 0 و 5 ولت میباشد . مقدار ولتاژ متوسط موج مربعی را حساب کنید ...
                  2.5=(5-0)*(50/100)
                  مقدار ولتاژ متوسط موج مربعی 2.5 ولت میباشد ...

                  حالا هر چه قدر دیوتی سایکل کمتر باشد مقدار ولتاژ متوسط کمتر خواهد بود ...
                  این از یادگیری PWM ...

                  حالا میریم سر اصل مطلب ...
                  ببین دوست عزیز
                  برنامه ای که من نوشتم به این صورت هست که چند تا متغیر تعریف شده که به هر کدام مقداری بدهیم درصد دیوتی سایکل آن تغییر میکند ... به عبارت دیگر ولتاژ متوسط پایه های خروجی تغییر میکند ...
                  بنابراین فقط کافیه که به هر کدام از متغیرهای تعیین شده مقدار خاصی بدهیم ...
                  مثلا توی برنامه زیر طوری نوشته شده که چندتا LED به صورت منظم کم نور و به یک سمت شیفت پیدا میکند ...
                  کد:
                  $regfile = "m8def.dat"
                   $crystal = 8000000
                  
                   Led1 Alias portd.0
                   Led2 Alias portd.1
                   Led3 Alias portd.2
                   Led4 Alias portd.3
                   Led5 Alias portd.4
                   Led6 Alias Portb.6
                   Led7 Alias Portb.7
                   Led8 Alias Portd.5
                   Led9 Alias Portd.6
                   Led10 Alias Portd.7
                   Led11 Alias Portb.0
                   Led12 Alias Portb.1
                   Led13 Alias Portb.2
                   Led14 Alias Portb.3
                   Led15 Alias Portb.4
                   Led16 Alias Portb.5
                   Led17 Alias Portc.0
                   Led18 Alias Portc.1
                   Led19 Alias Portc.2
                   Led20 Alias Portc.3
                   Led21 Alias Portc.4
                   Led22 Alias Portc.5
                  
                   Max_var_pwm Alias 99
                   Max_led Alias 22
                   Delay1 Alias 20
                   'ms
                   Delay2 Alias 200
                   'ms
                   Dim Pwm(35) As Byte , A As Byte , _
                   Y2 As Byte , _
                   X1 As Byte , X2 As Byte , X3 As Byte
                   Y2 = Max_led + Max_led
                   A = Max_var_pwm
                  
                    'Config All =============================================
                    'Config Timers
                    'Config Ports
                     Config Timer0 = Timer , Prescale = 8
                     Enable Interrupts
                     Enable Timer0
                     On Ovf0 T0
                     Tcnt0 = 105
                     Start Timer0
                     Ddrb = 255
                     Ddrc = 63
                     Ddrd = 255
                    'End Config ============================================
                  
                    Do
                     X1 = 0
                     While X1 < Y2
                       X2 = Max_led
                       While X2 > 1
                        X3 = X2 - 1
                        Pwm(x2) = Pwm(x3)
                        Decr X2
                       Wend
                       Pwm(1) = Lookup(x1 , Rain)
                       Waitms Delay1
                       Incr X1
                     Wend
                     Waitms Delay2
                    Loop
                  End                             'end program
                  
                  
                  T0:
                    Tcnt0 = 105
                    If A > 0 Then
                     If A = Pwm(1) Then Led1 = 1
                     If A = Pwm(2) Then Led2 = 1
                     If A = Pwm(3) Then Led3 = 1
                     If A = Pwm(4) Then Led4 = 1
                     If A = Pwm(5) Then Led5 = 1
                     If A = Pwm(6) Then Led6 = 1
                     If A = Pwm(7) Then Led7 = 1
                     If A = Pwm(8) Then Led8 = 1
                     If A = Pwm(9) Then Led9 = 1
                     If A = Pwm(10) Then Led10 = 1
                     If A = Pwm(11) Then Led11 = 1
                     If A = Pwm(12) Then Led12 = 1
                     If A = Pwm(13) Then Led13 = 1
                     If A = Pwm(14) Then Led14 = 1
                     If A = Pwm(15) Then Led15 = 1
                     If A = Pwm(16) Then Led16 = 1
                     If A = Pwm(17) Then Led17 = 1
                     If A = Pwm(18) Then Led18 = 1
                     If A = Pwm(19) Then Led19 = 1
                     If A = Pwm(20) Then Led20 = 1
                     If A = Pwm(21) Then Led21 = 1
                     If A = Pwm(22) Then Led22 = 1
                  
                    End If
                    Decr A
                    If A = 255 Then
                     A = Max_var_pwm
                     Portb = 0
                     Portc = 0
                     Portd = 0
                    End If
                  Return
                  
                   Rain:
                   Data 99 , 80 , 70 , 60 , 40 , 20 , 15 , 9 , 7 , 5 , _
                      3 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , _
                      0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
                      0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
                      0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
                  برای یادگیری بهتر پستهای قبل تر هم هست که اگر کامل مطالعه کنید خیلی از بحثها دستتون میاد ... و خیلی از مباحث رو یاد میگیرید ...
                  ================================================== ===================

                  نوشته اصلی توسط اقای دکتر
                  سلام
                  جناب اسدی از بابت وقتی که میذارید بسیار سپاسگذارم
                  مهندس من از طریق pwm میخام ولتاژی حدودا بین 1100 میلی ولت تا 2500 میلی ولت بگیرم
                  بنابراین pwm باید ولتاژی بین بازه ی 1100 تا 2500 میلی بهم بده و در حالت عادی که از FAST PWM استفاده نمیکردم و PWM هم بین بازه ی 0 تا 1023 مقدار دهی میشد این مقدار رو بهم میداد
                  ولی الان که شما FAST PWM رو روی 16 کیلو تنظیم کردید مقداردهی و بازه ی شمارش بین 0 تا 499 شد. بااین وجود بنظرتون مقدار ولتاژ رو تا 2.5 ولت میتونه ساپورت میکنه ؟
                  ================================================== ====
                  و در نهایت 2 تا سوال
                  1=FAST PWM با PWM عادی چه فرقی میکنه ؟ ولتاژ خروجی یا چیز دیگه ایش فرق میکنه ؟
                  2= فرکانس در PWM چه تاثیری داره ؟ حالا اگر مثلا 16 یا 10 کیلو باشه چه اتفاقی می افته ؟
                  متشکرم
                  سلام
                  خواهش میکنم ... برای پیشرفت ایران عزیزمان هر کاری بکنیم باز هم کمه ...
                  خوب سوال شما برمیگرده به مداری که بتونه PWM رو به ولتاژ DC تبدیل کنه ...
                  این مدار قبلا" باهاش کار کردم و خیلی دقیق هم کار میکنه ...
                  موقعی که با PWM کار میکنید دو بحث پیش میاد ...
                  1- دقت PWM
                  2- و دیگری فرکانس PWM
                  این دو با هم رابطه عکس دارند ...
                  مسلما" هر دو مورد گفته شده هر چه بیشتر شود بهتر است ولی چون این دو مورد با هم رابطه عکس دارند باید هر دو را طوری تعیین کنیم که نه دقت پایین آید و نه فرکانس آن ...
                  بنابراین هر دو را باید طوری تعیین کرد که هر کدام فدای دیگری نشود ...
                  مسلما هر چه فرکانس بیشتر شود ریپل ولتاژ DC کمتر خواهد بود ولی از آنجایی که میدانیم اگر فرکانس بیشتر شود دقت PWM کمتر میشود ...
                  دقت PWM همان مقادیری است که تعیین میکنیم ...
                  مثلا" : 0 تا 100
                  0 تا 200
                  0 تا 1000
                  که هر چه بیشتر شود بهتر است ولی تا جایی که قابل حس باشد ...
                  =========
                  مداری که در مورد آن بحث کردیم اینه ...

                  مدارش ساده ولی دقیق ...
                  فرکانس PWM هم در حد 4-5 کیلو هرتز باشه خوبه ...
                  زیاد واجب نیست که دقیق باشه .... ولی دیوتی سایکل PWM باید دقیق باشه ...
                  بنابراین با PWM نرم افزاری نمیشه به دقت و سرعت مورد نیاز رسید و باید حتما از سخت افزار کمک بگیرید ...
                  مقدار فرکانس رو 4 کیلو هرتز در نظر میگیریم ...
                  بنابراین اگر 8000000/4000 کنیم میشه 2000 مقدار n ما میشه 2000 و چون شمارش دیجیتال از 0 تا n-1 است میشه 0 تا 1999
                  رجیستر ها رو اینطور قرار دهید . فراموش نشود که پایه مورد نظر حتما باید خروجی تعریف شود ...
                  کد:
                    Config Portb.1 = Output
                    ' Timer / Counter 1 Initialization
                    ' Clock source: System Clock
                    ' Clock value: 8000.000 kHz
                    ' Mode: Fast PWM top=ICR1
                    ' OC1A output: Non-Inv.
                    ' Noise Canceler: Off
                    ' Input Capture on Falling Edge
                    Tccr1a = &H82
                    Tccr1b = &H19
                    Icr1 = 1999
                    Ocr1a = 0
                  بنابراین مقادیری که باید به OCR1A بدهیم 0 تا 1999 هست ...
                  5000 میلی ولت رو تقسیم بر 2000 میکنیم میشه 2.5 میلی ولت ... یعنی هر یک از مقدار 0 تا 1999 مقدار 2.5 میلی ولت را به ما میدهد ...
                  مثلا" اگر 2 ولت خواستیم درست کنیم باید 2000میلی ولت رو تقسیم بر 2.5 میلی ولت کنیم که میشه 800
                  اگر مقدار 800 را به OCR1A بدهیم ولتاژ خروجی مدارمان 2ولت خواهد بود ...
                  ================================================== =========
                  و اما
                  نوشته اصلی توسط اقای دکتر
                  و در نهایت 2 تا سوال
                  1=FAST PWM با PWM عادی چه فرقی میکنه ؟ ولتاژ خروجی یا چیز دیگه ایش فرق میکنه ؟
                  نه ... فرقی نمیکنه ... اگر دو تا PWM که از یک منبع تولید میشوند را در نظر بگیریم میتوان Fast PWM را تعریف کرد ولی در اینجا که تنها یک PWM داریم مفهومی ندارد ... البته Fast PWM بیشتر معنی یکی از مدهای تایمر کانتر را می دهد ...

                  نوشته اصلی توسط اقای دکتر
                  2= فرکانس در PWM چه تاثیری داره ؟ حالا اگر مثلا 16 یا 10 کیلو باشه چه اتفاقی می افته ؟
                  بستگی به کاربرد داره ... نمیشه گفت که کدام بهتر است ... همانطور که قبلا هم گفتم اگر دقت برایتان مهم باشد باید فرکانس را پایین آوریم ولی در بعضی جاها که دقت زیاد مطرح نباشد باید فرکانس را بالا برد ...

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

                  دیدگاه


                    #99
                    پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                    سلام مهندس واقعا ممنونم کاملا شیوا توضیح دادید

                    خوب سوال شما برمیگرده به مداری که بتونه PWM رو به ولتاژ DC تبدیل کنه ...
                    این مدار قبلا" باهاش کار کردم و خیلی دقیق هم کار میکنه ...
                    اتفاقا منم از مداری مشابه این دارم استفاده میکنم

                    مقدار فرکانس رو 4 کیلو هرتز در نظر میگیریم ...
                    بنابراین اگر 8000000/4000 کنیم میشه 2000 مقدار n ما میشه 2000 و چون شمارش دیجیتال از 0 تا n-1 است میشه 0 تا 1999
                    رجیستر ها رو اینطور قرار دهید . فراموش نشود که پایه مورد نظر حتما باید خروجی تعریف شود ...

                    کد:
                      Config Portb.1 = Output
                      ' Timer / Counter 1 Initialization
                      ' Clock source: System Clock
                      ' Clock value: 8000.000 kHz
                      ' Mode: Fast PWM top=ICR1
                      ' OC1A output: Non-Inv.
                      ' Noise Canceler: Off
                      ' Input Capture on Falling Edge
                      Tccr1a = &H82
                      Tccr1b = &H19
                      Icr1 = 1999
                      Ocr1a = 0
                    بنابراین مقادیری که باید به OCR1A بدهیم 0 تا 1999 هست ...
                    5000 میلی ولت رو تقسیم بر 2000 میکنیم میشه 2.5 میلی ولت ... یعنی هر یک از مقدار 0 تا 1999 مقدار 2.5 میلی ولت را به ما میدهد ...
                    بنابراین اگر ما مثلا مقدار 1000 رو ریختیم درون OCR1A ,مقدار 2.5 ولت رو به ما میده درسته ؟


                    و در نهایت در این دستور
                    کد:
                    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 8
                    pwm لبه بالا رونده هست Compare A Pwm = Clear Up

                    در این قسمت که شما رجیسترها رو تنظیم کردید ؛این مسله لحاظ شده ؟

                    کد:
                      Config Portb.1 = Output
                      ' Timer / Counter 1 Initialization
                      ' Clock source: System Clock
                      ' Clock value: 8000.000 kHz
                      ' Mode: Fast PWM top=ICR1
                      ' OC1A output: Non-Inv.
                      ' Noise Canceler: Off
                      ' Input Capture on Falling Edge
                      Tccr1a = &H82
                      Tccr1b = &H19
                      Icr1 = 1999
                      Ocr1a = 0
                    یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                    دیدگاه


                      پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                      سلام
                      نوشته اصلی توسط اقای دکتر
                      اتفاقا منم از مداری مشابه این دارم استفاده میکنم
                      مدارتون رو میدونم چیه ...
                      این یکی که تغییراتی درون اون ایجاد کردم خیلی بهتره ... طی آزمایشات پی در پی ...
                      قدر این مدار رو بدونید ... :biggrin:
                      بدی این مدار این است که یه خورده با تاخیر تبدیل میکنه ...
                      بنابراین شما نمیتوانید در جایی استفاده کنید که تبدیلات تند تند تغییر کند ...

                      نوشته اصلی توسط اقای دکتر
                      بنابراین اگر ما مثلا مقدار 1000 رو ریختیم درون OCR1A ,مقدار 2.5 ولت رو به ما میده درسته ؟
                      بله دقیقا" درست میفرمایید ...

                      نوشته اصلی توسط اقای دکتر
                      و در نهایت در این دستور
                      کد:
                      Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 8
                      pwm لبه بالا رونده هست Compare A Pwm = Clear Up
                      اگر اون رجیسترها رو که گفتم بگذارید نیازی به این دستور نیست ...
                      ولی در هر صورت
                      ببین الان من خواستم با همین دستورات کار کنم ... ولی نمیشه ... محدودیت داره ... شاید من بلد نیستم ...
                      این از Help خود بسکام گرفتم
                      کد:
                      And the TIMER can be used in PWM mode.
                      You have the choice between 8, 9 or 10 bit PWM mode
                      مدی که ما در اینجا به کار بردیم هیچ یک از این 8 , 9 , 10 بیت رو به کار نبردیم ...
                      مدی که ما کار کردیم Fast PWM Top = ICR1 بوده که نمیدونم چطوری باید تنظیمش کنیم ...

                      نوشته اصلی توسط اقای دکتر
                      در این قسمت که شما رجیسترها رو تنظیم کردید ؛این مسله لحاظ شده ؟

                      کد:
                        Config Portb.1 = Output
                        ' Timer / Counter 1 Initialization
                        ' Clock source: System Clock
                        ' Clock value: 8000.000 kHz
                        ' Mode: Fast PWM top=ICR1
                        ' OC1A output: Non-Inv.
                        ' Noise Canceler: Off
                        ' Input Capture on Falling Edge
                        Tccr1a = &H82
                        Tccr1b = &H19
                        Icr1 = 1999
                        Ocr1a = 0
                      اگر لحاظ نبود که کار نمیکرد ...
                      پس 100% لحاظ شده ...
                      =============================
                      یه سوال
                      با دقت 2.5 میلی ولت براتون کافیه ؟
                      یا دقت بیشتری نیاز است ؟؟
                      مثلا به جای 2.5 میلی ولت بشه 1میلی ولت

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

                      دیدگاه


                        پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

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

                        این یکی که تغییراتی درون اون ایجاد کردم خیلی بهتره ... طی آزمایشات پی در پی ...
                        قدر این مدار رو بدونید ... :biggrin:
                        بدی این مدار این است که یه خورده با تاخیر تبدیل میکنه ...
                        بنابراین شما نمیتوانید در جایی استفاده کنید که تبدیلات تند تند تغییر کند ...
                        سلام
                        متشکرم
                        زمان پاسخگویی مهم هست


                        یه سوال
                        با دقت 2.5 میلی ولت براتون کافیه ؟
                        یا دقت بیشتری نیاز است ؟؟
                        مثلا به جای 2.5 میلی ولت بشه 1میلی ولت
                        اگر دقت بیتشر بشه که فک کنم بهتره .البته باید در عمل تست کنم

                        اگه بخایم دقت 1 میلی بگیریم چیکار باید بکینم ؟



                        یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                        دیدگاه


                          پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                          سلام
                          نوشته اصلی توسط اقای دکتر
                          زمان پاسخگویی مهم هست
                          زمان تغییرات چقدر میخوایین باشه ؟؟
                          تفاضل سطح ولتاژ خروجی حال با بعدی چقدر است ؟؟

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

                          دیدگاه


                            پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                            بنابراین با PWM نرم افزاری نمیشه به دقت و سرعت مورد نیاز رسید و باید حتما از سخت افزار کمک بگیرید ...
                            مقدار فرکانس رو 4 کیلو هرتز در نظر میگیریم ...
                            بنابراین اگر 8000000/4000 کنیم میشه 2000 مقدار n ما میشه 2000 و چون شمارش دیجیتال از 0 تا n-1 است میشه 0 تا 1999
                            رجیستر ها رو اینطور قرار دهید . فراموش نشود که پایه مورد نظر حتما باید خروجی تعریف شود ...

                            کد:
                              Config Portb.1 = Output
                              ' Timer / Counter 1 Initialization
                              ' Clock source: System Clock
                              ' Clock value: 8000.000 kHz
                              ' Mode: Fast PWM top=ICR1
                              ' OC1A output: Non-Inv.
                              ' Noise Canceler: Off
                              ' Input Capture on Falling Edge
                              Tccr1a = &H82
                              Tccr1b = &H19
                              Icr1 = 1999
                              Ocr1a = 0
                            بنابراین مقادیری که باید به OCR1A بدهیم 0 تا 1999 هست ...
                            5000 میلی ولت رو تقسیم بر 2000 میکنیم میشه 2.5 میلی ولت ... یعنی هر یک از مقدار 0 تا 1999 مقدار 2.5 میلی ولت را به ما میدهد ...
                            مثلا" اگر 2 ولت خواستیم درست کنیم باید 2000میلی ولت رو تقسیم بر 2.5 میلی ولت کنیم که میشه 800
                            اگر مقدار 800 را به OCR1A بدهیم ولتاژ خروجی مدارمان 2ولت خواهد بود ..
                            سلام

                            مهندس من مقادیر و رجیستر ها رو براساس اون چیزی که شما قرار دادید مقدار دهی کردم
                            و از صفر شروع کردم مقدار دهی یه OCR1A بصورت 10 تا 10 تا افزایش دادم ( 10 - 20 - 30 - 40 و....)

                            اولین مقدار رو 10 ریختم که بهم حدودا 980 میل داد

                            مثلا مقدار 40 رو 1111 میلی داد

                            چرا داره از 980 میلی شروع میکنه . هر پله ای حدودا 2.5 هست که مقدار 10 باید 25 میلی بده


                            کد:
                             Tccr1a = &H82
                             Tccr1b = &H19
                             Icr1 = 1999
                            
                            
                            
                            A_1 = 0
                            
                            Do
                            A_1 = A_1 + 10
                            Ocr1a = A_1
                            '***********************************************
                            Home
                            Lcd Ocr1a ; " "
                            
                            Wait 8
                            
                            Loop
                            End
                            =================================================

                            الان این رجیسترها در حالت 10 بیتی تنظیم شدند ؟
                            یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                            دیدگاه


                              پاسخ : چگونه PWM را به ولتاژ DC تبدیل کنیم؟؟

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

                              حتما توی درس تحلیل مدار الکتریکی یا تکنیک پالس این رو خواندید که مقدار ولتاژ متوسط یک موج مربعی را باید با انتگرال یا به عبارت دیگه مساحت یک دوره تناوب به دست آوریم ...
                              مثلا" :
                              موجی دارای 50% دیوتی سایکل (duty cycle) و با سطح ولتاژهای 0 و 5 ولت میباشد . مقدار ولتاژ متوسط موج مربعی را حساب کنید ...
                              2.5=(5-0)*(50/100)
                              مقدار ولتاژ متوسط موج مربعی 2.5 ولت میباشد ...

                              حالا هر چه قدر دیوتی سایکل کمتر باشد مقدار ولتاژ متوسط کمتر خواهد بود ...
                              این از یادگیری PWM ...

                              حالا میریم سر اصل مطلب ...
                              ببین دوست عزیز
                              برنامه ای که من نوشتم به این صورت هست که چند تا متغیر تعریف شده که به هر کدام مقداری بدهیم درصد دیوتی سایکل آن تغییر میکند ... به عبارت دیگر ولتاژ متوسط پایه های خروجی تغییر میکند ...
                              بنابراین فقط کافیه که به هر کدام از متغیرهای تعیین شده مقدار خاصی بدهیم ...
                              مثلا توی برنامه زیر طوری نوشته شده که چندتا LED به صورت منظم کم نور و به یک سمت شیفت پیدا میکند ...
                              کد:
                              $regfile = "m8def.dat"
                               $crystal = 8000000
                              
                               Led1 Alias portd.0
                               Led2 Alias portd.1
                               Led3 Alias portd.2
                               Led4 Alias portd.3
                               Led5 Alias portd.4
                               Led6 Alias Portb.6
                               Led7 Alias Portb.7
                               Led8 Alias Portd.5
                               Led9 Alias Portd.6
                               Led10 Alias Portd.7
                               Led11 Alias Portb.0
                               Led12 Alias Portb.1
                               Led13 Alias Portb.2
                               Led14 Alias Portb.3
                               Led15 Alias Portb.4
                               Led16 Alias Portb.5
                               Led17 Alias Portc.0
                               Led18 Alias Portc.1
                               Led19 Alias Portc.2
                               Led20 Alias Portc.3
                               Led21 Alias Portc.4
                               Led22 Alias Portc.5
                              
                               Max_var_pwm Alias 99
                               Max_led Alias 22
                               Delay1 Alias 20
                               'ms
                               Delay2 Alias 200
                               'ms
                               Dim Pwm(35) As Byte , A As Byte , _
                               Y2 As Byte , _
                               X1 As Byte , X2 As Byte , X3 As Byte
                               Y2 = Max_led + Max_led
                               A = Max_var_pwm
                              
                                'Config All =============================================
                                'Config Timers
                                'Config Ports
                                 Config Timer0 = Timer , Prescale = 8
                                 Enable Interrupts
                                 Enable Timer0
                                 On Ovf0 T0
                                 Tcnt0 = 105
                                 Start Timer0
                                 Ddrb = 255
                                 Ddrc = 63
                                 Ddrd = 255
                                'End Config ============================================
                              
                                Do
                                 X1 = 0
                                 While X1 < Y2
                                   X2 = Max_led
                                   While X2 > 1
                                    X3 = X2 - 1
                                    Pwm(x2) = Pwm(x3)
                                    Decr X2
                                   Wend
                                   Pwm(1) = Lookup(x1 , Rain)
                                   Waitms Delay1
                                   Incr X1
                                 Wend
                                 Waitms Delay2
                                Loop
                              End                             'end program
                              
                              
                              T0:
                                Tcnt0 = 105
                                If A > 0 Then
                                 If A = Pwm(1) Then Led1 = 1
                                 If A = Pwm(2) Then Led2 = 1
                                 If A = Pwm(3) Then Led3 = 1
                                 If A = Pwm(4) Then Led4 = 1
                                 If A = Pwm(5) Then Led5 = 1
                                 If A = Pwm(6) Then Led6 = 1
                                 If A = Pwm(7) Then Led7 = 1
                                 If A = Pwm(8) Then Led8 = 1
                                 If A = Pwm(9) Then Led9 = 1
                                 If A = Pwm(10) Then Led10 = 1
                                 If A = Pwm(11) Then Led11 = 1
                                 If A = Pwm(12) Then Led12 = 1
                                 If A = Pwm(13) Then Led13 = 1
                                 If A = Pwm(14) Then Led14 = 1
                                 If A = Pwm(15) Then Led15 = 1
                                 If A = Pwm(16) Then Led16 = 1
                                 If A = Pwm(17) Then Led17 = 1
                                 If A = Pwm(18) Then Led18 = 1
                                 If A = Pwm(19) Then Led19 = 1
                                 If A = Pwm(20) Then Led20 = 1
                                 If A = Pwm(21) Then Led21 = 1
                                 If A = Pwm(22) Then Led22 = 1
                              
                                End If
                                Decr A
                                If A = 255 Then
                                 A = Max_var_pwm
                                 Portb = 0
                                 Portc = 0
                                 Portd = 0
                                End If
                              Return
                              
                               Rain:
                               Data 99 , 80 , 70 , 60 , 40 , 20 , 15 , 9 , 7 , 5 , _
                                  3 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , _
                                  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
                                  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
                                  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
                              برای یادگیری بهتر پستهای قبل تر هم هست که اگر کامل مطالعه کنید خیلی از بحثها دستتون میاد ... و خیلی از مباحث رو یاد میگیرید ...
                              ================================================== ===================

                              سلام
                              خواهش میکنم ... برای پیشرفت ایران عزیزمان هر کاری بکنیم باز هم کمه ...
                              خوب سوال شما برمیگرده به مداری که بتونه PWM رو به ولتاژ DC تبدیل کنه ...
                              این مدار قبلا" باهاش کار کردم و خیلی دقیق هم کار میکنه ...
                              موقعی که با PWM کار میکنید دو بحث پیش میاد ...
                              1- دقت PWM
                              2- و دیگری فرکانس PWM
                              این دو با هم رابطه عکس دارند ...
                              مسلما" هر دو مورد گفته شده هر چه بیشتر شود بهتر است ولی چون این دو مورد با هم رابطه عکس دارند باید هر دو را طوری تعیین کنیم که نه دقت پایین آید و نه فرکانس آن ...
                              بنابراین هر دو را باید طوری تعیین کرد که هر کدام فدای دیگری نشود ...
                              مسلما هر چه فرکانس بیشتر شود ریپل ولتاژ DC کمتر خواهد بود ولی از آنجایی که میدانیم اگر فرکانس بیشتر شود دقت PWM کمتر میشود ...
                              دقت PWM همان مقادیری است که تعیین میکنیم ...
                              مثلا" : 0 تا 100
                              0 تا 200
                              0 تا 1000
                              که هر چه بیشتر شود بهتر است ولی تا جایی که قابل حس باشد ...
                              =========
                              مداری که در مورد آن بحث کردیم اینه ...

                              مدارش ساده ولی دقیق ...
                              فرکانس PWM هم در حد 4-5 کیلو هرتز باشه خوبه ...
                              زیاد واجب نیست که دقیق باشه .... ولی دیوتی سایکل PWM باید دقیق باشه ...
                              بنابراین با PWM نرم افزاری نمیشه به دقت و سرعت مورد نیاز رسید و باید حتما از سخت افزار کمک بگیرید ...
                              مقدار فرکانس رو 4 کیلو هرتز در نظر میگیریم ...
                              بنابراین اگر 8000000/4000 کنیم میشه 2000 مقدار n ما میشه 2000 و چون شمارش دیجیتال از 0 تا n-1 است میشه 0 تا 1999
                              رجیستر ها رو اینطور قرار دهید . فراموش نشود که پایه مورد نظر حتما باید خروجی تعریف شود ...
                              کد:
                                Config Portb.1 = Output
                                ' Timer / Counter 1 Initialization
                                ' Clock source: System Clock
                                ' Clock value: 8000.000 kHz
                                ' Mode: Fast PWM top=ICR1
                                ' OC1A output: Non-Inv.
                                ' Noise Canceler: Off
                                ' Input Capture on Falling Edge
                                Tccr1a = &H82
                                Tccr1b = &H19
                                Icr1 = 1999
                                Ocr1a = 0
                              بنابراین مقادیری که باید به OCR1A بدهیم 0 تا 1999 هست ...
                              5000 میلی ولت رو تقسیم بر 2000 میکنیم میشه 2.5 میلی ولت ... یعنی هر یک از مقدار 0 تا 1999 مقدار 2.5 میلی ولت را به ما میدهد ...
                              مثلا" اگر 2 ولت خواستیم درست کنیم باید 2000میلی ولت رو تقسیم بر 2.5 میلی ولت کنیم که میشه 800
                              اگر مقدار 800 را به OCR1A بدهیم ولتاژ خروجی مدارمان 2ولت خواهد بود ...
                              ================================================== =========
                              و امانه ... فرقی نمیکنه ... اگر دو تا PWM که از یک منبع تولید میشوند را در نظر بگیریم میتوان Fast PWM را تعریف کرد ولی در اینجا که تنها یک PWM داریم مفهومی ندارد ... البته Fast PWM بیشتر معنی یکی از مدهای تایمر کانتر را می دهد ...
                              بستگی به کاربرد داره ... نمیشه گفت که کدام بهتر است ... همانطور که قبلا هم گفتم اگر دقت برایتان مهم باشد باید فرکانس را پایین آوریم ولی در بعضی جاها که دقت زیاد مطرح نباشد باید فرکانس را بالا برد ...

                              امیدوارم که خوب توضیح داده باشم ...
                              موفق باشید
                              با تشکر از پاسخگوییتون مهندس
                              برنامه شما ولتاژو کمتر میکنه و شیفت میده به کانال بعدی من میخام توی همون سطح پایین ولتاژ بمون وبعد با کانالها بازی کنم پر نور بشه و بچرخه :eek: :eek: :eek: :eek:

                              دیدگاه


                                پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                                نوشته اصلی توسط اقای دکتر
                                سلام

                                مهندس من مقادیر و رجیستر ها رو براساس اون چیزی که شما قرار دادید مقدار دهی کردم
                                و از صفر شروع کردم مقدار دهی یه OCR1A بصورت 10 تا 10 تا افزایش دادم ( 10 - 20 - 30 - 40 و....)

                                اولین مقدار رو 10 ریختم که بهم حدودا 980 میل داد

                                مثلا مقدار 40 رو 1111 میلی داد

                                چرا داره از 980 میلی شروع میکنه . هر پله ای حدودا 2.5 هست که مقدار 10 باید 25 میلی بده


                                کد:
                                 Tccr1a = &H82
                                 Tccr1b = &H19
                                 Icr1 = 1999
                                
                                
                                
                                A_1 = 0
                                
                                Do
                                A_1 = A_1 + 10
                                Ocr1a = A_1
                                '***********************************************
                                Home
                                Lcd Ocr1a ; " "
                                
                                Wait 8
                                
                                Loop
                                End
                                سلام مهندس
                                من همین الان مدار را روی Proteus تست کردم ...
                                درسته ... مدار اونقدر هم دقیق نیست ... ولی تا اون حد و حدود جواب میده ...
                                طبق گفته های خودم هر عدد برابر است با ۲.۵ میلی ولت ...
                                همونطور که میدانید خروجی این پ امپ مقدارهای بسیار پایین را خوب جواب نمی دهد ... پس حداقل از 50 میلی ولت به بالا حساب کنید ...
                                مثلا اگر من توی این برنامه
                                کد:
                                  $regfile = "m8def.dat"
                                  $crystal = 8000000
                                
                                  Config Portb.1 = Output
                                  ' Timer / Counter 1 Initialization
                                  ' Clock source: System Clock
                                  ' Clock value: 8000.000 kHz
                                  ' Mode: Fast PWM top=ICR1
                                  ' OC1A output: Non-Inv.
                                  ' Noise Canceler: Off
                                  ' Input Capture on Falling Edge
                                  Tccr1a = &H82
                                  Tccr1b = &H19
                                  Icr1 = 1999
                                
                                
                                
                                
                                  '''''''''''''''''''''''''''''
                                  Ocr1a = 30
                                  '''''''''''''''''''''''''''''
                                
                                
                                
                                
                                  Do
                                
                                  Loop
                                
                                End                             'end program
                                به OCR1A مقدار 30 را بدهیم باید خروجی برابر با 75 میلی ولت باشد ...
                                الان توی پروتئوس مقدار 84.4 یا 84.3 را نمایش میدهد ...
                                و مقدار های دیگر ...
                                OCR1A=40 Vout=108mV
                                OCR1A=50 Vout=133mV
                                OCR1A=60 Vout=157mV
                                OCR1A=70 Vout=182mV
                                OCR1A=80 Vout=207mV
                                OCR1A=90 Vout=232mV
                                OCR1A=100 Vout=257mV
                                OCR1A=200 Vout=507mV
                                OCR1A=300 Vout=757mV
                                OCR1A=400 Vout=1.01V
                                OCR1A=500 Vout=1.26V
                                OCR1A=600 Vout=1.51V
                                OCR1A=700 Vout=1.76V
                                OCR1A=800 Vout=2.01V
                                OCR1A=900 Vout=2.26V
                                OCR1A=1000 Vout=2.51V
                                این هم فایل پروتئوس + سورس کد ...
                                نوشته اصلی توسط اقای دکتر
                                الان این رجیسترها در حالت 10 بیتی تنظیم شدند ؟
                                در اینجا مقدار Top =1999 است که دقیقا نمیشه گفت که چند بیتی است ... میشه گفت نزدیک به 11 بیت (دو به توان 11 میشه 2048)



                                نوشته اصلی توسط رسول21
                                با تشکر از پاسخگوییتون مهندس
                                برنامه شما ولتاژو کمتر میکنه و شیفت میده به کانال بعدی من میخام توی همون سطح پایین ولتاژ بمون وبعد با کانالها بازی کنم پر نور بشه و بچرخه :eek: :eek: :eek: :eek:
                                بهتون گفتم این تاپیک رو مطالعه کنید کردید ؟؟؟؟
                                نکردید ....
                                اگر میکردید میتوانستید با یک تغییرات در حلقه Do-Loop اون چیزی که میخواین رو انجام بدهید ...
                                بعد از اینکه خوب مطالعه کردید بهم خبر بدید تا دوباره راهنماییتون کنم ... :applause:
                                بهتون این اطمینان میدهم که خودتون برنامه رو بنویسید ... :agree:

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

                                دیدگاه

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