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

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

الصورة الرمزية اشرف كمال2
اشرف كمال2
:: مهندس متواجد ::
تاريخ التسجيل: Nov 2010
الدولة: القاهرة_مهندس كهرباء
المشاركات: 101
نشاط [ اشرف كمال2 ]
قوة السمعة:0
قديم 06-08-2011, 12:54 PM المشاركة 1   
افتراضي شرح طريقة جديدة لعمل pwm لانواع ميكرو لا يتوافر بها هذة الخاصية Twitter FaceBook Google+



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

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

ميزة استخدام التايمر زيرو هو ان الميكرو يمكنه ان ينفذ باقى الاوامر اثناء قيامه باخراج الPWM بدلا من استخدام اوامر التاخير الزمنى...
المشروع:
استخدام ميكرو كنترول pic 16f628a لتوليد نبضات ترددها 50 هرتز

البرنامج:

كود:
//USING TMR0  AS PWM SOURCE
      // BY Eng : ASHRAF KAMAL ELHAMAHMY
             
  char x;
  void interrupt(){
   x++;
   if(x==5){
    portb.f0=~portb.f0;
    x=0;
    }
                        
    tmr0=131;
    INTCON.T0IF = 0;         // timer will count 125 * prescale(=16)=2000 *5 (the x variable)=   10 ms   ==>
                              //PORTB  WILL change the bit state each 10 ms so the period will be
                              //Ton=10 ms && Toff=10 ms so T (total)=20 ms or 50 HZ

                }

void main() {
          trisb=0;
          intcon=0b10100000;
          option_reg=0x03;     // prescale  2 selected
          tmr0=131;
          portb=0;
          while(1){

                PORTB.F3=1;  // port b can do other thing while  doing the PWM 

          }}

بالطبع يمكن الحصول على عدد كبير من خرج ال PWM على عدة اطراف من المايكرو بعدد ارجل المايكرو المستخدم وليس كما هو الحال فى الميكرو ذو طرفى ال PWM

الفكرة هى توليد تردد 50 هرتز او اى تردد ..
ولتحقيق ذلك نقوم بحساب الزمن الدورى للتردد المطلوب و فى حالتنا الزمن الدورى للتردد 50 كما نعلم هو
كود:
1/50= 20 ms
نريد الان ان يكون زمن Ton للنبضة هو 10 ms وزمن ال Toff هو 10 ms
مهمتنا الان استخدام التايمر زيرو الموجود فى الميكرو كنترول ليعد زمن10 ms وتغيير حالة النبضه فى كل مرة من 1 الى 0 و العكس.

ليتم ذلك نقوم بحساب تردد الكرستاله المستخدمة و منها معهرفة زمن تنفيذ التعليمة فى كل دورةinstruction cycle time

فى حالة استخدام كريسالة 4MHZ يكون زمن التعليمة فى كل دورة هو 1 ميكرو ثانية لكل دورة.

اى ان التايمر زيرو سيستغرق 256 ميكرو ثانية فقط ليعد من صفر الى 256
وفى حالة استخدام مجزىء PRESCALER للتايمر بقيمة 256 يكون الزمن الكلى المحسوب هو
كود:
256 * 256=65.536 ms
من هذا bالمنطق يمكننا ان نجعل التايمر زيرو يحسب زمن10 msنجعل التايمر يعد 125 عدة count بقيمة 125ميكرو ثانية(عن طريق تخزين قيمة 256-125=131)ثم استخدام مجزىء بقيمة 16 بالتالى اصبح الزمن الكلى المحسوب حتى الان هو 125*16=2000 ميكرو ثانية او 2 ميللى ثانية
استخدمنا متغير اسمه x عندما يحدث طفحان للتايمر يزداد قيمتة حتى يصل الى القيمة 5 و فى هذة الحالة يكون الزمن الكلى المستغرق هو
كود:
125*16*5=10 ms

وهذا هو البرنامج كاملا

كود:
// BY Eng : ASHRAF KAMAL ELHAMAHMY
             
  char x;
  void interrupt(){
   x++;
   if(x==5){
    portb.f0=~portb.f0;
    x=0;
    }
                        
    tmr0=131;
    INTCON.T0IF = 0;         // timer will count 125 * prescale(=16)=2000 *5 (the x variable)=   10 ms   ==>
                              //PORTB  WILL change the bit state each 10 ms so the period will be
                              //Ton=10 ms && Toff=10 ms so T (total)=20 ms or 50 HZ

                }

void main() {
          trisb=0;
          intcon=0b10100000;
          option_reg=0x03;     // prescale  16 selected
          tmr0=131;
          portb=0;
          while(1){

                PORTB.F3=1;  // port b can do other thing while  doing the PWM 

          }}

والان مع صورة للمشروع


اعلانات

الصورة الرمزية المظلوم
المظلوم
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
الدولة: BH
المشاركات: 640
نشاط [ المظلوم ]
قوة السمعة:0
قديم 10-03-2012, 08:44 PM المشاركة 2   
افتراضي



وهذا هو البرنامج كاملا

كود:
// BY Eng : ASHRAF KAMAL ELHAMAHMY
             
  char x;
  void interrupt(){
   x++;
   if(x==5){
    portb.f0=~portb.f0;
    x=0;
    }
                        
    tmr0=131;
    INTCON.T0IF = 0;         // timer will count 125 * prescale(=16)=2000 *5 (the x variable)=   10 ms   ==>
                              //PORTB  WILL change the bit state each 10 ms so the period will be
                              //Ton=10 ms && Toff=10 ms so T (total)=20 ms or 50 HZ

                }

void main() {
          trisb=0;
          intcon=0b10100000;
          option_reg=0x03;     // prescale  16 selected
          tmr0=131;
          portb=0;
          while(1){

                PORTB.F3=1;  // port b can do other thing while  doing the PWM 

          }}

والان مع صورة للمشروع




حاولت ان افهم المبدأ التي كتب عليه هذا الكود لكن لم استوعبه تماما ؟ ،، هل يتفضل أحد بالشرح ؟ ،، خصوصا في PRESCALAR ومسألة توليد النبضة بخمسين هرتز ؟ ،، وما هو الأنبوت لهذا المايكرو ، بمعنى على اي اساس تكون شدة الإضاءه عند هذا الأنبوت بمقدار معين ،،، وعندما يختلف الأنبوت ،، يختلف الآوتبوت ؟



اعذروني ،


تمنياتي

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

الصورة الرمزية المظلوم
المظلوم
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
الدولة: BH
المشاركات: 640
نشاط [ المظلوم ]
قوة السمعة:0
قديم 10-03-2012, 08:50 PM المشاركة 3   
افتراضي


ليتم ذلك نقوم بحساب تردد الكرستاله المستخدمة و منها معهرفة زمن تنفيذ التعليمة فى كل دورةinstruction cycle time

فى حالة استخدام كريسالة 4MHZ يكون زمن التعليمة فى كل دورة هو 1 ميكرو ثانية لكل دورة.


Read more: http://www.qariya.com/vb/showthread....#ixzz1okkrgEwE
كيف تمت هذه العملية ؟ كيف عرفنا أن زمن التعليمة 1 مايكرو ثانية ؟ ،، ما هي المعادلة ؟

بمعنى لو كانت الكريستالة المستخدمة عبارة عن 20 ميغا هرتز ؟ ، كم سيكون زمن التعليمة الواحدة


هل ستكون عبارة عن 0.2 مايكرو ثانية ؟ ،، حيث قسمنا20 ميغا على 4 ،، وبالتالي يكون الناتج 5 ميغا CYCLE ،، وبما أننا نبحث عن الزمن ،، فنأخذ المقلوب فتصبح عبارة عن 0.2 ثانية ؟ ؟

هل هذه هي الطريقة ؟


التعديل الأخير تم بواسطة : المظلوم بتاريخ 10-03-2012 الساعة 08:59 PM

الصورة الرمزية المظلوم
المظلوم
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
الدولة: BH
المشاركات: 640
نشاط [ المظلوم ]
قوة السمعة:0
قديم 10-03-2012, 09:02 PM المشاركة 4   
افتراضي


من هذا bالمنطق يمكننا ان نجعل التايمر زيرو يحسب زمن10 msنجعل التايمر يعد 125 عدة count بقيمة 125ميكرو ثانية(عن طريق تخزين قيمة 256-125=131)ثم استخدام مجزىء بقيمة 16 بالتالى اصبح الزمن الكلى المحسوب حتى الان هو 125*16=2000 ميكرو ثانية او 2 ميللى ثانية
استخدمنا متغير اسمه x عندما يحدث طفحان للتايمر يزداد قيمتة حتى يصل الى القيمة 5 و فى هذة الحالة يكون الزمن الكلى المستغرق هو

Read more: http://www.qariya.com/vb/showthread....#ixzz1oko4XRxt

من هنا لم أفهم المقصود من الأسطر السابقة ؟ ،، وما معنى ان نستخدم PRESCALER ؟


الصورة الرمزية اشرف كمال2
اشرف كمال2
:: مهندس متواجد ::
تاريخ التسجيل: Nov 2010
الدولة: القاهرة_مهندس كهرباء
المشاركات: 101
نشاط [ اشرف كمال2 ]
قوة السمعة:0
قديم 17-03-2012, 09:18 PM المشاركة 5   
افتراضي


بالنسبة للسؤال الاول..تردد الكريستاله المستخدم
كود:
 20 MHZ
يكون التردد الذى يعمل عنده الميكرو كنترول هو ربع هذة القيمه اى 5 ميجا هرتز والتى تساوى فى القيمة

كود:
1/5000000 ثانية
اى 0.2 ميكروثانية

ثانيا:
التايمر يتكون من سجل من 8 بيت وعند اعطاء نبضة للتايمر يزداد بمقدار واحد فى كل مرة حتى تصل القيمة فيه الى 255 ومايقابلها بالنظام الثنائى 11111111 وبما ان زمن التعليمه هو ا ميكرو فى حالة المثال الذى وضعته لذا فان التايمر لكى يزداد من صفر و حتى ال 255 يكون الزمن المستغرق هو 255 ميكرو ثانيه فقط و انا اريد الزمن 10 مييلى ثانيه فماذا نفعل؟؟
هنا ياتى المجزىء الذى يقوم بزياده خانه التايمر بعد دخول عدد معين من النبضات اليه ..فى المثال استخدمنا مجزىء بقيمة 16 اى انه عند دخول 16 نبضه لمسجل التيمر زيرو سيزداد القيمة فيه بمقدار واحد فقط وبالتالى الزمن الفعلى لكى يمتلىء التايمر زيرو حتى يصل الى 255 يكون 256*16 ميكرو ثانية وبالتالى اصبح مدة الزمن المحسوبه اطول...عندما يصل التايمر زيرو الى 255 يحدث مايسمى بالطفحان وعندها نريده ان يبدا العد من جديد حتى يصل الى 255 و هكذ ..
عدد مرات حدوث الطفحان قمت بعدها عن طريق متغير اسمه X وعند حدوث طفحات خمس مرات يكون الزمن الكلى المراد و هو ال 10 ميللى ثانية قد مرت و بالتالى اخراج النبضه المطلوبة.

ثالثا :بالنسبة للقيمة 125 هى قيمة اخترتها و يمكنك اختيار ماتريد ولكن بشرط ان يكون الزمن الكلى المحسوب يوافق الزمن المراد الحصول عليه.
من الممكن ان نبدا بصفر كقيمة للتايمر زيرو حتى يصل الى ال 255 وحدوث طفحان بعد زمن 255 ميكرو ثانية.ولكن سنغير من قيم المجزىء و المتغير X .

فمثلا سنختار مجزىء بقيمة 1:256 بالتالى يكون الزمن الكلى الذى مر هو 256*
256=65.536 ms ولكننا نريد 10 ميللى فقط بالتالى نقلل من قيمة المجزىء الى 4 مثلا بالتالى الزمن الزى مر هو 4 *256 =1.024 مييلى ثانية اى تقريبا 1 ميللى ثانية ونحن نريد 10 مييلى ثانية بالتالى نقوم بعمل متغير يزداد فى كل مرة يحدث طفحان للتايمر من 255 الى 0 ويزداد فيها قيمة المتغير .
بالتالى اذا كان قيمة المتغير الذى يصل الى الزمن المطلوب هو 10 يكون الزمن الزى مر هو 10 ميللى ثانية كما فى 256*4*10=10 ميللى ثانية


رابعا : قمت بتحميل قيمة ابتدائية للتايمر 125 حتى نتجنب الكسور الناتجة و ليكون الدقة اعلى وليست تقريبيه كما فى الماثال السابق...

واى سؤال انا فى الانتظار..و السلام عليكم و رحمة الله


الصورة الرمزية mar7aba_01
mar7aba_01
:: مهندس متميز ::
تاريخ التسجيل: Jan 2010
الدولة: المغرب
المشاركات: 746
نشاط [ mar7aba_01 ]
قوة السمعة:0
قديم 17-12-2012, 09:28 PM المشاركة 6   
افتراضي


السلام عليكم ورحمة الله وبركاته
هل من الممكن أن ننجز نفس البرنامج بواسطة الفلوكود ونطبقه ؟


الصورة الرمزية هيثم العليمي
هيثم العليمي
:: مهندس جيد ::
تاريخ التسجيل: Mar 2012
الدولة: yemen
المشاركات: 236
نشاط [ هيثم العليمي ]
قوة السمعة:0
قديم 18-12-2012, 06:51 PM المشاركة 7   
افتراضي


بسم الله الرحمن الرحيم


جزاك الله خير على الموضوع الرائع ..

سؤالي ..


اذا اردنا تغيير قيمه دوره التشغيل duty cycle فكيف يتم ذلك ..


Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:0
قديم 19-12-2012, 05:31 AM المشاركة 8   
افتراضي


اخي اشرف جزاك الله الف خير وبارك الله فيك..انا اتعامل مع pwm المدمج في البيك ولكن لم اطبق فكرتك من قبل.. وشرحك شجعني اني اطبق واشاركم بالنتيجة..والحمدلله تم تطبيق الدرس باستخدام برنامج MPLAB.
حيث استخدمت تردد الكريستاله 16Mhz
وعملت الحسابات كالتالي:

16Mhz/4= 4Mhz

1/4Mhz= 0.25us

0.25us*200*200 = 10ms

ال 200 الاولى استخدمتها مع Period register ..بحيث ان التايمر يزيد(0 الى 200) حتى تتساوى قيمة ال Period register مع التايمر ويعطيني انتربت (TMR2IF=1)

وال 200 الثانية استخدمتها مع متغير x...بحيث يحسب كل عمليات الانتربت او الطفح واذا وصلت 200 ..يعني كملنا 10ms وتغير الاشاراة في RC2 من 0 الى 5 او 5 الى 0.

وهنا الكود:
كود:
#include <htc.h>

__CONFIG(FOSC_INTOSC&WDTE_OFF&MCLRE_ON&CP_OFF);

#define _XTAL_FREQ 16000000

void main (void)
{

	char x=0;		
	OSCCON  = 0x7B;  //select internal osciallator =16Mhz
	__delay_us(4);			//allow the new clock to stabilize

	TRISCbits.TRISC2 =0;	// Set PortC.Pin2 output
	RC2=0;					//clear PortC.Pin2
	PR2=0xC8;				// load 200 to Period resgister
	TMR2IF=0;				//clear timer 2 flag
	T2CKPS0=0;				//Prescaler is 1
	T2CKPS1=0;
	TMR2=0;					//clear timer2				
	TMR2ON= 1;				//Turn on timer2
while (1){	
	while(TMR2IF==1)
			{
			x++;
			if(x==200){
				RC2=~RC2;
				x=0;
						}
			TMR2IF=0; 			// clear timer 2 flag        
			}
	
		}
}
وهنا صورة للاشاراة الناتجة..باستخدام برنامج بروتس

إضافة رد

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

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

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


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

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