با سلام من میخوام یه برنامه بنویسم که دو تا موج pwm بسازم با فرکانس 22-2 کیلو هرتز و پهنای پالس 10% تا 90% که فرکانس وپهنای پالس با کلید قابل تغییر باشد میخوام این کارا با مگا 64 و با کدویژن لطفا کمک کنید ممنونم
اطلاعیه
Collapse
No announcement yet.
pwm
Collapse
X
-
پاسخ : pwm
برای تغییر فرکانس میتونی مقادیر جدید مقسم یک تایمر رو حساب کنی و تایمرت رو جوری ست کنی که با فرکانس مورد نطرت روتیه وقفه اش صدا زده بشه و در اون فقط یک متغیر رو ++ کنی.
برای تغییر duty cycle هم یک متغیر ثانوی میخوای که اون حاوی مقدار duty cycle ات باشه و خروجی pwm رو هم از مقایسه این دو متغیر با هم ست کنی. اگر یکی بزرگتر از اون یکی باشه خروجی رو ست کن و در غیر اینصورت ریست.
-
پاسخ : pwm
هر pwm در یک برهه زمانی متشکل از یک سری بیتهای 0 و 1 هست که بسته به duty cycle موج نسبت بین تعداد بیتهای 0 و 1 تغییر میکنه. مثلا:
01010101 برای یک سیکل 50 درصدی.
00010001 برای یک سیکل 25 درصدی.
اما طول یک بیت بستگی به یک ثابت زمانی داره که فرکانس پایه اون حساب میشه (2 تا 22 کیلو هرتز) و تسط یک تایمر بایستی حساب بشه. و این پترن ها مرتب تکرار میشه.
حالا برای داشتن duty cycle های متفاوت بایستی طول این پترن ثابت زیاد باشه و سرعت کلاک هم بالا. مثلا کلاک ثابت 22 کیلو هرتز (ثابت زمانی تقریبی 45 میکرو ثانیه) و پترنی به طول مثلا 36 بیت که با این حساب شما به دقتی در حدود 180/36 یا 5 درجه میرسین.
در ابتدای ست کردن duty cycle بین 0 تا 180 درجه این پترن بایستی به تعداد مورد نیاز از 1 و 0 پر بشه. و در این مرحله deadtime با یک سری بیت بین این دو حالت اضافه یشه. بعد تایمر تنظیم شده و استارت بشه. سپس در روال تایمر بیت به بیت به پورت خروجی ارسال بشه و در صورت رسیدن به انتهای لیست از ابتدای اون دوباره شروع بشه.
دیدگاه
-
پاسخ : pwm
من اینکه گفتم فقط با استفاده از یک تایمره نه بیشتر. شاید هم بشه برای راحتی از spi استفاده کرد ولی کدش رو شرمنده یک کمی سرم شلوغه اگر تونستم تا یکی دو روز دیگه انجام بدم خدمتتون میفرستم. ولی اصلش ایده اش است. بقیه اش یه کمی وقت بذاری خودت میتونی حلش کنی. (به کسی نگی شاید خودمم یه لافی اومدم توش موندم!!!)
دیدگاه
-
پاسخ : pwm
ولله من چیزی که از بسکام میدونم اینه که برای هر موردی یک shortcut گذاشته. حالا با این وضعیت بشه به صورت lowlevel کار کرد یا نه من خودم هنوز گیجم. بخاطر همین وقتی پای بسکام وسط میاد نمیدونم چی بگم. چون شما یک کدی مینویسین. ولی واقعا نمیشه گفت چه کدی داره اجرا میشه. اینجوری آدم یه کمی دقیقا موقعی که میخواد روی جزئیات کار کنه کر و کور میشه.
اگر C باشه تا حد زیادی میونم کد معادل رو براتون قید کنم اما بسکام شرمنده.
البته بنا بر چیزایی که از بیسیک از زمان دانشکده یادم مونده (تقریبا 20 سال پیش) یک کدی میشه نوشت:
Dim Pattern(36) As Byte ' Storage for Pattern
Dim SendIndex As Integer ' Index of pattern bit to be send
Dim TriggerLevel As Integer ' Scaled PWM Level (0..36)
Dim I As Integer ' You know
Dim Preset As Integer ' PWM Level 0..100
SendIndex = 1
TriggerLevel = (Preset * 36) / 100 ' Preset in 0..100
for I=1 to 36
if i >= TriggerLevel Then
Pattern(i) = 1
Else
Pattern(i) = 0
EndIf
Next I
SetOut:
OutPort = Pattern(SendIndex)
SendIndex = SendIndex + 1
if SendIndex = 36 + 1 Then
SendIndex = 1
EndIf
Return
البته کد تولیدی این روتین خیلی خوب نیست. ولی باید جواب بده. مثلا عوض اینکه پترن 50 درصدی رو 01010101 تولید کنه بصورت 00001111 تولید میکنه. که خوب البته میشه الگوریتم بهتری استفاده کرد.
دیدگاه
دیدگاه