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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 01:52 PM المشاركة 17   
افتراضي



بسم الله ماشاء الله استاذي الكريم زادكم الله من فضله وعلمه
لي سؤال علي PWM هل يمكن استخدامه في التحكم في الحصول علي جهد مستمر متغير الشده اقصد 0.2 فولت - 0.4 فولت 1.2 فولت 3 فولت باي وسيله ممكنه وكيف يتم ذلك
وجزاكم الله عني بكل خير
اخى الكريم

شكرا جزيلا لك

تقصد جهد مستمر مبرمج

نعم يمكن ذلك

يمكنك الأطلاع على المشروع على الرابط التالى كمثال

http://circuitdiagram.net/0-24vdc-digital-pic-power-supply.html


مع تمنياتى بدوام التوفيق

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 04:40 PM المشاركة 18   
افتراضي


تدريب Tutorial:
استخدام الوحدة (الموديول) CCP1 فى توليد إشارة ذات تعديل فى عرض النبضات PWM :
لكى نجعل التدريب أكثر فائدة فسوف يتم تغيير فترة بقاء النبضات على الطرف RC2(PORTC,2) باستخدام المفاتيح الضاغطة المسماة ‘DARK’ "إظلام" أو تقليل شدة الإضاءة و ‘BRIGHT’ "نصوع" أو زيادة شدة الإضاءة . فى نفس الوقت يتم مشاهدة فترة دوام النبضة المحددة كمزيج من الأعداد الثنائية على المنفذ PORTB لإدراك التزايد والتناقص لأن التزايد أو التناقص بقيمة صغيرة لن يلاحظ على التغيير فى شدة الإضاءة .
يتم التحكم فى عمل هذا الموديول باستخدام الدوال التى تنتمى إلى المكتبة المخصصة لهذا الغرض
PWM Library .
نستخدم هنا ثلاثة من تلك الدوال وهى :
1- دالة التهيئة والإعداد PWM1_init :
بصيغة النموذج : void Pwm1_Init(long freq);
البارامتر freq يحدد تردد إشارة PWM بوحدات herz . فى هذا التدريب سوف نستخدم التردد 5kHz.
2- دالة البدء PWM1_Start :
بصيغة النموذج : void Pwm1_Start(void);
ليس لها بارامترات .

3- دالة ضبط أو تحديد دورة الخدمة PWM1_Set_Duty
بصيغة النموذج : void Pwm1_Set_Duty(unsigned short duty_ratio);
البارامتر duty_ratio يحدد فترة بقاء النبضة (الجزء الموجب) فى سلسلة النبضات .

تحتوى مكتبة PWM أيضا على دالة الإيقاف PWM_Stop والتى تستخدم فى فصل أو عدم تمكين النظام .
صيغة النموذج : void Pwm1_Stop(void);وليس لها بارامترات .

الدائرة الكهربية :






البرنامج :

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 04:46 PM المشاركة 19   
افتراضي


البرنامج :

كود:
 
 
unsigned short current_duty, old_duty; // Define variables // current_duty and old_duty void initMain() { ANSEL = 0; // All I/O pins are configured as digital ANSELH = 0; PORTA = 255; // Port A initial state TRISA = 255; // All port A pins are configured as inputs PORTB = 0; // Initial state of port B TRISB = 0; // All port B pins are configured as outputs PORTC = 0; // Port C initial state TRISC = 0; // All port C pins are configured as outputs PWM1_Init(5000); // PWM module initialization (5KHz) } void main() { initMain(); current_duty = 16; // Initial value of variable current_duty old_duty = 0; // Reset variable old_duty PWM1_Start(); // Start PWM1 module while (1) { // Endless loop if (Button(&PORTA, 0,1,1)) // If the button connected to RA0 is pressed current_duty++ ; // increment variable current_duty if (Button(&PORTA, 1,1,1)) // If the pressed button is connected to RA1 current_duty-- ; // decrement value current_duty if (old_duty != current_duty) { // If current_duty and old_duty are not PWM1_Set_Duty(current_duty); // equal set PWM to a new value, old_duty = current_duty; // save the new value PORTB = old_duty; // and show it on port B } Delay_ms(200); // 200mS delay } }


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 04:49 PM المشاركة 20   
افتراضي


التعليق على البرنامج :
1- إعلان أو تعريف المتغيرات :
متغير قيمة دورة الخدمة الحالية current_duty ومتغير دورة الخدمة السابقة old_duty .

2- إنشاء دالة تضم جميع الإعدادات والتهيئة الابتدائية مما يسهل فهم وتتبع وتطوير البرنامج باسم initMain وتحتوى على :
# تصفير السجل ANSEL والسجل ANSELH لعدم الحاجة لمداخل تناظرية ومن ثم استخدام جميع الأطراف كمداخل أو مخارج رقمية .
# إعداد أطراف المنفذ PORA كمداخل TRISA = 255; وحالتها الابتدائية هى الحالة المرتفعة PORTA = 255; .
# إعداد أطراف المنفذ PORTB كمخارج TRISB = 0; وحالتها الابتدائية هى الحالة المنخفضة PORTB = 0; .
# إعداد أطراف المنفذ PORTC كمخارج TRISC = 0; وحالتها الابتدائية هى الحالة المنخفضة PORTC = 0;.
# إعداد (تهيئة) الموديول CCP1 ليعمل عند تردد 5 كيلو هرتز PWM1_Init(5000); .



كود:
 
unsigned short current_duty, old_duty; // Define variables // current_duty and old_duty void initMain() {
ANSEL = 0; // All I/O pins are configured as digital ANSELH = 0;
PORTA = 255; // Port A initial state TRISA = 255; // All port A pins are configured as inputs PORTB = 0; // Initial state of port B TRISB = 0; // All port B pins are configured as outputs PORTC = 0; // Port C initial state TRISC = 0; // All port C pins are configured as outputs
PWM1_Init(5000); // PWM module initialization (5KHz)
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 04:51 PM المشاركة 21   
افتراضي


1- الدالة الرئيسة :
  • فى البداية يجب استدعاء دالة الإعدادات التى تم إنشائها initMain(); .
  • ثم إسناء أو تخصيص قيمة ابتدائية (حسب الطلب) ليبدأ بها متغير دورة الخدمة الحالية
current_duty = 16;وقيمة ابتدائية لمتغير دورة الخدمة السابقة old_duty = 0; .
  • عندئذ يمكن أستدعاء دالة بدء نظام PWM قبل البدء فى الدخول فى حلقة البرمجة .
كود:
void main() {
initMain();
current_duty = 16; // Initial value of variable current_duty old_duty = 0; // Reset variable old_duty
PWM1_Start(); // Start PWM1 module


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 04:55 PM المشاركة 22   
افتراضي


  • إنشاء حلقة غير منتهية while(1) { …} وتحتوى على ثلاثة عبارات شرط (تحقق أو اختبار) باستخدام if وهى :
# اختبار حالة المفتاح المتصل بالطرف RA0 فإن تم الضغط علية Button(&PORTA, 0,1,1) أى نتيجة دالة المفتاح بواحد يتحقق الشرط true ويتم تنفيذ العبارة current_duty++ ; أى زيادة محتويات سجل متغير دورة الخدمة الحالية بواحد ومن ثم تزداد فترة بقاء النبضة الموجبة وتزداد قدرة الخرج ومن ثم شدة إضاءة الليد .
# اختبار حالة المفتاح المتصل بالطرف RA1 فإن تم الضغط علية Button(&PORTA, 0,1,1) أى نتيجة دالة المفتاح بواحد يتحقق الشرط true ويتم تنفيذ العبارة current_duty-- ; أى نقصان محتويات سجل متغير دورة الخدمة الحالية بواحد ومن ثم تتناقص فترة بقاء النبضة الموجبة وتقل قدرة الخرج ومن ثم شدة إضاءة الليد .
# اختبار حدوث تغير فى حالة دورة الخدمة عن طريق المقارنة بين محتويات سجل متغير دورة الخدمة الحالية ودورة الخدمة السابقة باستخدام مؤثر المقارنة != (لا يساوى) فإذا حدث تغير أى تحقق الشرط يتم تنفيذ ثلاثة أوامر (ذلك توضع بين أقواس) :
* جعل (تحديد) قيمة بارامتر دورة الخدمة فى دالة تحديد دورة الخدمة بدورة الخدمة الحالية كعملية تحديث للبيانات PWM1_Set_Duty(current_duty); .
* ثم نسخ محتويات سجل دورة الخدمة الحالية إلى سجل دورة الخدمة السابقة للتجهيز لاستقبال دورة خدمة حالية جديدة ولتصبح دورة الخدمة الحالية هى دورة خدمة سابقة .
* وأخيرا نسخ محتويات سجل متغير دورة الخدمة السابقة إلى سجل المنفذ PORTB لعرضه أولا بأول لملاحظة التزايد والتناقص كأرقام ثنائية من 0 إلى 255 وهو ما يقابل دورة خدمة بنسبة من 0%إلى 100% .
# وقبل تكرار الحلقة يوجد تأخير زمنى للسماح بمراقبة النتائج .


كود:
 
while (1) { // Endless loop if (Button(&PORTA, 0,1,1)) // If the button connected to RA0 is pressed current_duty++ ; // increment variable current_duty
if (Button(&PORTA, 1,1,1)) // If the pressed button is connected to RA1 current_duty-- ; // decrement value current_duty
if (old_duty != current_duty) { // If current_duty and old_duty are not PWM1_Set_Duty(current_duty); // equal set PWM to a new value, old_duty = current_duty; // save the new value PORTB = old_duty; // and show it on port B } Delay_ms(200); // 200mS delay } }


لكى يعمل هذا التدريب يجب جلب مكتبة PWM ومكتبة Button إلى مشروع البرنامج .


hamadalla31
:: مهندس متميز ::
تاريخ التسجيل: Mar 2009
المشاركات: 585
نشاط [ hamadalla31 ]
قوة السمعة:
قديم 29-03-2011, 05:32 PM المشاركة 23   
افتراضي


جزاكم الله عنا بكل خير


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2011, 05:46 PM المشاركة 24   
افتراضي



اخى الكريم

شكرا جزيلا لك

بارك الله فيك

مع تمنياتى بدوام التوفيق



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