ايران ويج

نسخه‌ی کامل: برنامه اي براي قطعه "موتور-اينکودر" پروتيوس
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام:

فکر کنم همه با قطعه ي 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][تصویر:  simulation1.jpg]
کد:
/ ****************************************************
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]
کسی نیس یه راهنمایی یا کمک بکنه؟؟؟
برنامه اسکن کیبورد کاری نداره ..
کد:
flash int scan[4]={0X01,0X02,0X04,0X08};
unsigned char arrkey[16]={
7,8,9,20,
4,5,6,30,
1,2,3,40,
70,0,60,50};
char key;

unsigned char keypad(){
unsigned char r,b;
while(1){
for (r=0; r<4; r++){
b=4;
PORTC=scan[r];
if(c1==0) b=0;
if(c2==0) b=1;
if(c3==0) b=2;
if(c4==0) b=3;

if (!(b==4)){
key=arrkey[(r*4)+b];
while(c1==0);
while(c2==0);
while(c3==0);
while(c4==0);
delay_ms(50);
return key;
}
}
}
}
برای چپ گرد راست گردم می تونی از یک دستور شرطی ساذه میتونی استفاده کنی.
(۰۹-خرداد-۱۳۹۱, ۰۰:۱۹:۰۹)h0x00i نوشته است: [ -> ]برنامه اسکن کیبورد کاری نداره ..
کد:
flash int scan[4]={0X01,0X02,0X04,0X08};
unsigned char arrkey[16]={
7,8,9,20,
4,5,6,30,
1,2,3,40,
70,0,60,50};
char key;

unsigned char keypad(){
unsigned char r,b;
while(1){
for (r=0; r<4; r++){
b=4;
PORTC=scan[r];
if(c1==0) b=0;
if(c2==0) b=1;
if(c3==0) b=2;
if(c4==0) b=3;

if (!(b==4)){
key=arrkey[(r*4)+b];
while(c1==0);
while(c2==0);
while(c3==0);
while(c4==0);
delay_ms(50);
return key;
}
}
}
}
برای چپ گرد راست گردم می تونی از یک دستور شرطی ساذه میتونی استفاده کنی.

ممنون از ارسال کد،از نحوه کارش سر در آوردم،میشه اضافه کنید چطوری میشه یه عدد 2رقمی یا سه رقمی رو از کیپد بگیرم و ذخیره کنم که بعدا تو برنامه ازش استفاده کنم.
یک آرایه تعریف کنی اولین مقدار کیبورد د بگیره و ذخیره کنه دومین عدد بگیره و به 10 ضرب کنه و با عدد اول جمع کنه و ذخیره کنه بعد سومین عدد بگیره و به 100 ضرب کنه و با عدد قبلی که ذخیره شده جمع کنه همین طوری به ترتیب 1000 و 10000 و....