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

   

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 08-02-2013, 11:04 AM المشاركة 9   
افتراضي



1- نعم كلامك صحيح
3- لا اعتقد ان هذا فيه استهلاك للطاقة لان الليد سيكون مطفي ...

اعلانات

ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 08-02-2013, 12:59 PM المشاركة 10   
افتراضي


جزاك الله خير اخي حيدر وبارك فيك

بصراحة انا عملت برنامج وكانت نفس النتيجة فشكيت انه غلط لكن انت وضحت الفكرة الله يسعدك دنيا واخرة طيب اذا سمحت سؤاليين وملاحظة هامة جدا:

1- هل هناك طريقة لعمل delay بالتايمر حتى تكون ادق

2- اذا كان لايمكن او صعب هل هناك طريقة لنعلم ان الليد كان يطفئ ويشتغل لمدة 2 ثانية اما انها بالرؤية والتخميين.

ملاحظة-بالنسبة للتردد PWM له قوانيين تعتمد على الكريستالة وعلى timer scale فلو فرضنا ان عندنا كريستالة 8MHz , ووضعنا التردد 2000Hz تبع PWM راح تختلف دقته واذا وضعنا كريستالة 4MHz ووضعنا لل PWM نفس التردد 2000Hz راح تختلف الدقة ويعني ذالك انه لو اردنا duty ب 50% ماراح نقول في كلا الحالتيين انها128. واعتقد اغلب الدروس الموجودة عن PWM ان لم يكن كلها لم تذكر هذه النقطة الحساسة وكان الجميع يعتمد 128 انها النصف وهذا خطأ فادح. الله يوفق الجميع لما يحبة ويرضاه


التعديل الأخير تم بواسطة : ennng بتاريخ 08-02-2013 الساعة 02:33 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 08-02-2013, 06:48 PM المشاركة 11   
افتراضي


1- في الحقيقة لم اتعامل مع التايمر من قبل لكن يمكن اضافة مقاومة متغيرة تمكنك من التحكم بالزمن ...
2- اذا تقصد 2 ثانية بالضبط و بدون نسبة خطا فلا اعرف ... اما بوجود سماحية يمكن تقديرها عينيا مع الساعة و التحكم من خلال المقاومة فنعم ممكن ...
3- اول مره اسمع بهذا الكلام و عموما سوف اراجع دروس المهندس احمد سمير الخاصة بهذا الموضوع و نرى اذا كان قد تطرق الى هذه الملاحظة ...


Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:
قديم 08-02-2013, 09:11 PM المشاركة 12   
افتراضي


السلام عليكم..
موضوع ممتع ومفيد ..خليني اضيف معلومه ممكن تفيد ان شاءالله.
اولاً: مشكلة التاخير (delay) تعتمد على الكريستاله المستخدمه. وانا للاسف لااتعامل مع مايكروسي في البرمجة, لاني افضل ان اعمل الدوال بنفسي حتى اضبط كل الاعدادت لكل ريجستر . ولكن هل من الممكن الاطلاع على هذه الدوال (المستخدمة في المايكروسي ) لمعرفة كيف دالة التاخير تعمل في هذا البرنامج ؟ عموماً مشكله اختلف التاخير عن 2 ثانية لها سبب واحد هو اختلف تردد الكريستاله عن التردد المفترض في داله التاخير المستخدمة داخل البرنامج. ولحل المشكله حاول بضبط تردد الكريستاله المستخدمه. لانه كل بيك يعمل على تردد معين كتردد افتراضي, وفي حاله توصيل كريستاله خارجية يجب ضبط الاعدادت على هذا التردد حتى نحصل على نفس وقت التاخير. اذا قمت بهذا الحل ولم تحل المشكلة, حاول بتغير تردد الكريستاله في الاعدادت لقيمة اخرى وجرب البرنامج, اعد هذه التجربة عدة مرات مع تغيير (تردد الكريستالة في كل مره )حتى تحصل على نفس قت التاخير(2 ثانية). التردد الذي يعطيك نفس مدة التاخير هو التردد المستخدم في اعدادات البيك. وهذه حدثت كثير معي اعمل حساباتي على تردد معين وفي الاخر انسى ضبط تردد الكريستاله على نفس التردد الذي عملت عليه حساباتي..والنتيجة تاخير مختلف عن المتوقع.

بالنسبة لاستخدام التايمر للاسف لااعرف طريقتة في المايكروسي..اتعامل مع mplab. وهنا شرح قد يفيدك في الاستفادة من التايمر
https://www.youtube.com/watch?v=nAr58JNgRlo
وهنا ايضا موضوع للمهندس اشرف جزاه الله خير, عمل شرح للتايمر باستخدام مايكروسي وراح يفيدك ان شاءالله
http://www.qariya.com/vb/showthread.php?t=93244

بالنسبة للملاحظه بخصوص pwm.. لحساب الدقة نستخدم المعادلة التاليه:
resolution = log[ 4* (PRx +1)] / log(2
اذا تغيير تردد الكريستالة لايغير الدقة,فقط البري سكيلار يؤثر في الدقة. و تغيير تردد الكريستاله يغير تردد ال pwm لان معادلة حساب تردد ال pwm:
PWM period = (PRx+1) * 4 * 1/FOSC * TMR2

وللاسف لا اعلم طبيعة الدوال المستخدمة في المايكروسي لتحديد pwm period او الدقة. فمثلاً لعمل دالة خاصة ل pwm نحتاج لضبط التايمر بري سكيلارPRx, وتردد الكريستالةFOSC و تحديد القيمة المدخلة في ريجستر CCPRxL:CCPxCON المسؤولة عن تحديد ال duty cycle. وطبعا جميع هذه الاعدادات يتم عملها داخل الداله المستخدمة في المايكروسي(pwm1_init, pwm1_set_duty)..ولانستطع فهم طبيعة هذه الدالة حتى نرى طريقة عملها.

اخيراَ اخي حتى تقوم باعداد كل شي بحسبه دقيقة وبالطريقة التي تريدها,تحتاج لعمل الدوال بنفسك.

سامحني على الاطالة.


ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 08-02-2013, 10:05 PM المشاركة 13   
افتراضي


يسعدني مرورك اخي الكريم Mohammedalharbi
كذا النقاش العلمي يعجبني ونحتاج مثل كذا بارك الله فيك
كلامك بصراحة اعجبني كثير ويدل على انسان فاهم فأسأل الله لك المزيد والتقدم
هناك ملاحظة بسيطة حبيت انبهك عليها بارك الله فيك حيث انك ذكرت

اذا تغيير تردد الكريستالة لايغير الدقة,فقط البري سكيلار يؤثر في الدقة
اقول اخي الكريم بل يؤثر ويغير الدقة لان قيمة PRx تعتمد على تردد الكرستالة لانك لو لاحظت اذا نريد حساب PRx من القانون التالي فانة يعتمد على تردد الكرستالة
PWM period = (PRx+1) * 4 * 1/FOSC * TMR2

وكذالك هناك قانون ثاني لحساب الدقة

resolution = log[ Fosc/Fpwm] / log(2
حيث ان Fosc تردد الكرستالة وFpwm تردد PWM

اسأل الله التوفيق للجميع


Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:
قديم 09-02-2013, 01:35 AM المشاركة 14   
افتراضي


بارك الله فيك اخي على كلامك الطيب وان شاءالله نفيد ونستفيد من الحوارات العلمية المفيدة ونتعلم من اخطاءنا.
قبل مااعلق على المعادلة الثانية للدقة, اود توضيح نقطة اخطاءت فيها في ردي السابق.
انا كنت اقول البري سكيل هو PRX ..لكن ال PRX هو عبارة عن period register ..اذاً نرجع نعدل المعادلة:
كود:
PWM Period = [(PR2x) + 1] * 4 * TOSC *(TMRx Prescale Value)
و معادلة الدقة :
كود:
Resolution= log[4(PRx + 1)]/log(2)
طريقة استنتاج المعادلة الثانية للدقة, ممكن الحصول عليها عن طريق التعويض في المعادلة الاولى, كالتالي:
كود:
1/PWMfreq = 4(PRx + 1) *1/Fosc *(TMRx Prescale Value)
4(PRx + 1) = Fosc/[ PWMfreq* TMRx Prescale Value ]
بالتعويض عن قيمة ( 4(PRx + 1 في معادلة الدقة
كود:
Resolution= log[4(PRx + 1)]/log(2)
Resolution= log[Fosc/(PWMfreq* TMRx Prescale Value)]/log(2)
واعتقد انه في معادلة الدقة الثانية التي ذكرتها اخي ennng, اعتبرت البري سكيل بواحد, ولكن لانعلم عن طريقة عمل دالة ال
Pwm في المكيروسي, اذا لابد ان نضع قيمة البري سكيل في الاعتبار.
وكلامك صحيح اخي ان الميكروسي يعتمد على المعادلة الثانية في تحديد الدقة ,كما يبدو لي, لانه تستطيع تحديد تردد الكريستاله وتردد الpwm وهو يقوم بوضع قيم البري سكيل والبيرود ريجستر..ومن ثم يحدد الدقة. لكن عند عمل داله pwm بنفسك, تستطيع تحديد قيمة البري سكيل و البيرود ريجستر. اخيراً اخي اتفضل هذا شرح من موقع مايكروسي ممكن يفيدك في معرفة المزيد عن pwm:
http://www.mikroe.com/chapters/view/...5-ccp-modules/

بالتوفيق ان شاءاالله


ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 09-02-2013, 01:06 PM المشاركة 15   
افتراضي


ماقصرت اخي محمد والله يوفقك لكل خير بصراحة انا اؤيد كلامك وبشدة لاننا نتعامل مع مكتبات جاهزة لكن لانعلم ايه محتوياتها الداخلية او الكنفيقرشن تبعها مثل PWM, ADC, UART ... وغيرها وانا اقولها وبكل صراحة ان الكثير منا يتعامل مع المكتبات هذه ولايعلم كيف تعمل وكيف السيتنق حقتها وانا متأكد ان الكثير منا اول مرة يسمع بهذا الكلام. مما لاشك فيه ان المكتبات توفر الجهد والوقت والتيسيير لكن لانعتمد عليها في كل الاحوال وهذا خطأ كبير وفادح لذالك انا وضعت مشاركة سابقة عن Duty cycle تبع PWM ان الامثلة والشروحات الموجودة هنا تعتمد ان 50% هي موافقة 128 وهذا خطأ كبير وفادح لانه ليس كذالك يعتمد على اشياء اخرى ولكن نحن لم ننتبه لهذا الشئ لماذا لان الاضاءة موجودة وحركة الموتور موجودة سواءا كتبت 128 او 190 او.. لكن تتضح اذا اخذت القياسات الصحيحة الدقيقة فتعلم ان هذه السرعة فوق المتوسطة او دون المتوسطة وكذالك تفرق معاك في التطبيقات التي تحتاج لدقة عالية لكن اغلب تطبيقاتنا لاتحتاج لهذه الدقة لذالك لم نميز ولم نكتشف الخطأ ..
لذالك انا قرأت من فترة ان الميكروسي يخذ وقت اكثر واقل دقة من لو تعاملنا مع الاسمبلي لكن كما تعلمون ان الاسمبلي معقد وصعب شوي لكن هو الاساس لانه يتعامل مع الريجسترات و البنوك الداخلية للميكرو. لكن على العموم اخي الحربي انا طرحت الموضوع وانت اضفت الشئ الكثير ونسأل الله للجميع ان يستفيد ويطور نفسة في الامور هذة وبصراحة ان الداتا شيت ماخلت شئ لكن مشكلتنا شيئيين ياانها اللغة او الكسل نريد شئ جاهز وخلاص هذه وجهت نظر.

طيب سؤال لك اخي محمد لو اننا عملنا configurations المطلوبة للريجسترات والبري سكيل وكل شئ تمام كيف نخرج PWM هل بنفس الدالة يعني نقول pwm1_start(); وفقط ارجوا التوضيح بارك الله فيك.


Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:
قديم 09-02-2013, 04:15 PM المشاركة 16   
افتراضي


اهلا وسهلاً اخي ennng
كلامك صحيح الكثير يعتمد على المكتبات الجاهزة, والسبب لعدم توفر دروس بااللغة العربية تشرح طريقة ضبط جميع الاعدادات المستخدمة في الدوال .بس ان شااءالله راح احاول اشرح الي اعرفه ونفيد ونستفيد جميعاً.
ايضاً اخي ليس مطلوب التعامل مع الاسمبلي للتعامل مع الريجسترات,,انا استخدم برنامج mplab ومرفق معه الhi tech compiler ...واستخدم لغة السي للبرمجة. واذا كنت ترغب بعمل داله لاي خاصية ISP,I2c,USART,PWm..etc
لازم تقرا الداتا شيت..لانه موضحه كل شي بالتفصيل...فمثلا خلينا نشوف الخطوات التاليه لتفعيل خاصية ال pwm مكتوبه في الداتا شيت لل pic16f1937 صفحة 196:
19.5.7 SETUP FOR PWM OPERATION
The following steps should be taken when configuring
the CCP module for PWM operation:
1. Disable the PWM pin (CCPx) output driver(s) by
setting the associated TRIS bit(s).
2. Load the PRx register with the PWM period value.
3. Configure the CCP module for the PWM mode
by loading the CCPxCON register with the
appropriate values.
4. Load the CCPRxL register and the DCxBx bits of
the CCPxCON register, with the PWM duty cycle
value.
5. Configure and start Timerx:
• Clear the TMRxIF interrupt flag bit of the PIRx
register. See Note below.
• Configure the TxCKPS bits of the TxCON
register with the Timerx prescale value.
• Enable Timerx by setting the TMRxON bit of
the T2CON register.
6. Enable PWM output pin:
• Wait until Timerx overflows, TMRxIF bit of the
PIR1 register is set. See Note below.
• Enable the PWM pin (CCPx) output driver(s) by
clearing the associated TRIS bit(s).
وهذا الكود كتبته متبع نفس الخطوات لدقه 10 بت:
كود:
#include <htc.h>

__CONFIG(FOSC_INTOSC&WDTE_OFF&MCLRE_ON&CP_OFF);

#define _XTAL_FREQ 16000000

void main (void)
{

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

	TRISCbits.TRISC2 =1;	//disable pwm pin
	RC2=0;					//clear CCP1
	PR2=0xff;				// load 255 to PR2
	CCP1M0=0;				// sets CCP1CON in PWM mode 
	CCP1M1=0;
	CCP1M2=1;
	CCP1M3=1;
	C1TSEL0= 0;				//CCP1 is based off Timer 2 in PWM Mode 
	C1TSEL1= 0;
	CCPR1L=0;				//starts with 0% duty cycle   

	TMR2IF=0;				//clear timer 2 flag
	T2CKPS0=0;				//Prescaler is 1
	T2CKPS1=0;				
	TMR2ON= 1;				//Turn on timer2
	TMR2=0;					//clear timer2
	TRISCbits.TRISC2 =0;	//enable and turn on PWM(CCP1)

while (1){

               for(int dc = 0 ; dc < 255; dc++)
                        {
                       
                        CCPR1L = dc ;
                        __delay_ms(100) ;
                        } 
				for(int dc = 0 ; dc < 256; dc++)
                        {
                       
                        CCPR1L = 255- dc ;
                        __delay_ms(100) ;
                        }

	
		}
}
ممكن تشوفه معقد في البداية بس حاول تقرا الداتا شيت وتقرا الكود مره واثنين وان شاءالله راح تتضح الامور وتكون سهلة ان شاءالله. نقطة اخيرة,, انا في الكود المكتوب في الاعلى مستخدم دقة 10 بت,وتستطيع استخدام المعادلة للتاكد. ولكن هل لاحظت ايضا في الكود اني اغير ال duty cycle من 0 الى 255. المفروض تكون من 0 الى 1023 ؟؟ السبب ان الميكروكنترول يعمل على 8 بت, بمعنى اخرى ان كل ريجستر يحتوي فقط على 8 بت. ولكن عند ضبط ال pwm على 10 بت, يقوم البيك باستخدام ريجستر كامل يسمى CCPR1L وهذا يوجد فيه 8 بت.. وريجستر اخر يسمى CCPR1H يوجد فيه ال 2 بت المتبقية.
ال CCPR1H يوجد فيه ال LSB (2^0 , 2^1
|0^2| 1^2|
اما ال CCPR1L يوجد فيه باقي ال 8 البت كالتالي:
|2^2| 3^2|4^2|5^2|6^2|7^2|8^2|9^2|

في الكود الي كتبته انا لم اغير قيمة ال CCPR1H اذا قيمتها الافتراضية صفر..ولكن قمنا بتغيير قيمة CCPR1L من 0 الى 255
بمعنى اخر ان القيمة النهائية سوف تكون مجموع ال CCPR1H و CCPR1L
فمثلاً:
صفر ديوتي = 00 0000 0000
50% ديوتي =00 0000 1000 ( لاحظ غيرنا فقط اخر 8 بت وهي تساوي 128 ولكن عند جمعها في عشره بت تكون القيمة 512)
100% ديوتي= 00 1111 1111 ( هنا نلاحظ اخر ثمنية بت تمثل 255 , و مجموع العشره بت 1020 وليس 1023) ولكن استطيع الحصول على 1023 عن طريق وضع قيمة ال CCPR1H= 3. ولكن هل تعلم 1020 كما تساوي في مخرج الى pwm ؟؟
PWM output = (5*1020)/1024=4.98V
اذا تقريباً 5 فولت
واغلب الاكواد المستخدمه لدقة عشرة بت تستخدم نفس الطريقة (تغيير قيمة الى CCPR1L فقط).
ولدقة 8 بت..نستخدم 2 بت من ريجستر CCP1H وتكون LSB و6 بت من ريجستر CCP1L وتكون ال MSB
CCP1L CCP1H
|0^2|1^2| |2^2|3^2|4^2|5^2|6^2|7^2|
صفر ديوتي = 00 0000 00
50% ديوتي = 00 1111 01 (اخر 6 بت تمثل 32 ومجموع ال 8 بت تمثل 124)
100% ديوتي = 00 1111 11 ( اخر 6 بت 64 ومجموع ال 8 بت تمثل 252)
ال 50% ديوتي في ال 8 بت تعطي قيمة 2.4 فولت 256/(124*5)
وال 10% ديوتي في ال 8 بت تعطي 4.92 فولت 256/(252*5)
وكما ذكرت يمكن الحصول على دقة عاليه بتغيير قيمة ال CCP1H وليس فقط ال CCP1L.
اسف على الاطالة ولكن احببت ان افصل اكثر حتى تتضح الفكرة بشكل اوضح.



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