راه اندازی سروو موتور با میکروکنترلر AVR

saalek110

Well-Known Member


در سایت فارسی بالا روش راه اندازی سروو موتور را گفته،
 
آخرین ویرایش:

saalek110

Well-Known Member
PHP:
////////// WWW.EMIC.IR //////////
#include <mega16a.h>      //معرفي کتابخانه ميکروکنترلر مگا 16//
#include <delay.h>        //delay معرفي کتابخانه//
void main(void)
{
int i;      //در روبرو يک متغير براي استفاده در برنامه تعريف شده است//
//است را خروجي کرده ايم PWM که در واقع پين خروجي موج D در زير پين 4 از پورت//
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
//از خط 27 تا 34 تنظيمات واحد تايمر/کانتر 1 ميکرو مي باشند که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند//
//در زير مي توانيد توضيحات مربوط به تنظيمات رجيسترهاي تايمر/کانتر 1 ميکرو را مشاهده کنيد//
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000/000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Disconnected
// OC1B output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 20 ms
// Output Pulse(s):
// OC1B Period: 20 ms Width: 0/400 ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=20000;     //دوره تناوب سيگنال ما را مشخص مي کند که براب با 20000 ميکرو ثانيه يا 20 ميلي ثانيه قرار داده شده است OCR1A رجيستر//
OCR1B=400;       //را مشخص مي کند که براي شروع ان را بربر با 400 ميکرو ثانيه يا 0.4 ميلي ثايه قرار داده ايم PWM عرض پالس سيگنال OCR1B رجيستر//
                 //را بين 400 تا 2400 مقدار دهي مي کنيم تا با ايجاد عرض پالس هاي مختلف سروو موتور در زاويه هاي مختلف چرخش کند OCR1B رجيستر for در ادامه ما توسط دو حلقه//
while (1)
      {
      for(i=400;i<=2400;i++) {    //مي ريزد OCR1B تعريف شده که از 400 تا 2400 شمارش مي کند و درون رجيستر for در روبرو يک حلقه//
       OCR1B=i;
       delay_ms(2);
      }
      for(i=2400;i>=400;i--) {    //مي ريزد OCR1B روبرو برعکس قبلي است يعني از 2400 يکي يکي کم مي کند تا به 400 برسد و مقادير شمارش را درون رجيستر for حلقه//
       OCR1B=i;
       delay_ms(2);
      }
  }
}

سالک:سروو موتور من با این کد کا ر می کنه ...ولی نمی دونم طبق کد است یا نه.
 
آخرین ویرایش:

saalek110

Well-Known Member

ServoMotor_CodeWizard.jpg


راه اندازی سروو موتور با میکروکنترلر AVR​

بهترین گزینه برای راه اندازی سروو موتور استفاده از میکروکنترلر برای تولید پالس PWM است. بنابراین در میکروکنترلرهای AVR از واحد تایمر/کانتر برای سروو موتور استفاده می شود. به علت اینکه فرکانس PWM مورد نیاز برای راه اندازی سروو موتور پایین است (بین ۵۰ تا ۱۰۰ هرتز) و همچنین سیکل وظیفه عملکرد سروو در حد میکروثانیه می باشد، نیاز به یک PWM قوی در راه اندازی آن می باشد تا به درستی راه اندازی شده و کنترل بهتری روی آنها صورت گیرد.

بنابراین برای راه اندازی سروو موتور از واحد تایمر/کانتر ۱۶ بیتی پیشرفته و در حالت عملکرد زیر استفاده خواهیم کرد:

PWM, Phase and Frequency Corret TOP Value = ICR1

در این حالت تولید موج PWM با تفکیک بالا و فرکانس پایینتر نسبت به حالت Fast PWM در دسترس می باشد که برای راه اندازی سروو موتور مناسب است. همچنین در این حالت تایمر از مقدار ۰ تا مقداری که در رجیستر ICR1 تنظیم شود، شمارش می کند. بنابراین میتوان موج PWM با فرکانس متغیری وابسته به مقدار رجیستر تنظیم شده و فرکانس کاری واحد تایمر/کانتر روی پایه خروجی OCX طبق رابطه زیر داشت:

ServoMotor_5


برای داشتن فرکانس ۵۰ هرتز کافی است تا مقدار مناسب برای رجیستر ICR1 را از رابطه فوق به صورت زیر بدست آوریم:

ServoMotor_6


بنابراین با مقدار دهی رجیستر ICR1 به صورت ۴E1F فرکانسی معادل ۵۰ هرتز ( ۲۰ میلی ثانیه ) را تولید خواهیم کرد. بعد از تنظیم این رجیستر ، با استفاده از رجیسترهای OCR1A,OCR1B و OCR1C میتوان سیکل عملکرد ( Duty Cycle ) را تغییر داد. به طوری که به ازای هر واحد تغییر در هر یک از این سه رجیستر، زمان وظیفه به اندازه ۱ میکرو ثانیه تغییر خواهد کرد. بنابراین برای قرار گرفتن سروو موتور در زاویه ۰ درجه کافی است پهنای پالس موج تولید شده ۶۰۰us باشد بنابراین باید رجیستر مربوطه را به صورت زیر قرار دهیم:

OCR1A = 600 us/1us = 600

برای قرار دادن سروو در زاویه ۹۰ درجه نیز باید پهنای پالس ۱۵۰۰us باشد بنابراین باید:

OCR1A = 1500us/1us = 1500

برای قرار دادن سروو در زاویه ۱۸۰ درجه نیز باید پهنای پالس ۲۴۰۰us باشد بنابراین باید:

OCR1A =2400us/1us = 2400



برای اعمال تنظیمات به میکرو از ابزار کدویزارد استفاده می شود. شکل زیر تنظیمات مورد نیاز را برای میکروکنترلر Atmega32 در ابزار کد ویزارد نشان می دهد.
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک: بعد از چند سایت ایرانی ، سراغ سایت های خارجی رفتنم.
 

saalek110

Well-Known Member
PHP:
/*
 * ATmega16_Servo_Motor
 * http://www.electronicwings.com
 */

#define F_CPU 8000000UL        /* Define CPU Frequency e.g. here its 8MHz */
#include <avr/io.h>            /* Include AVR std. library file */
#include <stdio.h>            /* Include std. library file */
#include <util/delay.h>        /* Include Delay header file */

int main(void)
{
    DDRD |= (1<<PD5);    /* Make OC1A pin as output */
    TCNT1 = 0;            /* Set timer1 count zero */
    ICR1 = 2499;        /* Set TOP count for timer1 in ICR1 register */

    /* Set Fast PWM, TOP in ICR1, Clear OC1A on compare match, clk/64 */
    TCCR1A = (1<<WGM11)|(1<<COM1A1);
    TCCR1B = (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(1<<CS11);
    while(1)
    {
        OCR1A = 65;        /* Set servo shaft at -90° position */
        _delay_ms(1500);
        OCR1A = 175;    /* Set servo shaft at 0° position */
        _delay_ms(1500);
        OCR1A = 300;    /* Set servo at +90° position */
        _delay_ms(1500);
    }
}

Screenshot_۲۰۲۳-۱۰-۱۷_۰۹۲۷۳۳.jpg



کدش با کد سایت emic ایرانی تفاوتهایی دارد.
 
آخرین ویرایش:

saalek110

Well-Known Member
PHP:
bout servo motors by knowing their importance in Robotics.


Code
#define F_CPU 1000000UL

#include<avr/io.h>

#include<util/delay.h>

 

 

void main()

{

//Configure TIMER1

TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); //NON Inverted PWM

TCCR1B|=(1<<WGM13)|(1<<WGM12)|(0<<CS11)|(1<<CS10); //PRESCALER=1 MODE 14(FAST PWM)

   

ICR1=19999; //fPWM=50Hz (Period = 20ms Standard).

 

DDRD|=(1<<PD4)|(1<<PD5); //PWM Pins as Out

   

while(1)

{

 

        OCR1A=0; //0 degree

        _delay_ms(1000);

 

OCR1A=600; //45 degree

_delay_ms(1000);

 

OCR1A=950; //90 degree

_delay_ms(1000);

 

OCR1A=1425; //135 degree

_delay_ms(1000);

 

OCR1A=1900; //180 degree

_delay_ms(1000);

     

    OCR1A=1425; //135 degree

        _delay_ms(1000);

 

OCR1A=950; //90 degree

_delay_ms(1000);

 

OCR1A=650; //45 degree

_delay_ms(1000);

 

}

}


کد این سایت ، با کد سایت پست قبل تقریبا یکی است.
 

saalek110

Well-Known Member
سالک: من کد سایت خارجی را به شکل زیر تغییر دادم.



PHP:
 #include <mega16a.h>
#include <delay.h>        /* Include Delay header file */

void main(void){
DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);    TCNT1 = 0;            /* Set timer1 count zero */
   // ICR1 = 2499;        /* Set TOP count for timer1 in ICR1 register */

    /* Set Fast PWM, TOP in ICR1, Clear OC1A on compare match, clk/64 */
    TCCR1A = (1<<WGM11)|(1<<COM1A1);
    TCCR1B = (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(1<<CS11);
    while(1)
    {
        OCR1A = 65;        /* Set servo shaft at -90° position */
        delay_ms(1500);
        OCR1A = 175;    /* Set servo shaft at 0° position */
        delay_ms(1500);
        OCR1A = 300;    /* Set servo at +90° position */
        delay_ms(1500);
    }
}

سروو موتور حرکت می کند ولی نه دائمی. با کشیدن و زدن سیم به میکروکنترلر مقداری می چرخد ولی با حالت ثابت سیم نمی چرخد. بعدا بررسی می کنم ببینم علت چیه.
طرز وصل کردن سیم ها ، طبق عکس زیر است. میکروکنترلر من Atmega16 است.
سیم دیتا برای سروو موتور از d5 گرفته شده که میشه دومی از پایین.
دیگه چیز خاصی نداره ، دو سیم تغذیه به میکروکنترلر وصل است و می بینید از بردبورد برق گرفته ،
و سروو موتور هم از برد بورد برق گرفته.
مدار خیلی ساده است.
منبع تغذیه در عکس نیست و دو سیم به لاین های کناری بردبورد داده.


a1.png

a12.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک: یک احتمال مربوط به تغذیه سروو موتور است، شاید نیاز به راه اندازه داره ، چون من می دیدم وقتی سروو می چرخید فشار به منبع تغذیه می اومد.

در یک سایت فارسی هم دیدم یک نفر در مورد راه انداز سروو موتور حرف زده بود.او گفته بود وقتی سروو موتور زیر بار باشد نیاز به منبع تغذیه قوی تر هست. البته شاید سروو موتور او بزرگ بود نه این سروو موتور کوچکی که من تست می کنم.
بهرحال اشاره کردم شاید مفید باشد.
 
آخرین ویرایش:

saalek110

Well-Known Member
آخرین ویرایش:

saalek110

Well-Known Member
سالک : متن زیر را ببینید:



راه اندازی موتور ها با L298
با عرض سلام و خسته نباشید خدمت دوستان عزیز.
بنده یه سئوالی در مورد آیسی L298 داشتم. اول اینکه داغ شدن این آیسی در هنگام کار یک امر طبیعی است یا ممکنه قطعه مورد داشته باشه . چون وقتی موتور هارو به درایورم وصل می کنم ناجور داغ می کنه به حدی که می تونه دست رو بسوزونه.
در مورد اتصالاتش هم باید بگم که برای تغذیه خود آیسی از یک تغذیه مجزای 5 ولت و برای تغذیه موتورها از یک تغذیه 9 ولت با جریان 250 میلی آمپر استفاده می کنم. یعنی پایه های 8 و 9 درایور رو به تغذیه 5 ولت و پایه های 1 و 15 رو به منفی تغذیه 9 ولت و پایه 4 رو هم به مثبت تغذیه 9 ولت وصل کردم.

 

saalek110

Well-Known Member
Screenshot_۲۰۲۳-۱۰-۳۱_۰۵۵۷۲۶.jpg

در جزوه فوق نوشته : باید پایه ocn به عنوان خروجی انتخاب شود. مثلا oc0 یا oc1
سالک: من فعلا مطمئن نیستم ، ولی اشاره کردم تا شما حواستون باشه...
یعنی احتمالا این جوری نیست که هر پای ای دوست داشتیم انتخاب کنیم...باید پایه oc باشه
 

saalek110

Well-Known Member
جزوه خوبیه. بخوانید.
من جزوه را مرور کردم ، برای سروو موتور نیست... برای موتورهای دیگر است.... ..در جای خود بحث خوبی است.
 
آخرین ویرایش:

saalek110

Well-Known Member
شاید بهتر باشه با تایمر صفر کار کنیم نه تایمر ۱
چون ۸ بایتی است و ساده تره.

شایدم نشه. گفتم برای توجه دادن.خودتان فکر و بررسی کنید.
 

saalek110

Well-Known Member
L293 میگن ۶۰۰ میلی آمپر است و L298 دو آمپر... البته در فروم ایران ویچ بچه ها گفتند... مطالب اون فروم را بخوانید
در این پست یک راهنمای فارسی برای L293 می زارم.۳ صفحه بیشتر نیست.
 

پیوست ها

  • L293_f.pdf
    410.1 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

جدیدترین ارسال ها

بالا