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

أدوات الموضوع

الصورة الرمزية Semmoor
Semmoor
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
المشاركات: 300
نشاط [ Semmoor ]
قوة السمعة:0
قديم 17-03-2013, 11:33 PM المشاركة 1   
افتراضي مقياس تردد والزمن باستخدام المؤقتات. Twitter FaceBook Google+



في هذا المشروع راح يكون في متحكم PIC16F877A يقوم بقياس التردد وزمن الدوري.

راح نستخدم التايمر1 لحساب النبضات الداخلة على المتحكم .

راح نستخدم التايمر0 لتوليد زمن مقداره واحد ثانية.

كما هو معلوم فإن التردد هو الذبذبة في الثانية يعني كم مرة تم توليد نبضة في الثانية.

طريقة حساب النبضات راح تكون من القطب T1CKI عن طريق هذا القطب يمكن حساب النبضات الداخلة على المتحكم. طبعا في كل نبضة داخلة راح يزداد التايمر1 بمقدار واحد حتى يصل الى الطفحان يعني بعد 65536 نبضة راح يصل للطفحان ليش؟؟

ببساطة لأن التايمر1 طوله 16bit اي 16^2 = 65536 .
اذا نفهم من هذا انا أعلى تردد يمكن قياسه هو 65536 هيرتز.

كما ذكرت ان تردد هو الذبذبة في الثانية مما يعني انه يجب علينا التوقف في كل ثانية لحساب عدد النبضات خلال ثانية واحدة.

في هذا المشروع لن نستخدم الامر (delay_ms(1000 , بل سيتم استخدا التايمر0 لتوليد زمن قدره 1 ثانية.

شرح الكود في الملفات المرفقة مع الدائرة و المحاكاة.

ملخص الشرح:

اول شي يتم ادخال النبضات عن طريق القطب T1CKI في كل نبضة يزداد المسجل تايمر1 بواحد.

وبعد حدوث ثانية يجب ايقاف دخول النبضات والمقاطعة لكي يتم حساب كم نبضة دخلت على مسجل التايمر1 في الثانية.

وبعدها تخزين قيمة التردد في متغير بطول 16 بت ولكن كما نعلم ان التايمر1 طوله 16بت والمسجل حقه يحتوي على مسجليين كل منهما بطول 8بت يعني واحد مسجل للقيمة العلية والثانية للقيمة السفلة , لهذا يجب علينا استخدام طريقة لكي يتم تخزين النبضات التي في المسجل, الحل هو استخدام طريقة تقوم بتخزين القيمة العلية اولا في المتغير الذي طوله 16بت وبعدين تقوم بالإزاحة لكي يتم تخزين القيمة السفلة اذا بهذه الطريقة راح نكون خزنا النبضات من التايمر1 في متغير واحد .

وبعد الحصول على التردد من التايمر1 بعدها حساب زمن التردد وهو ,, واحد تقسيم النبضات في المسجل تايمر واحد اي التردد الذي حصلنا عليه في الثانية.

بعدها تحويل التردد والزمن الى سترينج لكي يتم عرضه على الشاشة.

تحميل المشرووع كاملا:
http://www.4shared.com/rar/Jm4M914R/...r__Sameer.html


اذا في اي صعوبة في التايمر0 يمكن الاستغناء عنه واستخدام الامر delay للإنتظار لواحد ثانية , ولكن اردت استخدام المؤقتتات لكي يكون المشروع متكامل في الزمن الحقيقي, طبعا معظم المشاريع الكبيرة والناجحة مستحييل يكون فيها تاخير زمني (delay) لانه يقوم بتعطيل المتحكم في الاشياء الأخرى حتى تنقضي الثانية اما في المؤقتات يستطيع المعالج انا يقوم بأي شي اخر حتى تحدث المقاطعة.

اسف اعلم ان الشرح ليس واضح ونا جاهز للإجابة على كل التساؤلات.


التعديل الأخير تم بواسطة : Semmoor بتاريخ 17-03-2013 الساعة 11:39 PM
اعلانات

الصورة الرمزية Semmoor
Semmoor
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
المشاركات: 300
نشاط [ Semmoor ]
قوة السمعة:0
قديم 18-03-2013, 12:42 AM المشاركة 2   
افتراضي


كيف تم استخدام التايمر0 لتوليد زمن قدره 1 ثانية؟

اول شي اختيار زمن معين ليكن كما في المشروع تم اختيار زمن قدره 10ms باستخدام العلاقة التالية:

قيمة الشحن = (الزمن المطلوب * تردد المذبذب) / (4 * المقسم)

قيمة الشحن: هي القيمة التي سيتم شحن المؤقت ليتم العد منها حتى الطفحان وهكذا اي قيمة مبدأية للعد.


الزمن المطلوب: كم اخترنا هو 10ms اي 0.010

تردد المذبذب: هو قيمة المذبذب الموصول بالمتحكم مثلا هنا تم استخدام 16Mhz اي 16000000

4 : رقم ثابت لأن كل نبضة داخلة من المذبذب في البيك تقسم على 4

المقسم الترددي: هو المقسم الترددي للتايمر تم اختيار 256 في المثال

اذا للحصول على قيمة الشحن:

قيمة الشحن = (0.010 * 16000000) / (4 * 256) = 156

اخيرا نطرح الناتج بطول المسجل للتايمر0 اذا ,, 256 - 156 = 99

اذا يجب شحن التايمر0 بـالقيمة 98 لكي يبدأ العد منها وفي كل طفحان ايضا يجب اعادة شحن التايمر0 بهذه القيمة.

ولكن ليس مهم استخدام هذه المعادلة فهناك برنامج يقوم بكل الحسابات بدقة اكثر من المحسوب اسمه TimerCalculator

فقط يجب عليك اختيار المتحكم والكريستال المتستخدم والتايمر واختيار الوقت المطلول توليده.

وابعدها اضغط Calculate لكي يتم توليد الكود كاملا حتى برنامج خدمة المقاطعة والتعاريف كلها بدون كتابة اي شي !!

انصح باستخدامه لمن لايفهم طريقة التعامل مع المؤقتات في البيك.


رابط البرنامج:
http://www.4shared.com/rar/9jEyLe1v/...alculator.html

فقط اردت التوضيح بدون استخدام البرنامج.

المهم بعد اختار الزمن والحصول على قيمة الشحن, سوف تحدث المقاطعة كل 10ms ولكن 10ms ليس الزمن المطلوب الذي نريده اي ثانية ولكنه يعني انه كل 10ms سوف تحدث مقاطعة !!

طيب لو ضربنا عدد المقاطعة في 100 كم سيكون الوقت ؟؟؟

لنرى >> 10ms * 100 = 1000ms

وكما نعلم 1000ms تساوي ثانية واحدة

هذا يعني انه يجب علينا حساب عدد المقاطعات حتى تصل 100 مقاطعة وبعدها تحدث ثانية.

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

ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 466
نشاط [ ennng ]
قوة السمعة:0
قديم 18-03-2013, 02:02 AM المشاركة 3   
افتراضي


بارك الله فيك اخي Semmoor على الشرح الاكثر من رائع والديزاين الجميل هناك بعض الاسئلة والملاحظات:

1- عندما انفذ البرنامج على البروتيس بيطلع لي ارقام غير ثابتة على سبيل المثال عندما اضع التردد 10 يعطي مرة 9 ومرة 10 يعني ان هناك نسبة خطأ!!
2- بالنسبة للزمن الدوري كما ذكرت هو مقلوب التردد لكن الغريب بيطلع ارقام مع e-11 or e-12 وهذا يعني ان الرقم مضروب في 10 اس -12 او -11 وهذا خطأ خطير جدا!!
3-هل لابد دخول اشارة مربعة نبضات او ممكن ندخل اشارة تناظرية ساين ويف على T1CKI !!
4- حاولت تغيير التردد الي float ليعطي قرأة للكسور لكن اصبح يعطي قراءات غريبة لانة كما تعلم ان في العملي ممكن الاشارة تكون بتردد معين وفواصل خصوصا للتطبيقات الدقيقة.
5-الترددات الصغيرة لايقيسها!!
6- عندي مشاركة واستخدمت فيها المقارن لكن لازالت هناك مشاكل
http://www.qariya.com/vb/showthread.php?t=125376

انا بصراحة كنت ابحث عن موضوعك لاسيما انه يستخدم Timers بدلا من delay وهو اكثر دقة لكن اذا قدرنا ان نجاوز النقاط المذكورة فهذا يكون اكثر من رائع. اسف اخي على الاطالة وانا شخص احب النقاش العلمي بارك الله في الجميع.


الصورة الرمزية Semmoor
Semmoor
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
المشاركات: 300
نشاط [ Semmoor ]
قوة السمعة:0
قديم 18-03-2013, 08:31 AM المشاركة 4   
افتراضي


بارك الله فيك اخي semmoor على الشرح الاكثر من رائع والديزاين الجميل هناك بعض الاسئلة والملاحظات:

1- عندما انفذ البرنامج على البروتيس بيطلع لي ارقام غير ثابتة على سبيل المثال عندما اضع التردد 10 يعطي مرة 9 ومرة 10 يعني ان هناك نسبة خطأ!!
2- بالنسبة للزمن الدوري كما ذكرت هو مقلوب التردد لكن الغريب بيطلع ارقام مع e-11 or e-12 وهذا يعني ان الرقم مضروب في 10 اس -12 او -11 وهذا خطأ خطير جدا!!
3-هل لابد دخول اشارة مربعة نبضات او ممكن ندخل اشارة تناظرية ساين ويف على t1cki !!
4- حاولت تغيير التردد الي float ليعطي قرأة للكسور لكن اصبح يعطي قراءات غريبة لانة كما تعلم ان في العملي ممكن الاشارة تكون بتردد معين وفواصل خصوصا للتطبيقات الدقيقة.
5-الترددات الصغيرة لايقيسها!!
6- عندي مشاركة واستخدمت فيها المقارن لكن لازالت هناك مشاكل
http://www.qariya.com/vb/showthread.php?t=125376

انا بصراحة كنت ابحث عن موضوعك لاسيما انه يستخدم timers بدلا من delay وهو اكثر دقة لكن اذا قدرنا ان نجاوز النقاط المذكورة فهذا يكون اكثر من رائع. اسف اخي على الاطالة وانا شخص احب النقاش العلمي بارك الله في الجميع.


بارك الله فيك اخي:

بالنسبة للخطأ اكييد فيه بس بنسبة قليلة تكون نسبة الخطأ اكبر عند الترددات الكبيرة , ولكن اعتقد يمكن نستطيع حل المشكلة بانقاص القيمة المضافة من التردد لانه اذا وصل لتردد مثلا اكثر من 200يكون مضافا اليه رقم واحد يعني نقدر نسوي فحص اذا وصل التردد الى 200 ومافوق الى نسبة الخطا المضاف واحد ننقص واحد من التردد المحسوب:

مثال:

{;if(Freq > 200 && Freq < 400){Freq=Freq-1

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

اما بالنسبة للوقت الدوري ارى انا صحيح لانه حتى عند حساب القيمة في الالة الحاسبة عندي ارى ارقام مضروبة للاس عشرة اذا كان الرقم بالمللي ثانية يظهر الناتج ضرب عشرة اس سالب 3

تكون بهذا الشكل مثلا 10 مللي ثانية 3-^10*10 لانه اصلا ارقام تكون اقل من الثانية
للتأكد عوض في القانون اقسم واحد على الوقت الدوري نفس الذي ظهر على الشاشة راح يعطيك التردد كما هو مقاس انا حاولت مع تردادت كثيرة في النهاية طلع الناتج صحيح.

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


بالنسبة للسؤال الرابع اعتقد ان السبب في عدم حساب الارقام التي تحتوي على فواصل هو انا التايمر اصلا مايقبل ارقام كسرية . اظن انه يجب عمل حسابات بعد الحصول على التردد.

اما السؤال الاخير ايضا اظن انه يجب عمل حسابات لحساب الترددات اصغر من واحد لان البرنامج يقيس الترددات من واحد ومافوق.

يعطيك العافية اخوي ومشكووور على المرور والملاحظة.

اتمنى من الاعضاء ان يشاركوا في تطوير البرنامج واضافة اشياء افضل واكثر دقة.


التعديل الأخير تم بواسطة : Semmoor بتاريخ 18-03-2013 الساعة 08:39 AM

ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 466
نشاط [ ennng ]
قوة السمعة:0
قديم 18-03-2013, 12:55 PM المشاركة 5   
افتراضي


بارك الله فيك اخي على الردود الرائعة


اما بالنسبة للوقت الدوري ارى انا صحيح لانه حتى عند حساب القيمة في الالة الحاسبة عندي ارى ارقام مضروبة للاس عشرة اذا كان الرقم بالمللي ثانية يظهر الناتج ضرب عشرة اس سالب 3

تكون بهذا الشكل مثلا 10 مللي ثانية 3-^10*10 لانه اصلا ارقام تكون اقل من الثانية
للتأكد عوض في القانون اقسم واحد على الوقت الدوري نفس الذي ظهر على الشاشة راح يعطيك التردد كما هو مقاس انا حاولت مع تردادت كثيرة في النهاية طلع الناتج صحيح.
كلامك صحيح ١٠٠% لكن المشكلة انه يطلع عندي اس سالب ١١ و١٢ واعداد اخرى اكبر ولايطلع عندي اس سالب ٣....

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025