دسته بندی نشده

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

با استفاده از این برنامه می توانید تنها با تغییر مقدار ms1 و ms2 که متغیر های حالت موتور یک و دو هستند آنها را به حرکت در آورید .

Maze_motor_v01

در این برنامه از تایمر یک و وقفه آن طوری استفاده شده که هر 25 میلی ثانیه تایمر سر ریز شده و برنامه به داخل تابع وقفه می آید ؛ در وقفه تایمر یک ، حرکت دادن موتورها با توجه به خواسته ای که ما برای  داریم و آن را در متغییر های ms1 و ms2 اعمال میکنیم صورت می گیرد :

0 نشان دهنده متوقف شدن موتور است

1 نشان دهنده حرکت موتور به سمت جلو ست

2 نشان دهنده حرکت موتور به سمت عقب است

—————

یعنی اگر داخل متغییر ms1 عدد یک را قرار دهیم موتور یک ، به سمت جلو شروع به حرکت میکند تا موقعی که عدد داخل متغییر تغییر کند و اگر داخل متغییر مربوطه عدد دو را قرار دهیم این موتور به سمت عقب حرکت کرده و اگر عدد صفر قرار دهیم موتور سر جای خود قفل میشود .

برا ی موتور دوم هم به همین صورت عمل میکنیم ، حال اگر بخواهیم روبات به سمت جلو حرکت کند داخل متغییر ها به این صورت عدد قرار می دهیم :

ms1=1;
ms2=1;

برای گردش به راست :

ms1=1;
ms2=2;

گردش به چپ :

ms1=2;
ms2=1;

حرکت ربات به سمت عقب :

ms1=2;
ms2=2;

دانلود برنامه:

Maze_motor_v01

/*****************************************************
Project : Maze Robot
Version : 01
Date    : 2011/08/14
Author  : Kawousy
Company : PSR
Comments:
Kelase robotic pishrafte
*****************************************************/

#include <mega32.h>
#include <delay.h>
#include <stdio.h>

#include <alcd.h>

#define speed 3125

#define front_m 1
#define back_m 2
#define stop 0

char mp1=1,mp2=1;
char ms1=stop,ms2=stop;

تابع وقفه تایمر یک :

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
        TCNT1=65535-speed;// سر ریز در هر 25 میلی ثانیه
        if(ms1==front_m)
        {
                switch (mp1)
                {
                        case 1 : mp1=4;
                        break;
                        case 4 : mp1=2;
                        break;
                        case 2 : mp1=8;
                        break;
                        case 8 : mp1=1;
                        break;
                };

        }
        else if(ms1==back_m)
        {
                switch (mp1)
                {
                        case 1 : mp1=8;
                        break;
                        case 4 : mp1=1;
                        break;
                        case 2 : mp1=4;
                        break;
                        case 8 : mp1=2;
                        break;
                };
        }
//====================================
        if(ms2==front_m)
        {
                switch (mp2)
                {
                        case 1 : mp2=4;
                        break;
                        case 4 : mp2=2;
                        break;
                        case 2 : mp2=8;
                        break;
                        case 8 : mp2=1;
                        break;
                };

        }
        else if(ms2==back_m)
        {
                switch (mp2)
                {
                        case 1 : mp2=8;
                        break;
                        case 4 : mp2=1;
                        break;
                        case 2 : mp2=4;
                        break;
                        case 8 : mp2=2;
                        break;
                };
        }
       
        PORTC=(mp2<<4)|mp1;

}

unsigned char adc_data;
#define ADC_VREF_TYPE 0x20

interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCH;
}

unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
#asm
in   r30,mcucr
cbr  r30,__sm_mask
sbr  r30,__se_bit | __sm_adc_noise_red
out  mcucr,r30
sleep
cbr  r30,__se_bit
out  mcucr,r30
#endasm
return adc_data;
}

void main(void)
{
PORTA=0x0F;
DDRA=0x0F;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0xF0;
DDRD=0xF0;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

//راه اندازی تایمر با پالس ورودی 125 هزار در دقیقه

TCCR1A=0x00;
TCCR1B=0x03;
TCNT1=65535-speed;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x04;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;

SPCR=0x00;

TWCR=0x00;

//lcd_init(16);

#asm(“sei”)

//lcd_putsf(“administrator”);

while (1)
{
        ms1=1;//سه ثانیه حرکت به جلو
        ms2=1;
delay_ms(3000);
        ms1=1;
        ms2=2;// سه ثانیه گردش به راست
delay_ms(3000);
        ms1=2;
        ms2=1;// سه ثانیه گردش به چپ
delay_ms(3000);
        ms1=2;
        ms2=2;// سه ثانیه جرکت به عقب
delay_ms(3000);

}
}

 

برچسب ها

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید

بستن
بستن
بستن