ايران ويج

نسخه‌ی کامل: کنترل استپ موتور با usart و pc
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
فک کنم اینجا هم طبق قوانین بقیه سایتها برای هر مشکل باید یه تاپیک جدید باز کرد
خواهشمندم توی این مشکل هم به من راهنمایی کنین چون واقعا لنگش هستم و باید طی این هفته تمومش کنم
واقعا دیگه هنگ کردم ، پس تو رو خدا کمک کنین تا هم من مشکلم حل شه و هم بزاریمش تو سایت تا بقیه هم بتونن استفاده کنن

این برنامه سه کاراکتر که یه عدد سه رقمی باشه رو از پورت سریال کامپیوتر دریافت میکنه و به میزان عدد دریافتی استپ موتور رو میچرخونه ،مثلا اگه عدد ورودی 270 باشه استپ موتور با دقت 1 درجه رو 270 درجه میچرخونه
براین این کار از وقفه سریال usart با بافر 3 تایی استفاده شده ، آرایه rx_buffer توسط کد ویزارد برای ذخیره دیتای ورودی و آرایه databuff نوع int برای بدست آوردن و ذخیره عدد نهایی است که در sum ذخیره میشود و sum و count هم int هستند

کد:
databuff[0] = rx_buffer[2];
databuff[1] = rx_buffer[1];
databuff[2] = rx_buffer[0];

databuff[1] = databuff[1] * 10;
databuff[2] = databuff[2] * 100;

sum = databuff[0] + databuff[1] + databuff[2];
count =0x00;
while(1)
{
for(num=0;num<4;num++)
{
count ++;
if(count<sum)
{
PORTC = step[num];
delay_ms(40);
}
else
{
goto end;
}
}
}


end:
همچنین برنامه بالا در قسمت فعال شدن وقفه وقتی هر سه کاراکتر دریافت بشن قرار داره
برنامه کامل
کد:
#include <mega8.h>
#include <delay.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 3
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
unsigned int databuff[3],sum,sum2,count;
char step[]={0x66,0x33,0x99,0xcc},num;

status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
//***************************************
databuff[0] = rx_buffer[2];
databuff[1] = rx_buffer[1];
databuff[2] = rx_buffer[0];

databuff[1] = databuff[1] * 10;
databuff[2] = databuff[2] * 100;

sum = databuff[0] + databuff[1] + databuff[2];

count =0x00;
while(1)
{
for(num=0;num<4;num++)
{
count ++;
if(count<sum)
{
PORTC = step[num];
delay_ms(40);
}
else
{
goto end;
}
}
}


end:
//**************************************
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>


void main(void)
{
PORTC=0x00;
DDRC=0xFF;

UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
#asm("sei")

while (1)
{


};
}
ممنون میشم اگه کمکم کنید
حیف که اهل کدویژن نیستم ولی یه برنامه نمونه با بسکام و موتور پله ای می ذارم !!!
اضافه کردن پورت سریال هم بهش کاری نداره !
خواستین بگین واستون بذارم !!!! ( البته خودتون راحت می تونین بذارین )




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




[تصویر:  609c5e7b17f54e4f8c7f.PNG]


کلید R/L جهت چرخش موتور پله ای رو مشخص می کنه !
در هنگام حرکت نیز می توانید جهت چرخش رو عوض کنین !

با کلید های + و - تعداد دور رو مشخص کنین و کلید set رو بزنین و حال سرعت چرخش رو مشخص کنین و کلید set رو بزنین تا موتور شروع به حرکت طبق تعدا دور و سرعت وارد شده بره !!!

در حین حرکت روی LCD تعداد دور چرخیده و تعداد کل دور چرخش نمایش داده میشه !!

با تمام شدن تعداد دور چرخش موتور متوقف می شود و همچنین در حین حرکت با فشردن کلید ESC می توان موتور رو متوقف کرد !!

در هنگام تنظیم سرعت هم با فشردن کلید ESC به مرحه به بالا ( تنظیم تعداد دور ) می رویم !!!

برنامه مدار تحت بسکام و فایل تست برنامه تحت پرتئوس 7.6 و... رو تونین از فایل زیر دریافت کنین !

دریافت فایل : http://www.iranled.com/forum/attachment.php?aid=5025

امیدوارم برنامه مورد استفاده دوستان قرار بگیره !!!

نکته : برنامه فوق برای موتورهای پله ای 1.8 درجه تعداد چرخشش درسته و برای بقیه موتورها باید تو برنامه تو تابع MOVE یه تغییر کوچولو بدین !

در آخر برنامه به جای 200 باید عدد مناسب قرار بگیره !

کد php:
For 1 To 200 

چون موتور پله ای در نظر گرفته شده 1.8 درجه است پس باید 200 پالس داده بشه تا 360 درجه بچرخه !
واسه بقیه موتورها با درجه های مختلف با تقسیم ساده عدد مناسب رو جایگزین کنین !

مثلا واسه موتور پله ای 15 درجه باید عدد 24 قرار بگیره !
چون 360 تقسیم بر 15 میشه 24 !!

منبع : http://www.iranled.com/forum/showthread....#pid126852
ممنون ازتون اگه نتونستم از کدویژن جواب بگیرم باید یه جوری با بسکام یه کاری کنم ولی متاسفانه بهش زیاد مسلط نیستم
به هر حال بازم ممنون که وقت گذاشتین
+ کس دیگه ای نظری نداره ؟
شدن که میشه حداقل دوستای من این کار رو خیلی راحت با کدویژن انجام داده بودن ولی بسکام یه چیز دیگست !
فکر میکنم اشکال از قسمتی باشه که اطلاعات ورودی رو سرهم میکنه و مقدار چرخش رو مشخص میکنه باشه
کد:
databuff[0] = rx_buffer[2];
databuff[1] = rx_buffer[1];
databuff[2] = rx_buffer[0];

databuff[1] = databuff[1] * 10;
databuff[2] = databuff[2] * 100;

sum = databuff[0] + databuff[1] + databuff[2];
کسی میتونه راهنمایی کنه که این کدها اشکال دارن یا نه ؟ [/align]
سلام همونطور که حدس میزدم مشکل از قیمت تبدیل بوده چون من اعمال ریاضی رو کد کاراکترها انجام میدادم نه خود اعداد
حالا باید کاراکتر ها رو به مقدار عددیشون تبدیل کنم
با تابع atoi توی فایل هیدر stdlib میشه این کارو انجام داد ولی راستش نمیدونم طرز استفاده از تابع چجوریه
کسی میتونه کمک کنه ؟
اول لودش کن بعد توی help کدویژن سرچ کن نمونه هاشو ببین