السلام عليكم
اخواني عندي مقترح لكون عمليه توليد pwm لكل طرف تحتاج بحاجه الى دقه لان سيرفو يتعامل بزوياه دقيقه من 0 الى مثلا 180 بخطوه درجه درجه
اقترح نعمل برنامج فقط للسيرفو اي نستخدم مايكروكنترولر يكون درايفر ويتم وضع برنامج صغير وقليل الاكود (( لان كثره الاكواد يؤثر على زاويه لانه لايمكننا اعطاء انتربت مثلا لكل 10 مايكرو ثانيه لان مايكرو عندها سوف ينتحر لامحاله طبعا امزح ))
اما كيف نتحكم بزاويه فيمكنه ربطه عبر مايكرو اخر تتم فيه عمليه حسابات الزاويه ثم ترسل اما عبر uart او SPI
ولقد قمت بكتابه الكود بسيط ولكن احتاج الى فهم بعض امور الغريبه
كود:
#define max_angle_servo 360
#define min_pulse_micro_second_servo 100 // 1000us/10=100 us
#define max_pulse_micro_second_servo 200 // 2000us/10=200 us
//*******************************************************************//
unsigned char m1=0,m2=0,m3=0,m4=0;
unsigned int cont1,cont2,cont3,cont4 ,cont5;
//unsigned int delay_waitting=min_pulse_micro_second_servo , contm2=0 , contm1;
//*****************************************************************************//
//Timer0
//Prescaler 1:1; TMR0 Preload = 246; Actual Interrupt Time : 10 us
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x88;
TMR0 = 246;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 246;
//Enter your code here
cont1 +=10;
cont2 +=10;
cont3 +=10;
cont4 +=10;
cont5 +=10;
if(cont1==1200){portd.f0=0;}
if(cont2==1300){portd.f1=0;}
if(cont3==1500){portd.f2=0;}
if(cont4==1700){portd.f3=0;}
if(cont5==20000){portd=255;cont1=0;cont2=0;cont3=0;cont4=0;cont5=0;}
}
}
//*******************************************************************//
void main()
{
adcon1=6;
InitTimer0() ;
trisd=0;
portd=0;
m1=0;
while(1)
{
// check angle
}
}
مشكله هي لاحصل على ماريده بالضبط فمثلا اريد تشغيل محرك 1 بزاويه 180 درجه (( محرك سيرفو 360 درجه)) هنا اعطيته نبضه 1.5ms ومفروض اطفاء بعد
20-1.5 ولما كان انتربت يحدث كل 10 us
cont1 +=10 يعني كل انتربت اضيف 10 فمن مفروض انه 150 هي تعادل 1500 و 2000 تعادل 20000
فأين مشكله
تحياتي