|
السلام عليكم
اخ حسن برنامجك يعمل بشكل رائع على كرستاله 4 و 8 ميحا
لكن عند ترددات اكبر فان قيمه داخل delay-cyc ستتجاوز القيمه 255
حيت ان برنامجك مصمم على تردد 4 ميجا لدلك عندما كنت اغير قبمه التردد متلا 8 ميجا كنت اضرب القيمه داخل delay _cyc ()بالرقم 2 وكدا
ستجد الملاحظه داخل mikroc help على القيم ل delay cyc
وايضا ما هي قيمه min pulse mikro second servo لاني لم اجد قيمتها الاوليه
بالتوفيق اخي حسن
|
السلام عليكم
حاولت كثيرا لتعديل ولم احصل على نتيجه مرضيه يعني يوجد اختلاف مثلا 4 درجات ولكن وجدت طريقه أفضل نحصل على دقه افضل وهي
عندما تقوم بأستخدام مكتبه عليك بدخول للمكتبه والتعديل كتالي
تكرر الكود بعدد (تردد كرستاله/4)
كود:
Delay_Cyc(angle_servo);
حيث كتبت الكود بتردد 32MHZ حيث تلاحظ اني كررت كود ديلي 8 مرات
وللعلم ان اقصى نبضه هي 2ms =2000us
وبالطبع المكتبه سوف يتم كتابه زاويه بعد قسمتها على 10 وبتالي اقصى قيمه هي 200 وبهذه طريقه Delay_Cyc يمكن استخدامها ولاتوجد اي مشكله في تردد الساعه
كود:
static void servo_init(char *port_servo,char *tris_servo,char pin_servo )
{
*port_servo=*port_servo & ~(1<< pin_servo);// this mean made pin=0 from porta or b or ..
*tris_servo=*tris_servo & ~(1<< pin_servo);// made pin from porta or b or ... is output
}
static void work_servo( unsigned int angle_servo , char *port_servo,char pin_servo ,
unsigned int min_pulse_micro_second_servo, unsigned int max_angle_servo
)
{
char pin_servo_on;char pin_servo_off;
pin_servo_off=*port_servo;// put value for port to pin_servo_off
pin_servo_on=*port_servo; //put value for port to pin_servo_on
pin_servo_on |=(1<< pin_servo);// now set pin in port ex if pin_servo=5 then pin_servo_on.f5=1
pin_servo_off &= ~(1<< pin_servo);// now clear pin in port ex if pin_servo=5 then pin_servo_on.f5=0
min_pulse_micro_second_servo=min_pulse_micro_second_servo/10;//
angle_servo=(angle_servo*100)/max_angle_servo;// divide 1000/10 =100 , 1000 mean change to microsecond , because Delay_Cyc result time in usec * by 10
angle_servo=(angle_servo+min_pulse_micro_second_servo);
*port_servo= pin_servo_on;// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110000; then *port_servo= pin_servo_on==>*port_servo= 0b11110010
// waitting time (( this time between min_puls and max_puls )) please see data sheet for serveo motor
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
Delay_Cyc(angle_servo);
*port_servo = pin_servo_off;//// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110010; then *port_servo= pin_servo_off==>*port_servo= 0b11110000
}