قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

محمد القادري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2011
المشاركات: 101
نشاط [ محمد القادري ]
قوة السمعة:
قديم 16-05-2016, 11:48 AM المشاركة 9   
افتراضي



1- الكود سليم وهذا عمله:
المقاومة المتغيرة تزيد أو تنقص في عرض نبضة التردد الخارج من الرجل للمتحكم:

2- الآن هناك ملاحظة:
في الكود تعليمة تقسم قيمة المتغير بسعة 10 بت على 4 وهذا حتى يكون الناتج على شكل رقم تنائي 8 بت:
temp_duty = (temp_res/4); // Convert the 10 bit value to 8 bits
لماذا هذه التعليمة؟
ربما واضع الكود يريد إظهار ناتج التحويل على البورت B
هو هيأ البورت B ليكون كخرج بالتعليمة ;TRISB=0
لكن ينقصه تعليمة العرض وهي:
;PORTB = temp_duty
ومكانها في الكود يجب أن يكون هنا:
PWM1_set_Duty(temp_duty); // Set the duty value
Delay_ms(50); // Slow everything down a little
;PORTB = temp_duty
مجرد احتمال..


تحويل القيمة من 10بت الى 8 بت اتوقع السبب الرئيسي لها هو الدالة الخاصة بالتحكم بقيمة ال duty cycle فبالرجوع ل وصف الدالة ..

PWM1_Set_Duty
Prototype void PWM1_Set_Duty(unsigned short duty_ratio);

Returns Nothing.

Description Sets PWM duty ratio. Parameter duty takes values from 0 to 255, where 0 is 0%, 127 is 50%, and 255 is 100% duty ratio. Other specific values for duty ratio can be calculated as (Percent*255)/100.

Requires MCU must have CCP module. PWM1_Init must be called before using this routine.

Example Set duty ratio to 75%:

PWM1_Set_Duty(192);

نجد ان 100% duty cycle تكافىء 255
لذلك ال 10 بت اعلى قيمة لها 1024 بتحويلها الى 8بت من خلال القسمة على اربعة تصبح اعلى قيمة 255

اعلانات

ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 450
نشاط [ ahmed idris ]
قوة السمعة:
قديم 16-05-2016, 12:13 PM المشاركة 10   
افتراضي


تحويل القيمة من 10بت الى 8 بت اتوقع السبب الرئيسي لها هو الدالة الخاصة بالتحكم بقيمة ال duty cycle فبالرجوع ل وصف الدالة ..

PWM1_Set_Duty
Prototype void PWM1_Set_Duty(unsigned short duty_ratio);

Returns Nothing.

Description Sets PWM duty ratio. Parameter duty takes values from 0 to 255, where 0 is 0%, 127 is 50%, and 255 is 100% duty ratio. Other specific values for duty ratio can be calculated as (Percent*255)/100.

Requires MCU must have CCP module. PWM1_Init must be called before using this routine.

Example Set duty ratio to 75%:

PWM1_Set_Duty(192);

نجد ان 100% duty cycle تكافىء 255
لذلك ال 10 بت اعلى قيمة لها 1024 بتحويلها الى 8بت من خلال القسمة على اربعة تصبح اعلى قيمة 255
طبعا ..
لكن في نفس الوقت تحويل الناتج الى 8 بت سيسمح بعرض الكود على البرورت B
هذا إذا كانت نية واضع هذا الكود هي الاظهار على هذا البورت
علما أنه هناك إمكانية برمجية لاستخدام duty cycle ب 10 بت
لكن ليس بتعليمات الدالة الجاهزة PWM

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

محمد القادري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2011
المشاركات: 101
نشاط [ محمد القادري ]
قوة السمعة:
قديم 16-05-2016, 12:32 PM المشاركة 11   
افتراضي


طبعا ..
لكن في نفس الوقت تحويل الناتج الى 8 بت سيسمح بعرض الكود على البرورت B
هذا إذا كانت نية واضع هذا الكود هي الاظهار على هذا البورت
علما أنه هناك إمكانية برمجية لاستخدام duty cycle ب 10 بت
لكن ليس بتعليمات الدالة الجاهزة PWM
تقصد من خلال استخدام الرجسترات الخاصة بال pwm مباشرة ؟!


ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 450
نشاط [ ahmed idris ]
قوة السمعة:
قديم 16-05-2016, 12:45 PM المشاركة 12   
افتراضي


من خلال ccp module
تفضل :
http://learn.mikroe.com/ebooks/picmi...r/ccp-modules/


محمد القادري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2011
المشاركات: 101
نشاط [ محمد القادري ]
قوة السمعة:
قديم 16-05-2016, 01:26 PM المشاركة 13   
افتراضي


بارك الله فيك
هذا الذي قصدته انا استخدم هذه الطريقة في بعض الاحيان لكن مع كومبايلرات اخرى غير الميكروسي .. من جديد بدأت ابرمج بعض البرامج باستخدام الميكروسي ..

اذا من خلال استخدام الميكروسي انا غير مقيد باستخدام الدوال الجاهزة انما بالامكان استخدام الرجسترات الخاصة بكل موديولز مباشرة ؟!


ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 450
نشاط [ ahmed idris ]
قوة السمعة:
قديم 16-05-2016, 01:44 PM المشاركة 14   
افتراضي


بإمكانك أخي التعامل مع الريجسترات كما هي في الداتا شيت ..
وأيضا يمكنك مثلما هو متوفر في كثير من الكومبيلرات ،إضافة فقرات بلغة assembler عند الضرورة الى كود الميكروسي
وأخيرا لدي توضيح بسيط:
أنا ايضا ابرمج بطرق أخرى ولست من خبراء الميكروسي
والدور الوحيد الذي بإمكاني القيام به بخصوص هذه اللغة هو مساعدة الاخوة المبتدئين مع الميكروسي على قدر المستطاع
وفقط في فترة غياب خبراء البرمجة بالميكروسي عن المنتدى
وإذا حضروا أتوارى بسرعة البرق
تحياتي ..


محمد القادري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2011
المشاركات: 101
نشاط [ محمد القادري ]
قوة السمعة:
قديم 16-05-2016, 02:20 PM المشاركة 15   
افتراضي


بإمكانك أخي التعامل مع الريجسترات كما هي في الداتا شيت ..
وأيضا يمكنك مثلما هو متوفر في كثير من الكومبيلرات ،إضافة فقرات بلغة assembler عند الضرورة الى كود الميكروسي
وأخيرا لدي توضيح بسيط:
أنا ايضا ابرمج بطرق أخرى ولست من خبراء الميكروسي
والدور الوحيد الذي بإمكاني القيام به بخصوص هذه اللغة هو مساعدة الاخوة المبتدئين مع الميكروسي على قدر المستطاع
وفقط في فترة غياب خبراء البرمجة بالميكروسي عن المنتدى
وإذا حضروا أتوارى بسرعة البرق
تحياتي ..
بارك الله فيك وبعلمك ونفع بك


TIME0
:: مهندس جيد ::
تاريخ التسجيل: Mar 2012
المشاركات: 277
نشاط [ TIME0 ]
قوة السمعة:
قديم 25-06-2016, 07:06 PM المشاركة 16   
افتراضي


1- الكود سليم وهذا عمله:
المقاومة المتغيرة تزيد أو تنقص في عرض نبضة التردد الخارج من الرجل للمتحكم:

2- الآن هناك ملاحظة:
في الكود تعليمة تقسم قيمة المتغير بسعة 10 بت على 4 وهذا حتى يكون الناتج على شكل رقم تنائي 8 بت:
temp_duty = (temp_res/4); // Convert the 10 bit value to 8 bits
لماذا هذه التعليمة؟
ربما واضع الكود يريد إظهار ناتج التحويل على البورت B
هو هيأ البورت B ليكون كخرج بالتعليمة ;TRISB=0
لكن ينقصه تعليمة العرض وهي:
;PORTB = temp_duty
ومكانها في الكود يجب أن يكون هنا:
PWM1_set_Duty(temp_duty); // Set the duty value
Delay_ms(50); // Slow everything down a little
;PORTB = temp_duty
مجرد احتمال..
يالنسبة ل
temp_duty = (temp_res/4);

فهي مهمه للغاية
انا الان فهمتها بعد ما استخدمت نوع آخر من المتحكمات وهو
pic 16f716

واجهتني مشاكل بان سرعة الموتور بطيئة وليس مثل 877 و 887
ولما شفت الداتا شيت وجدت مكتوب عند البك 887 و 778 ان مدخل الانالوج هو 10 بت
و على خلاف المتحكم 716 فهو 8 بت

في هذا الكود
temp_duty = (temp_res/4);
قسمنا على اربعه لان 877 و 887 هو عشره بت اي تعادل 1024
اما الثمانية بت فتساوي 256

انا المشكله الي حصلت معي في البك 716 هو انني قسمت على اربعة في الثمانيه بت فاصبحت القيمه 64 بت
وعند زياده السرعة لاقصى سرعة ( خمسة فولت )
لسا duty cycle 50%

فقمت بكتابه الامر من غير قسمه
temp_duty = (temp_res);

والامور تمام


وايضا ممكن تضرب القيمه في 2 مثلا لو حاب ان عند 2.5 فولت يصل ال duty cycle
الى 100%

احيانا ممكن تحتاج مثل ذلك



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 12:56 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)