راه اندازی سروو موتور بدون pwm

saalek110

Well-Known Member
راه اندازی سروو موتور بدون pwm


سالک: من هنوز این روش را تست نکردم ، فعلا دارم نقل می کنم.
 

saalek110

Well-Known Member



راه اندازی سروو موتور بدون نیاز به PWM!!!​



در این پروژه می خواهیم بدون استفاده از توانایی pwm میکرو، یک سروو موتور را کنترل کنیم!!!

همان طور که در تصاویر زیر مشاهده می کنید، سیگنالی که موتور سروو را به حرکت در می آورد دارای یک دوره تناوب ثابت می باشد که با تغییر مدت زمان یک بودن(یک منطقی)، می توان زاویه آن را تنظیم کرد.



Servo-Signal.jpg

در این پروژه مدت زمان تناوب را ۲۰ میلی ثانیه(فرکانس ۵۰ هرتز) در نظر گرفته ایم.حال با دستور های set و reset و گذاشتن دستور wait بین این دستور ها مدت زمان یک بودن را با تغییر مدت زمان دستور wait، تغییر می دهیم.



PHP:
set portb.1

waitus 1000

reset portb.1

waitus 19000

خط اول، پین یک از پورت B را یک می کند.

خط دوم، این پین را به مدت زمان ۱۰۰۰ میکرو ثانیه(۱ میلی ثانیه) در همان حالت(یک منطقی) نگه می دارد.

خط سوم، این پین را صفر می کند.

خط چهارم، این پین را در همان حالت خط قبل(صفر منطقی) به مدت زمان ۱۹۰۰۰ میکرو ثانیه(۱۹ میلی ثانیه) نگه می دارد.

به این صورت با تغییر دو عدد جلوی خط دوم و چهارم می توان پهنای پالس(مدت زمان یک بودن) را تغییر داد.مجموع این دو عدد باید ۲۰۰۰۰ میکرو ثانیه(۲۰ میلی ثانیه) باشد.


 
آخرین ویرایش:

saalek110

Well-Known Member
پاسخ : راه اندازی و کنترل سرو موتور با AVR

من یه نمونه سروو موتور sg5010 رو با هزار بدبختی راه انداخنتم . آخه اینها هرکدوم یه جوری را ه اندازی می شوند . با کد زیر حد پایین و بالای سروو مشخص شده است .و سروو بین 0 تا 180 درجه


PHP:
#include <mega16.h>
#include <delay.h>

int i,j ;



void main(void){




PORTD=0Xff;
DDRD=0X00;

PORTC=0X00;
DDRC=0XFF;

PORTA=0XFF;
DDRA=0X00;


#asm("sei&quot

while (1) {

if (PIND.0==1){

for(i=0;i<=10;i++){

PORTC.1=1;
delay_us(55);
PORTC.1=0;
delay_ms(5);
}
}
else if (PIND.0==0) {

for(j=0;j<=10;j++) {

PORTC.1=1;
delay_us(290);
PORTC.1=0;
delay_ms(5);
}

}
}
}


سالک: کد کمی مغشوش است.
اون اولش باید این باشه فکر کنم:
PHP:
#include<mega16.h>
#include<delay.h>

و دیگری، فکر کنم باید این طوری باشه:
PHP:
#asm("sei")
 

saalek110

Well-Known Member

در بحث های بالا هم این روش گفته شده.
 

saalek110

Well-Known Member
PHP:
#ifndef F_CPU
#define F_CPU 8000000UL // 8 MHz clock speed
#endif

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    DDRC = 0x01; //Makes RC0 output pin
    PORTC = 0x00;
    while(1)
    {
        //Rotate Motor to 0 degree
        PORTC = 0x01;
        _delay_us(1000);
        PORTC = 0x00;

        _delay_ms(2000);

        //Rotate Motor to 90 degree
        PORTC = 0x01;
        _delay_us(1500);
        PORTC = 0x00;

        _delay_ms(2000);

        //Rotate Motor to 180 degree
        PORTC = 0x01;
        _delay_us(2000);
        PORTC = 0x00;

        _delay_ms(2000);
    }
}


کد بالا برای من اجرا شد ولی وقتی سیم ثابت بود از کار می افتاد یعنی وقتی سیم را قطع و وصل می کردی بین میکروکنترلر و سرو موتور کار میکرد ولی وقتی سیم ثابت بود سروو موتور نمی چرخید.

پورت سی است دقت کنید. به بقیه پورت ها وصل نکنید. منمظورم اینه کد برای پورت سی نوشته شده و مسلما روی اون پایه های میکروکنترلر جواب می دهد.
 

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

بالا