امتیاز موضوع:
  • 3 رأی - میانگین امتیازات: 4.67
  • 1
  • 2
  • 3
  • 4
  • 5
Servo???
نویسنده پیام
bozonghare آفلاین
كاربر دو ستاره
**

ارسال‌ها: 185
موضوع‌ها: 9
تاریخ عضویت: آبان ۱۳۸۷

تشکرها : 110
( 164 تشکر در 90 ارسال )
ارسال: #12
RE: Servo???
تریب جان من نمیخوام ازون روش استفاده کنم توضیح دادم چجوری میخوام

اصلا سروو رو فراموش کن میخوام با بیسکام یک برنامه بنویسم که فرکانس 50 هرتز مربعی تولید کنه و بشه توش نیم سیکل مثبت رو از 1 تا 2 میلی ثانیه تغییر داد با مگا 8 و کریستال 8 مگ و بیسکام ببینم چکار میکنی؟

بشه سیکل مثبت رو بدست گرفت بقیش حله

هنوز وقت برای پیشرفت باقیست

اطلاعات خویش را به دیگران بیاموزید تا دیگران راه رفته شما را دوباره نروند بلکه ادامه دهند!

(آخرین ویرایش در این ارسال: ۰۲-اسفند-۱۳۸۷, ۰۱:۱۱:۱۷، توسط bozonghare.)
۳۰-بهمن-۱۳۸۷, ۲۰:۰۷:۲۵
ارسال‌ها
پاسخ
t3r!p3000 آفلاین
         
*****

ارسال‌ها: 5,050
موضوع‌ها: 83
تاریخ عضویت: اردیبهشت ۱۳۸۵

تشکرها : 34447
( 17423 تشکر در 5116 ارسال )
ارسال: #13
RE: Servo???
خوب هر 10 میلی ثانیه یه خروجی رو toggle کنی فرکانس 50 درست می شه .

اون توابع هم همین کارو می کنن .

برای تغییر سیکل کاری هم کافیه مثلا 8 میلی ثانیه صفر و 12 میلی ثانیه پایه یک بشه . همین .

البته با تایمرها بهتره انجام بدی .
۰۲-اسفند-۱۳۸۷, ۰۳:۱۹:۵۳
ارسال‌ها
پاسخ
bozonghare آفلاین
كاربر دو ستاره
**

ارسال‌ها: 185
موضوع‌ها: 9
تاریخ عضویت: آبان ۱۳۸۷

تشکرها : 110
( 164 تشکر در 90 ارسال )
ارسال: #14
RE: Servo???
خوب من این برنامه رو با کمک کتاب نوشتم:
از اون دستور TOGGLE که گفتی هم استفاده کردم:


$regfile = "M8DEF.DAT"
$crystal = 16000000


Config Portc = Output
Ddrc.0 = 1 : Portc.0 = 0
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer1
Enable Ovf1
On Timer1 Lable

Timer1 = 57722
Start Timer1

Do
Loop

End


Lable:
Toggle Portc.0
Timer1 = 57722
Start Timer1
Return


این برنامه وقتی میره تو LABLE هر نیمثانیه پورت C رو معکوس میکنه که یک فرکانس با طول موجهای ثابت و یکنواخت بدست میاد (1 هرتز)

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

هنوز وقت برای پیشرفت باقیست

اطلاعات خویش را به دیگران بیاموزید تا دیگران راه رفته شما را دوباره نروند بلکه ادامه دهند!

(آخرین ویرایش در این ارسال: ۰۵-اسفند-۱۳۸۷, ۰۳:۵۶:۲۱، توسط bozonghare.)
۰۵-اسفند-۱۳۸۷, ۰۳:۵۴:۴۸
ارسال‌ها
پاسخ
تشکر شده توسط : zereshk
ilgar آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 843
موضوع‌ها: 17
تاریخ عضویت: اردیبهشت ۱۳۸۷

تشکرها : 383
( 2597 تشکر در 855 ارسال )
ارسال: #15
RE: Servo???
آقای bozonghare چیزی که شما خواسته بودین با روش PWM بصورت دقیق بدست میاد ولی به عنوان ساده ترین روش میتونین از برنامه پایینی استفاده کنین:
تو این برنامه مقدار طول موجو به میلی ثانیه میتونین با تقسیم ولتاژ مقاومتی و بوسیله ADC بدست بیارین. تازه این تقسیم ولتاژم به عنوان فیدبک از یه قسمت مدار هم میتونین بکار بگیرین روشهای مختلف دیگه ای هم هست که میتونین مقدار طول موجو به میکرو تعریف کنید(بد ترین و کم انعطاف ترین حالت استفاده از کیپد)

کد php:
Do
()
Getadc
Set Portd.0
Waitms A
Reset Portd.0
Waitms A
LOOP 
۰۵-اسفند-۱۳۸۷, ۱۵:۵۲:۳۲
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
bozonghare آفلاین
كاربر دو ستاره
**

ارسال‌ها: 185
موضوع‌ها: 9
تاریخ عضویت: آبان ۱۳۸۷

تشکرها : 110
( 164 تشکر در 90 ارسال )
ارسال: #16
RE: Servo???
بله ILGAR جان من از روش شما استفاده کردم ولی میدونین مشکلش چیه اون متغیر A از 1 تا 2 تفییر میکنه با اعشار مثلا 1.25 وقتی A اعشاری میشد Waitms فقط اعداد صحیح رو میگرفت یعنی از 1 تا 1.6 رو همون 1 حساب میکرد و 1.6 به بالا رو 2 میگرفت (تو اسیلوسکوپ پروتئوس قشنگ معلومه)

اگه این مشکل نبود کار من حل بود ولی مجبور شدم از WAITUS استفاده کنم و 1.25 جمو ضرب در 1000 کنم و بزارم تو A و بعد بگم : WAITUS A باز مشکل اینجا بود که WAITUS درست عمل نمیکرد و مجبور شدم 1 تا 2 رو به 40 قسمت تقسیم کنم و از دستور JMP استفاده کنم:

If V2 =< 1.00 Then
Jmp B
End If
If V2 > 1.00 And V2 < 1.025 Then
JMP C
End If
If V2 > 1.025 And V2 < 1.05 Then
JMP D
End If
If V2 > 1.05 And V2 < 1.075 Then
JMP E

.
.
.
.

B:
Set Portd.0
Waitus 1000
Reset Portd.0
Waitms 18

Return

C:
Set Portd.0
Waitus 1025
Reset Portd.0
Waitms 18

Return
D:
Set Portd.0
Waitus 1050
Reset Portd.0
Waitms 18
.
.
.


ممکنه درباره PWM یکم توضیح بدی برا این کار من؟؟؟؟

هنوز وقت برای پیشرفت باقیست

اطلاعات خویش را به دیگران بیاموزید تا دیگران راه رفته شما را دوباره نروند بلکه ادامه دهند!

(آخرین ویرایش در این ارسال: ۰۷-اسفند-۱۳۸۷, ۰۰:۳۵:۳۴، توسط bozonghare.)
۰۷-اسفند-۱۳۸۷, ۰۰:۲۵:۰۲
ارسال‌ها
پاسخ
ilgar آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 843
موضوع‌ها: 17
تاریخ عضویت: اردیبهشت ۱۳۸۷

تشکرها : 383
( 2597 تشکر در 855 ارسال )
ارسال: #17
RE: Servo???
خوب اینکه مشکلی نیست به جای msاز us استفاده کنین و بازه تغییر ولتاژ ADC رو جوری انتخاب کنین که حداقل یک میلی ثانیه در 0 ولت و حداکثر 2 میلی ثانیه در 5 ولت براتون بده.
حواستون به میزان کلاکی که میکرو برای عمل ()getkbd مصرف میکنه باشه این مقدارو تاحدی با روش آزمون خطا میتونین بدست بیاریدش.
۰۷-اسفند-۱۳۸۷, ۰۰:۳۴:۵۰
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
bozonghare آفلاین
كاربر دو ستاره
**

ارسال‌ها: 185
موضوع‌ها: 9
تاریخ عضویت: آبان ۱۳۸۷

تشکرها : 110
( 164 تشکر در 90 ارسال )
ارسال: #18
RE: Servo???
این روشیکه من استفاده کردم راحته ولی کلا 40 نقطه برا 1 تا2 درست کردم که خیلیم وقت گرفت نمیدونم برنامم تو مگا 8 جا میگیره یا نه 483 خط شده این پست آخر منظورتونو نفهمیدم ممکنه با برنامه توضیح بدین؟

هنوز وقت برای پیشرفت باقیست

اطلاعات خویش را به دیگران بیاموزید تا دیگران راه رفته شما را دوباره نروند بلکه ادامه دهند!

(آخرین ویرایش در این ارسال: ۰۷-اسفند-۱۳۸۷, ۱۳:۰۷:۵۷، توسط bozonghare.)
۰۷-اسفند-۱۳۸۷, ۰۰:۴۴:۰۵
ارسال‌ها
پاسخ
bozonghare آفلاین
كاربر دو ستاره
**

ارسال‌ها: 185
موضوع‌ها: 9
تاریخ عضویت: آبان ۱۳۸۷

تشکرها : 110
( 164 تشکر در 90 ارسال )
ارسال: #19
RE: Servo???
من اینو طبق گفته شما نوشتم ولی WAITUS متغیر B رو که از 1000 تا 2000 تغییر میکنه قبول نمیکنه:

$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 A As Word
Dim V2 As Single
Dim V3 As Single
Dim V As Single
Dim B As Single
Config Adc = Single , Prescaler = Auto , Reference = Avcc


Start Adc
Do

A = Getadc(1)
V2 = A
V2 = V2 / 1024
B = 1 + V2
B = B * 1000
Set Portd.0
Waitus B
Reset Portd.0
Waitms 18

V3 = A
V3 = V3 / 1024
V3 = V3 * 5

Cls
Lcd "V=" ; Fusing(v3 , "#.##") ; " VOLT"
Home Lower
Lcd "T=" ; Fusing(b , "#.##") ; " U.SEC"


Loop
End


اینم تصویر مدار:

[تصویر:  887ondbj7f5w3chvg6lf.jpg]

هنوز وقت برای پیشرفت باقیست

اطلاعات خویش را به دیگران بیاموزید تا دیگران راه رفته شما را دوباره نروند بلکه ادامه دهند!

(آخرین ویرایش در این ارسال: ۰۷-اسفند-۱۳۸۷, ۱۳:۱۴:۵۰، توسط bozonghare.)
۰۷-اسفند-۱۳۸۷, ۱۳:۱۱:۵۴
ارسال‌ها
پاسخ
ilgar آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 843
موضوع‌ها: 17
تاریخ عضویت: اردیبهشت ۱۳۸۷

تشکرها : 383
( 2597 تشکر در 855 ارسال )
ارسال: #20
RE: Servo???
1) تعداد سطر زیاد مهم نیست، بیشتر نوع دستور و دیمانسیون متغیرها مهمه
2)کامپایلش کنین ببینین 8 کلیو میشه یانه؟! همچین برنامه ای نباید انقدر سطر اشغال کنه ، از حلقه تکرار و یه شمارنده نمیتونستین تو الگوریتمتون استفاده کنین؟ (اینم بگم یه بار من تا 700 سطرو تو مگا 8 جا دادم)
3)0 ولت ADC رو به عنوان 1000 میکرو ثانیه تنظیمش کنین تا 5 ولت تو ADC که 1024 رو تولید میکنه 2024 میکروثانیه رو براتون بده. اونموقع بین 1و2 میلی ثانیه رو به 1024 قسمت تنظیمش کردین
کد php:
dim a as word
a
=getadc()
a=a+1000
waitus a 

4)اگه در حد میکرو ثانیه کار کنین چون میزان کلاکهایی (وقتی)که میکرو صرف عمل ADC میکنه اهمیت پیدا میکنه و قابل چشمپوشی نمیشه. این وقت هم به مقدار waitus شما افزوده میشه.
5) اینهمه تو برنامتون END IF نکنید میتونید ازELSE IF استفاده کنید
6)با تعریفی که از PWM دارم میشه پالسهای مربعی و مستطیل وحتی مثلثی شکل با استفاده از تایمرها باهاش تولید کرد.طرز کارش هم یه چیزی تو مایه های مدولاسیون فرکانسی تو مخابرات هستش. تا حالا موقعیتی پیش نیومده که باهاش کار کنم اگه دوستان دیگه در این زمینه حضور ذهن دارن لطفاً ارائه کنن
7) تو هلپ بیسکام یه نگاهی هم به دستور sound بندازین
۰۷-اسفند-۱۳۸۷, ۱۵:۲۸:۵۶
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
bozonghare آفلاین
كاربر دو ستاره
**

ارسال‌ها: 185
موضوع‌ها: 9
تاریخ عضویت: آبان ۱۳۸۷

تشکرها : 110
( 164 تشکر در 90 ارسال )
ارسال: #21
RE: Servo???
الان برنامه من درسته مال شما هم تقریبا شبیه برنامه من فقط تقسیم و ضرب کم داره... مشکل اینجای که در Waitus A ، این دستور درست عمل نمیکنه ، اگه درست عمل کنه که برنامه درسته ، یعنی مثلا 1500 میلی ثانیه یا همون 1.5 میلی ثانیه رو نمیشمره این تو شبیه ساز پروتئوس کاملا مشخصه میخواین شما هم تست کنین همین برنامه بالای من و مداریکه کشیدم ، اونم که یک سروو هست و از 1 تا 2 میلی ثانیه لازم داره تا از -90 درجه بشه 90 درجه.
؟؟؟
اینم برنامه طبق فرموده شما:


$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 A As Word
Dim V2 As Single
Dim V3 As Single
Dim V As Single
Dim B As Single
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





B = A
V3 = A / 2
V3 = V3 / 1024
V3 = V3 * 5


Cls
Lcd "V=" ; Fusing(v3 , "#.##") ; " VOLT"
Home Lower
Lcd "T=" ; Fusing(b , "#.##") ; " U.SEC"


Loop
End


LCD دقیقا از 1000 تا 2000 میکرو ثانیه رو نشون میده یعنی عددی که تو A ریخته شده ولی دستور Waitus درست عمل نمیکنه نمیدونم چرا شما میدونین چرا؟؟ امتحان کنید

هنوز وقت برای پیشرفت باقیست

اطلاعات خویش را به دیگران بیاموزید تا دیگران راه رفته شما را دوباره نروند بلکه ادامه دهند!

(آخرین ویرایش در این ارسال: ۰۷-اسفند-۱۳۸۷, ۲۳:۰۶:۰۷، توسط bozonghare.)
۰۷-اسفند-۱۳۸۷, ۲۲:۵۵:۱۸
ارسال‌ها
پاسخ
ilgar آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 843
موضوع‌ها: 17
تاریخ عضویت: اردیبهشت ۱۳۸۷

تشکرها : 383
( 2597 تشکر در 855 ارسال )
ارسال: #22
RE: Servo???
خوب گفتم که !
اینهمه دستورو گذاشتین داخل do - loop انتظار دارین waitus درست عمل کنه؟!
میدونین چقدر وقت میکرو صرف این دستورا میشه. شاید هم وقت رسیدگی میکرو به دستورهای داخل حلقه بیشتر از یک میلی ثانیه (که براتون مهمه )باشه.

من دیگه نمیخوام مطالب قبلی رو تکرار کنم لطفاً پستهای قبلی منو یک بار دیگه مرور کنید
۰۸-اسفند-۱۳۸۷, ۱۴:۳۷:۵۳
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Sad servo motor sg5010 DORAN 3 6,363 ۱۶-شهریور-۱۳۸۹, ۲۱:۴۴:۱۹
آخرین ارسال: saeidjan
  servo motor alizeraatcar 21 21,003 ۳۰-تير-۱۳۸۸, ۱۰:۴۰:۵۳
آخرین ارسال: t3r!p3000
  servo sg5010 nex2004 1 3,538 ۳۱-شهریور-۱۳۸۷, ۱۹:۵۷:۰۱
آخرین ارسال: 1nafar

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 6 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS