ايران ويج

نسخه‌ی کامل: تغییر adc وpwm هم زمان
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4
(۱۸-دى-۱۳۹۱, ۱۵:۱۳:۰۹)abbasalifix نوشته است: [ -> ]مرسی شاید برناهمه ها همه درست باشه اما تو این برنلمه میخواستم که پروتئوس نشون بده که فک کنم چون خیلی مدار و برنامه زیاد بود نموتونه نشون بده
بستگی به cpu داره اگر ارور داد یعنی زورش نمی رسه اگر هم نمی ده شک نکن برنامه مشکل داره
همه ي برنامه ها درسته ...
من قبلنا با يه پتانسيومتر و موتور تست كردم.
پروتوس رو بندازيد كنار ، وگرنه سر كاريد ...

همونطور كه مي دونيد براي ADC هم بهترهه چند بار مقدار رو مخوني و ميانگين بگيري و بعد اعمال كني. تاخير هم بذاريد مشكلي نيست ( عامل محدود كننده سرعت موتور هست ، پس نگران نباشيد. )
این برنامه و فایل شبیه سازی
مشکل زیاد بود
برنامه رو ببینید
توی شبیه سازی هم کریستال رو درست انتخاب نکرده بودید

تایمر ها شروع به کار نکرده بودند
نیازی به حلقه FOR نبود
به تایمر ها مقدار نمیدادید
بعد از نمایش دستور توقف زیاد بود
نیازی به اون همه پاک کردن ال سی دی نبود
اسیلوسکپ روی دیجیتال نبود

اولی رو من دیدم
مرسی اما pwm یه جوری داره تغییر میکنه انگار که صفر نمیشه یا به حد اکثر نمیره
اون تایمر هایی که شما استفاده کردید 16بیتی هستن
با کم کردن دقت PWM چیزی عوض نمشه بازم باید بهش 0 تا 2^16 بدید

با کم کردن دقت اینجوری میشه مثلا 10 یه مقداری هست 12 هم همون مقدار رو داره

اگه میخواید کامل بشه باید اینجوری کنید
کد:
x=x*65535
x=x/1023
pwm=x
نوع متغییر هم دقت شود
کاش برنامه رو هم میزاشتین
با عرض معضرت انگار PWM جداست Biggrin
شما این کارو بکن حل میشه
جای همه ی اون بالایی ها که الان پاکشون کردم اینو بنویسید
کد:
pwm1a=v1
pwm1b=v2
pwm1c=v3
چون مرجع بیشترین دقته رفتم یه نگاهی به دیتاشیت انداختم

پس برنامه این شد
کد:
$regfile = "m128def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down , Prescale = 8
Config Graphlcd = 128 * 64 , Dataport = Porta , Controlport = Portc , Ce = 0 , Cd = 1 , Wr = 2 , Rd = 3 , Reset = 4 , Fs = 5 , Mode = 8
Cursor Off
Enable Timer1
Start Timer1
Config Portb.5 = Output
Config Portb.6 = Output
Config Portb.7 = Output
Dim A As Byte
A = 1
Dim V1 As Word
Dim V2 As Word
Dim V3 As Word

Dim Va As Single
Dim Vb As Single
Dim Vc As Single

Dim Va1 As String * 7
Dim Vb1 As String * 7
Dim Vc1 As String * 7

Goto Sh1
V:
Do

V1 = Getadc(0)
Va = V1 / 204.6
Va1 = Fusing(va , "#.##")


V2 = Getadc(1)
Vb = V2 / 204.6
Vb1 = Fusing(vb , "#.##")

V3 = Getadc(2)
Vc = V3 / 204.6
Vc1 = Fusing(vc , "#.##")


Cls

Locate 1 , 1
Lcd "ADC(0):" : Lcd Va1 : Lcd " v"
Locate 2 , 1
Lcd "ADC(1):" : Lcd Vb1 : Lcd " v"
Locate 3 , 1
Lcd "ADC(2):" : Lcd Vc1 : Lcd " v"
Waitms 100

Pwm1a = V1
Pwm1b = V2
Pwm1c = V3

Loop


Sh1:
Cls
Cls Text
Cls Graph
Showpic 0 , 0 , Pic1 , 1
Wait 1

Sh2:
Cls
Cls Text
Cls Graph
Showpic 1 , 0 , Pic2 , 1
Wait 1
Goto V
End

Pic1:
$bgf "uni.bgf"
Pic2:
$bgf "f.bgf"
Goto V
مرسی با کمک شما رفع شد
این برنامه رو برای یه جای دیگه هم میخوام برایهمین برام اینقدر مهم بود
منبع یادتون نره Biggrin
پس نتیجه میگریم :
تایمر ها بیت هاشون باهم فرق داره
باید من یه تایمر 8 بیتی انتخاب میکردم و تایمر یک یک تایمر 8 بیتی هست که در این حالت میشه مقدارشو با pwm مساوی قرار داد
-----
چرا برای تایمر 0 فرمان استارت تایمر و فعال کردن تایمر رو نمی نویسیم ؟
صفحه‌ها: 1 2 3 4