كثيرا ما نحتاج عمل 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 كما نعلم هو
نريد الان ان يكون زمن Ton للنبضة هو 10 ms وزمن ال Toff هو 10 ms
مهمتنا الان استخدام التايمر زيرو الموجود فى الميكرو كنترول ليعد زمن10 ms وتغيير حالة النبضه فى كل مرة من 1 الى 0 و العكس.
ليتم ذلك نقوم بحساب تردد الكرستاله المستخدمة و منها معهرفة زمن تنفيذ التعليمة فى كل دورةinstruction cycle time
فى حالة استخدام كريسالة 4MHZ يكون زمن التعليمة فى كل دورة هو 1 ميكرو ثانية لكل دورة.
اى ان التايمر زيرو سيستغرق 256 ميكرو ثانية فقط ليعد من صفر الى 256
وفى حالة استخدام مجزىء PRESCALER للتايمر بقيمة 256 يكون الزمن الكلى المحسوب هو
من هذا bالمنطق يمكننا ان نجعل التايمر زيرو يحسب زمن10 msنجعل التايمر يعد 125 عدة count بقيمة 125ميكرو ثانية(عن طريق تخزين قيمة 256-125=131)ثم استخدام مجزىء بقيمة 16 بالتالى اصبح الزمن الكلى المحسوب حتى الان هو 125*16=2000 ميكرو ثانية او 2 ميللى ثانية
استخدمنا متغير اسمه x عندما يحدث طفحان للتايمر يزداد قيمتة حتى يصل الى القيمة 5 و فى هذة الحالة يكون الزمن الكلى المستغرق هو
وهذا هو البرنامج كاملا
كود:
// 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
}}
والان مع صورة للمشروع