ايران ويج

نسخه‌ی کامل: Servo???
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4
برنامه 480 خط بیشتر نیست ولی فایل هگز 16 کیلوبایت شده . تو میکرو مگا8 جا میشه؟

بفرما اینم برنامه بدون LCD و خیلی کوتاه بازم کار نمیکنه(نه سروو میچرخه و نه تو اسکوپ نشون میده): چرا؟؟


$regfile = "m8def.dat"
$crystal = 8000000



Config Portd = Output
Dim A As Word

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc
Do
A = Getadc(1)
A = A + 1000
Set Portd.0
Waitus A
Reset Portd.0
Waitus 18000
Loop
End
کد php:
Getadc(1
این خط خودش به اندازه کل حلقه طول می کشه .
منظورت چیه اگه ایرادی میبینی خوب رفعش کن تا درست کار کنه!!!؟؟

مشکل اینه که دستور WAIT درست کار نمیکنه!
دستور Wait درست کار می کنه در صورتی که فرکانس کریستال رو درست وارد کرده باشی . ( فیوز بیت ها فراموش نشه )


من پیشنهاد می کنم اول برنامه یه بار مقدار AGC رو بخون و تو برنامه دیگه نخون و اینطوری امتحان کن .

کد php:
$regfile "m8def.dat"
$crystal 8000000

Config Portd 
Output
Dim A 
As Word

Config Adc 
Single Prescaler Auto Reference Avcc


Start Adc

Getadc(1)
1000

Do

     
Set Portd.0
     Waitus A
     Reset Portd.0
     Waitus 18000

Loop
End 
اینم امتحان کردم کار نمیکنه یعنی هم سروو رو 90- باقی میمونه مثل قبل و هم تو اسکوپ تاخیر 1000 میکرو رو نمیبینی!
خوب شما هم یبار امتحان کن شاید پروتئوس من مشکل داره این تصویر مدار(همونطور که تو تصویر میبینی نیم سیکل مثبت بصورت یک خط عموده و بازه ای ندارهSad

http://www.dehcadeh.com/upload/images/88...hvg6lf.jpg
مهندس من نفهمیدم چرا از توابع آماده بسکام استفاده نمی کنی ؟؟

تایم دیویژنت هم زیاده .

و بهتر نیست برای زمان بندیت از تایمر استفاده کنی حالا که می گی waitus مشکل داره .
البته شاید دستور waitus از نوع 8 بیتی باشه و حداکثر بشه 255 رو بهش داد. ( البته بعید می دونم اینطوری باشه ) .

این برنامه رو هم یه تست کن :

کد php:
$regfile "m8def.dat" $crystal 8000000

Config Timer1 
Timer Prescale 64
Enable Interrupts 
Enable Timer1 On Timer1 Ant Stop Timer1

Dim A 
As Word As Word

Config Adc 
Single Prescaler Auto

Ddrd 
255  

Gosub Ant 
Start Timer1

Do
      
Set Portd.0
      Waitms A
      Reset Portd.0
      Waitms B
Loop

Ant
:
      
Start Adc Getadc(1) : Stop Adc
      A 
20 50 A
Return 
بله خوب شد گفتین میکروثانیش از نوع 8 بیتیه ولی میلی ثانیش از نوع 16 بیتی.
ولی اگه از تایمر استفاده بشه باز همون تأخیر وسط برنامه پیش میاد اینبار دیگه سرعت غر یکنواخت میشه چون تایمر هر جا که دلش خواست اجرای برنامه رو قطع میکنه.
اگه بخواین دائم سرعتو عوضش کنین چاره ای نیست و باید دائماً مقدار گیری کنید و این وقت میبره ولی اگه بخواین سرعت قابل تنظیم باشه ولی در طول برنامه یک روند ثابتیو طی کنه همون ADC بهترین پیشنهاده.
ببینم نمیشه زمانهای بزرگتری به موتورتون بدین (در حد چند ده میلی ثانیه) ؟
آقا تریب
ممکنه درباره برنامت توضیح بدی من که هرچی تفکر کردم متوجه نشدم Ddrd = 255 ؟؟؟
Start Adc : A = Getadc(1) : Stop Adc
A = A / 20 : B = 50 - A

اینا برا چیند


و این برنامه رو هم تست کردم جواب نداد
یعنی اون تغییر 1 تا 2 میلی ثانیه رو نداشت و اصلا سیکل قسمت مثبت کلا نداشت چه برسه به 1 میلی ثانیه!!!

آقا ILGAR چرا دستور WAITMS اعداد اعشاریرو قبول نمیکنه اگه 1 تا 2 رو قبول میکرد همه چی حل بود مثلا در برنامه زیر تا 1.5 رو همون 1 میگیره و از 1.6 تا 2 رو میپره به 2 و 2 قبول میکنه !!!:حتی A رو تو متغیر دیگری که SINGLE باشه ریختم که اعشاری بپذیره ولی مشکل از دستور WAITMS بود (پایین توضیح دادم چطور معلوم شد)
$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Output
Dim A As Word

Config Adc = Single , Prescaler = Auto , Reference = Avcc


Start Adc
Do

A = Getadc(1)
A = A / 1024
A = A + 1

Set Portd.0
Waitms A
Reset Portd.0
Waitms 18

Loop
End

اصلا نیازی هم به برنامه نیست میتوان با دادن عدد 1.5 یه دستور WAITMS تو خروجی با اسکوپ دید که تغییری نمیکنه! راستی چرا؟
اون Ddrd = 255 یعنی پورت د خروجی .
و برنامه قبلی یه فرکانس 50 هرتز درست می کرد با ضریب مدلاسیونی که توسط پتانسیومتر تنظیم می شد .
اون ضرب و تقسیم هم واسه همینه .
برنامه قبلی درسته و فقط سیکل کاریش 50 هرتز هستش .

-------------------------------------------------------------------

و مهندس تو این برنامه من هیچ ایرادی نمی بینم و مدت زمان یک بودن خروجی بین 1 تا 2 میلی ثانیه توسط پتانسیومرتری که به پایه 28 میکرو وصله قابل تنظیمه . کریستال میکرو هم فراموش نشه رو یک مگ بذاری .
کل سیکل هر پالس نیز 20 میلی ثانیه هست . یعنی زمان صفر بودن خروجی بسته به پتانسیومتر بین 18 تا 19 میلی ثانیه هستش . ( پایه های رفرنس آنالوگ میکرو هم فراموش نشه - پایه های 20 و 21 به 5 ولت و 22 به زمین )
تقریبا هر 4 ثانیه هم موقیعت پتانسیومتر خونده می شه . ( پایه 28 میکرو . ADC5 )
از هر پایه پورت d هم می توان به عنوان خروجی استفاده کرد .

کد php:
$regfile "m8def.dat" $crystal 1000000

Dim A 
As Byte As Byte As Word

Config Adc 
Single Prescaler Auto

Config Timer1 
Timer Prescale 64
Enable Interrupts 
Enable Timer1 On Timer1 Ant Start Timer1

Ddrd 
255 Gosub Ant

Do
      
Set Portd Waitms 1
      Waitus A 
Waitus A Waitus A Waitus A
      Reset Portd 
Waitms 18
      Waitus B 
Waitus B Waitus B Waitus B
Loop

Ant
:
      
Start Adc Getadc(5) : Stop Adc
      C 
255 A
Return 
تریپ جان برنامه شما اینطوریکه دیده میشه کاملا درسته و باید کار کنه ولی مسئله اینکه دستور WAITUS اصلا متغیر نمیپذیره! نمیدونم تو پروتئوس من این مشکل هست یا کلیه! برنامه شما به کنار برنامه پایین ریختن مقدار متغیر B که مقدارشم از 255 کوچکتر هست ، ثابت و بدون ADC ، کار نمیکنه!! ولی اگر مستقیم به WAITUS عدد بدیم اونوقت کار میکنه! حتی اگر 1000 هم مستقیم بدیم میپذیره و کار میکنه ولی متغیر نمیگیره چرا؟؟

$regfile = "m8def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Pinb.3 , Db5 = Pinb.2 , Db6 = Pinb.1 , Db7 = Pinb.0 , E = Pinb.4 , Rs = Pinb.5
Config Lcd = 16 * 2 : Cursor Off : Cls

Config Portd = Output

Dim B As Single


Do

B = 100
Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000

Loop
End
نمی دونم

فکر نمی کنید عیب از کامپایلر باشه .

بسکامتون ورژن چنده .
صفحه‌ها: 1 2 3 4