سلام:
فکر کنم همه با قطعه ي MOTOR-ENCODER توي پروتيوس آشنا هستند،ولي بازم يه توضيح کوچولو ميدم.اين قطعه يه موتور دي سي و يک اينکودر سه سيمه هست که به صورت مجازي به هم متصلند.همونطور که تو شکل ميبينيد 5 تا پايه داره ، دوتا پايه چپ و راست براي چپگرد و راستگرد بودنه موتوره و سه تاي بالايي خروجي اينکودره.
حالا برا اين قطعه يه برنامه کنترلي با ميکرو ميخام بنويسم که يه قسمتشو نوشتم و بقيه رو هم به کمک دوستان انشالا مينويسيم و اين پروژه رو کامل ميکنيم.
دوستان کاري که ميخاييم اين برنامه انجام بده اينه که با اسفاده از کيپد 4X4 (که تو پروتيوس هست ) زاويه چرخش اين موتور رو کنترل کنيم (هم چپگرد هم راستگرد) و تو ال سي دس ببينيم.مثلا اگه عدد 10 رو وارد کرديم و دکمه راستگرد رو زديم موتور شروع به حرکت کنه و بعد از 10 درجه وايسه و يا اگه عدد 50 رو وارد کرديم و کليد چپگرد رو زديم 50 درجه به چپ حرکت کنه و وايسه.
برا اين کار ميکرو مگا32 رو انتخاب کردم و همونطور که تو شکل ميبينيد دوتا پايه A و B خروجي اينکودر رو (که 90 درجه با هم اختلاف فاز دارن متناسب با چپگرد يا راست گرد بودن يکي جلوتر از ديگريه) به پايه هاي اينتراپت ميکرو وصل کردم ، السي دي هم که به پورت A وصله.برنامه زير فقط برا قسمت اينتراپته که با فرمان دادن به پايه هاي موتور(فعلا به صورت دستي) موقعيت اينکودر تغيير پيدا ميکنه و تو ال سي دي نمايش داده ميشه.
قسمتهايي که برا تکميل اين پروژه نياز داريم:
1-برنامه اسکن کيپد 4X4
2-برنامه چپگرد و راستگرد واسه موتور متناسب با مقداري که با گيپد وارد ميکنيم.
3-برنامه اي برا تبديله مقدار متغيير char که تو ال سي دي با عنوانه position ميبينيم.(چون اين متغيير از نوع char هست بازه اش 0-255 هست فرمولي ميخاهيم که اينو به درجه تبديل کنه 0-360 درجه)
کامپايلر کدويژن هست و pulse per revolution اينکدر رو 360 تنظيم شده.ممنون ميشم اگه همکاري کنيد.
[left]
کد:
/ ****************************************************
Chip type : ATmega32
Program type : Application
Clock frequency : 8.000000 MHz
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
char position,prevEnc;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if ( PIND.2==prevEnc )
position++;
else {
position--;
}
prevEnc=PIND.3;
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
}
void main(void)
{
char buffer[40];
GICR|=0xC0;
MCUCR=0x0F;
MCUCSR=0x00;
GIFR=0xC0;
lcd_init(16);
#asm("sei")
while (1)
{
sprintf(buffer,"position=%d",position);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(buffer);
delay_ms(300);
};
}
[/left]