اطلاعیه

Collapse
No announcement yet.

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

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

  • amir 93101038
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط MAHDI ZAMANI
    پروگرامر شما چی هست؟
    آقا ممنون
    حل شد ، تونستم فیوز بیت ها رو تنظیم کنم
    برنامه هم عالی اجرا میشه
    ممنون از شما و مهندس اسدی.

    یک دیدگاه بنویسید:


  • zamanimahdi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط amir 93101038
    نه
    چطور باید این کار رو انجام بدم؟ با کد ویژن کار میکنم. درضمن اگر بخوام فیوزبیت های مربوط به کلاک رو تنظیم کنم باید بقیه رو هم دوباره تنظیم کنم؟ از اونجایی که هنوز تو این کار مبتدی ام و خیلی هم در مورد خطرات تنظیم اشتباه فیوز بیت شنیدم تا بحال سمتش نرفتم و با همون پیش فرض ها کار کردم. :redface:
    ممنون میشم پاسخ بدید یا یک تاپیک خوب مربوط به این موضوع معرفی کنید. :smile:
    پروگرامر شما چی هست؟

    یک دیدگاه بنویسید:


  • amir 93101038
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط MAHDI ZAMANI
    فیوزبیت هارو هم با فرکانس تطبیق داده اید؟
    نه
    چطور باید این کار رو انجام بدم؟ با کد ویژن کار میکنم. درضمن اگر بخوام فیوزبیت های مربوط به کلاک رو تنظیم کنم باید بقیه رو هم دوباره تنظیم کنم؟ از اونجایی که هنوز تو این کار مبتدی ام و خیلی هم در مورد خطرات تنظیم اشتباه فیوز بیت شنیدم تا بحال سمتش نرفتم و با همون پیش فرض ها کار کردم. :redface:
    ممنون میشم پاسخ بدید یا یک تاپیک خوب مربوط به این موضوع معرفی کنید. :smile:

    یک دیدگاه بنویسید:


  • zamanimahdi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط amir 93101038
    سلام دوستان،من تازه با این تا پیک آشنا شدم.
    برنامه ی موردنظر برای ایجاد pwm رو نوشتم اما قسمت افکت ا رو ننوشتم و ساده تر و فقط برای یک پورت نوشتم و با یک حلقه ی for دیوتی سایکل رو از 0 تا 99 تغییر دادم،اما یک مشکل دارم:
    Led پر پر میکند یعنی انگار تند تند داره خاموش روشن میشه و اون تدریجی کم و زیاد شدن وجود نداره.با هر مقاومتی هم امتحان کردم( 330 اهم، 4.7 کیلو اهم و... )
    لطفا دوستانی که در این تاپیک اشتراک داشته اند ،مخصوصا جناب اسدی،کمک کنند.
    میکرو atmega32a , فرکانس داخلی 8
    در ضمن اگر درمورد تنظیمات لازم برای timer0 در کدویزارد توضیح بدید ممنون میشم.
    فیوزبیت هارو هم با فرکانس تطبیق داده اید؟

    یک دیدگاه بنویسید:


  • amir 93101038
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    سلام دوستان،من تازه با این تا پیک آشنا شدم.
    برنامه ی موردنظر برای ایجاد pwm رو نوشتم اما قسمت افکت ا رو ننوشتم و ساده تر و فقط برای یک پورت نوشتم و با یک حلقه ی for دیوتی سایکل رو از 0 تا 99 تغییر دادم،اما یک مشکل دارم:
    Led پر پر میکند یعنی انگار تند تند داره خاموش روشن میشه و اون تدریجی کم و زیاد شدن وجود نداره.با هر مقاومتی هم امتحان کردم( 330 اهم، 4.7 کیلو اهم و... )
    لطفا دوستانی که در این تاپیک اشتراک داشته اند ،مخصوصا جناب اسدی،کمک کنند.
    میکرو atmega32a , فرکانس داخلی 8
    در ضمن اگر درمورد تنظیمات لازم برای timer0 در کدویزارد توضیح بدید ممنون میشم.

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط saeedbordbar
    فکر کردم برنامه ایراد داره چون فقط برا portd.0 عمل میکرد . اما الان با توجه به توصیه شمافهمیدم که باید داخل حلقه به جز (1)pwm . باید (2)pwm هم نوشته شود ، دوستان به دل نگیرید اینجانب مبتدی می باشم :icon_razz:
    به نظرم حالا بتونم برنامه رو برا کانال های بیشتر توسعه بدم . تشکر آقای اسدی @};-
    خواهش میکنم ...

    برنامه ای پیشرفته و راحت در دست ساخت است
    و دیگر نیازی به این همه دردسرها نیست و شما میتوانید بسیار آسان و سریع کدها را به دست آورید
    خیلی از دوستان به بنده گفتند که این برنامه بسیار ارزشمند است و میتوانی روی این برنامه پول خوبی به دست آوری ولی از آنجایی که زیبا کردن ایران عزیزمان برای من آرزویی دیرینه و خواسته قلبی من بوده است ، این نرم افزار را به صورت رایگان قرار خواهم داد تا همه به طور رایگان استفاده کنند ...
    تا الان فقط برای کامپایلر کدویژن نوشته شده و من میخواهم که برای سه نرم افزار کدویژن و بسکام و GCC با اتمل استودیو قابل استفاده باشد ...
    البته ... قول صددرصد نمیدم ... اگر عمری باقی باشه حتما قرار خواهم داد ...

    به امید پیشرفت و سربلندی ایران عزیزمان ... :rolleyes: :nerd:

    یک دیدگاه بنویسید:


  • saeedbordbar
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    فکر کردم برنامه ایراد داره چون فقط برا portd.0 عمل میکرد . اما الان با توجه به توصیه شما
    نوشته اصلی توسط سامان اسدی
    تنها کاری که شما باید انجام دهید این است که درون حلقه do-loop برنامه خودتون رو بنویسید
    فهمیدم که باید داخل حلقه به جز (1)pwm . باید (2)pwm هم نوشته شود ، دوستان به دل نگیرید اینجانب مبتدی می باشم :icon_razz:
    به نظرم حالا بتونم برنامه رو برا کانال های بیشتر توسعه بدم . تشکر آقای اسدی @};-

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط saeedbordbar
    با سلام
    من تو یه تاپیک قدیمی کنترل شدت نور LED می خواستم سوالاتمو مطرح کنم فرستادنم اینجا. من نه میخام تاپیک جدید بزنم نه پست اضافی بزنم حتی شرمنده دوستانی هستم که این همه توضیحات نوشتند و من باز سوال دارم. حقیقتش مقداری این تاپیک رو مطالعه کردم ولی هنوز نفهمیدم...
    در حال حاضر سوال مشخصم اینه میخام با اتمگا8 2 تا خروجی pwm بگیرم برای کنترل شدت نور.فعلا همینو یاد بگیرم بعد با مطالعه بیشتر اونو توسعه میدم به 8 کانال و شدت نور متغییر. این برنامه که زحمتشو کشیدید من متوجه نشدم.
    [code=vb] $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
    [/code]
    اگه ممکنه برای 2 خروجی بگید تا بعد روش کار کنم. قبلا با بسکام برنامه می نوشتم ولی الان یه سالی هست کلا از الکترونیک فاصله گرفتم ؛ امشب تازه پروگرامرمو از انباری پیدا کردم یه خورده مطالعه کردم و چیزی دستگیرم نشد
    خودم خاستم با استفاده از تاخیر waitus موج pwm درست کنم ، ولی نمی دونم عملی میشه!
    [code=vb]L1:
    A = &B11
    Portb = A
    Waitus 5
    A = &B01 : Portb = A
    Waitus 1
    A = &B0
    Portb = A
    Waitus 4
    Goto L1[/code]
    لطفا یک برنامه ساده برای 2 یا 3 خروجی بهم بدید تا بتونم تحلیل کنم.
    درود بر شما
    نخست از شما سپاسگذاری میکنم از اینکه تاپیک جدید باز نکردید
    نیازی نیست که خودتون موج PWM بسازید
    برنامه ای که نوشتم میتونید خیلی راحت اون کاری که بخواید رو انجام بده
    فقط باید به اندیس مورد نظر آرایه pwm تعیین کنید و به آن مقدار دهید ....
    همین ...
    این برنامه برای دوتا PWM طراحی شده
    این برنامه را که اجرا کنید خواهید دید که چه اتفاقی خواهد افتاد
    [code=vb] $regfile = "m8def.dat"
    $crystal = 8000000


    Led1 Alias portd.0
    Led2 Alias portd.1

    Max_var_pwm Alias 99
    Dim Pwm(5) As Byte , A As Byte
    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
    Ddrd = 255
    'End Config ============================================


    Do
    pwm(1) = 0
    waitms 500
    pwm(1) = 10
    waitms 500
    pwm(1) = 20
    waitms 500
    pwm(1) = 30
    waitms 500
    pwm(1) = 40
    waitms 500
    pwm(1) = 50
    waitms 500
    pwm(1) = 60
    waitms 500
    pwm(1) = 70
    waitms 500
    pwm(1) = 80
    waitms 500
    pwm(1) = 90
    waitms 500
    pwm(1) = 99
    waitms 500
    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

    End If
    Decr A
    If A = 255 Then
    A = Max_var_pwm
    Portd = Portd and 252
    End If
    Return
    [/code]




    اضافه شده در تاریخ :
    راستی
    شما نیازی به تحلیل کردن ندارید
    تنها کاری که شما باید انجام دهید این است که درون حلقه do-loop برنامه خودتون رو بنویسید
    به کدی که نوشتم دقت کنید
    روی عمل هم ببینید که چه اتفاقی خواهد افتاد

    موفق باشید

    یک دیدگاه بنویسید:


  • saeedbordbar
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    با سلام
    من تو یه تاپیک قدیمی کنترل شدت نور LED می خواستم سوالاتمو مطرح کنم فرستادنم اینجا. من نه میخام تاپیک جدید بزنم نه پست اضافی بزنم حتی شرمنده دوستانی هستم که این همه توضیحات نوشتند و من باز سوال دارم. حقیقتش مقداری این تاپیک رو مطالعه کردم ولی هنوز نفهمیدم...
    در حال حاضر سوال مشخصم اینه میخام با اتمگا8 2 تا خروجی pwm بگیرم برای کنترل شدت نور.فعلا همینو یاد بگیرم بعد با مطالعه بیشتر اونو توسعه میدم به 8 کانال و شدت نور متغییر. این برنامه که زحمتشو کشیدید من متوجه نشدم.
    [code=vb] $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
    [/code]
    اگه ممکنه برای 2 خروجی بگید تا بعد روش کار کنم. قبلا با بسکام برنامه می نوشتم ولی الان یه سالی هست کلا از الکترونیک فاصله گرفتم ؛ امشب تازه پروگرامرمو از انباری پیدا کردم یه خورده مطالعه کردم و چیزی دستگیرم نشد
    خودم خاستم با استفاده از تاخیر waitus موج pwm درست کنم ، ولی نمی دونم عملی میشه!
    [code=vb]L1:
    A = &B11
    Portb = A
    Waitus 5
    A = &B01 : Portb = A
    Waitus 1
    A = &B0
    Portb = A
    Waitus 4
    Goto L1[/code]
    لطفا یک برنامه ساده برای 2 یا 3 خروجی بهم بدید تا بتونم تحلیل کنم.

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط cortex-m3
    با سلام

    تعداد مطالب زیاده. اگه امکانش هست یه خلاصه و بلوک دیاگرام از روش pwm کردن همه پایه های Avr رو ذکر کنید.

    با تشکر
    درود
    دوست عزیز شما حتی به خودتون یه زحمتی ندادید که پست اول هم بخوانید ...

    نوشته اصلی توسط سامان اسدی
    یک توضیح مختصر در مورد برنامه :
    برنامه طوری طراحی شده که با استفاده از آرایه میتوانیم مقدار تک تک PWM ها را تغییر بدهیم
    آرایه ای که []pwm نام دارد را میتوانید اندیس آن را برای PWM دلخواهتان تنظیم کنید
    بازه مقدار آرایه PWM از 0 تا 99 است که نشانگر دیوتی سایکل است :biggrin:
    این آرایه یه جورایی میشه گفت که مثل رجیستر عمل میکنه . یعنی اینکه تا مقدار به آن بدهیم PWM تنظیم میشود .
    برنامه را کپی کنید و به آرایه pwm و اندیس مورد نظر مقدار بدهید ...
    همین ...
    موفق باشید

    یک دیدگاه بنویسید:


  • cortex-m3
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    با سلام

    تعداد مطالب زیاده. اگه امکانش هست یه خلاصه و بلوک دیاگرام از روش pwm کردن همه پایه های Avr رو ذکر کنید.

    با تشکر

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

    نوشته اصلی توسط soltanfarid
    تو این برنامه که نوشتم چه طور میتونم تاخیر بندازم مثلا همین پین علاوه بر کنترل روشنایی بتوان چشمک زن بشود ؟
    برنامه شما با اندکی تغییر

    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    Project : 32-channel PWM (Rain LED)
    Version : 2.1
    Date  : 2/27/2014
    Author : Saman.Asadi
    www.ECA.ir
    Chip type        : ATmega16
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    #include <mega8.h>
    #include <delay.h>
     
    #define ADC_VREF_TYPE 0x60
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      // Start the AD conversion
      ADCSRA|=0x40;
      // Wait for the AD conversion to complete
      while ((ADCSRA & 0x10)==0);
      ADCSRA|=0x10;
      return ADCH;
    }
     
    #define led PORTD.7
    #define max_var_PWM 100
    unsigned char a = max_var_PWM;
    unsigned char pwm[35];
     
    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    { 
        
     
      if(a == pwm[1])led=1;
      if(--a == 255)
      {
        a = max_var_PWM;
        PORTD = 0;  
        
        
      }
      
           
           
      
           
           
    }
     
    void main(void)
    {
      unsigned char x;
      //Config all
      {    
        //Config PORTS
        DDRD = 0xFF;
        
        //Config timers
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        // Mode: CTC top=OCR0
        // OC0 output: Disconnected
        TCCR0=0x02;
        TCNT0=150;   
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x01;
        // Global enable interrupts
        #asm("sei")
        
        //Config ADC
        // ADC initialization
        // ADC Clock frequency: 62.500 kHz
        // ADC Voltage Reference: AVCC pin
        // ADC Auto Trigger Source: ADC Stopped
        // Only the 8 most significant bits of
        // the AD conversion result are used
        ADMUX=ADC_VREF_TYPE & 0xff;
        ADCSRA=0x87;
      }
      //End Config ......
      while(1)
      { 
        x = read_adc(0)/2.55 ;
        pwm[1] = x ;
        delay_ms(50); 
        
        
        
          
      }
    }
    سلام
    ببخشید دیر پاسخ میدم ...

    توی این لینک دقیقا همین سوال شده و پاسخ هم دادم
    http://www.eca.ir/forum2/index.php?topic=90246.msg706110#msg706110

    دوستان عزیز تورو خدا تاپیک رو مطالعه کنید ...
    خواهشااااا ....
    ممنون از همکاریتون


    موفق باشید

    یک دیدگاه بنویسید:


  • soltanfarid
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

    نوشته اصلی توسط سامان اسدی
    سلام
    این که برنامه من نیست ...
    الان چه کمکی میتونم بکنم؟
    سلام

    برنامه شما با اندکی تغییر

    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    Project : 32-channel PWM (Rain LED)
    Version : 2.1
    Date  : 2/27/2014
    Author : Saman.Asadi
    www.ECA.ir
    Chip type        : ATmega16
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    #include <mega8.h>
    #include <delay.h>
     
    #define ADC_VREF_TYPE 0x60
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      // Start the AD conversion
      ADCSRA|=0x40;
      // Wait for the AD conversion to complete
      while ((ADCSRA & 0x10)==0);
      ADCSRA|=0x10;
      return ADCH;
    }
     
    #define led PORTD.7
    #define max_var_PWM 100
    unsigned char a = max_var_PWM;
    unsigned char pwm[35];
     
    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    { 
        
     
      if(a == pwm[1])led=1;
      if(--a == 255)
      {
        a = max_var_PWM;
        PORTD = 0;  
        
        
      }
      
           
           
      
           
           
    }
     
    void main(void)
    {
      unsigned char x;
      //Config all
      {    
        //Config PORTS
        DDRD = 0xFF;
        
        //Config timers
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        // Mode: CTC top=OCR0
        // OC0 output: Disconnected
        TCCR0=0x02;
        TCNT0=150;   
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x01;
        // Global enable interrupts
        #asm("sei")
        
        //Config ADC
        // ADC initialization
        // ADC Clock frequency: 62.500 kHz
        // ADC Voltage Reference: AVCC pin
        // ADC Auto Trigger Source: ADC Stopped
        // Only the 8 most significant bits of
        // the AD conversion result are used
        ADMUX=ADC_VREF_TYPE & 0xff;
        ADCSRA=0x87;
      }
      //End Config ......
      while(1)
      { 
        x = read_adc(0)/2.55 ;
        pwm[1] = x ;
        delay_ms(50); 
        
        
        
          
      }
    }

    یک دیدگاه بنویسید:


  • soltanfarid
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

    نوشته اصلی توسط سامان اسدی
    سلام
    این که برنامه من نیست ...
    الان چه کمکی میتونم بکنم؟
    تو این برنامه که نوشتم چه طور میتونم تاخیر بندازم مثلا همین پین علاوه بر کنترل روشنایی بتوان چشمک زن بشود ؟

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

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

    دقیقا همین شکلی پروگرم کردم

    با کمک پتانسیو متر روی پین صفر پورت شش pdm می اندازد

    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V1.25.8 Professional
    Automatic Program Generator
    © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 5/11/2015
    Author : F4CG              
    Company : F4CG              
    Comments: 
    
    
    Chip type      : ATmega8
    Program type    : Application
    Clock frequency   : 1.000000 MHz
    Memory model    : Small
    External SRAM size : 0
    Data Stack size   : 256
    *****************************************************/
    
    #include <mega8.h> 
    #include <delay.h> 
    #define ADC_VREF_TYPE 0x60 
    
    unsigned char data,sata;
    
    
    
    
     unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
    }
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {  
       
     
       if(PIND.6==1)
         { 
            PORTD.6=0; 
            
          
           
          
            TCNT0=sata;
          }
        if(PIND.6==0)
         { 
          
          PORTD.6=1; 
          
         
        
          TCNT0=data;
          
          } 
    
    // Place your code here
    
    }
    
    
    
     
    
    
    
    
    
    // Read the AD conversion result
    
    
    // Declare your global variables here
    
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0x00;
    DDRB=0x00;
    
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0xFF;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    TCCR0=0x02;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC Clock frequency: 500.000 kHz
    // ADC Voltage Reference: AVCC pin
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x82;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       { 
        
       data=read_adc(0);
      sata=256-data; 
      
       
       
      
       
        
        
          
       // Place your code here
    
       };
    }
    سلام
    این که برنامه من نیست ...
    الان چه کمکی میتونم بکنم؟

    یک دیدگاه بنویسید:

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