امیرحسین حسینعلی پور
امیرحسین حسینعلی پور
خواندن ۶ دقیقه·۳ سال پیش

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


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

دانشجو:

امیرحسین حسینعلی پور

استاد محترم : جناب مهندس یعقوبی تبار

خرداد 1400


مقدمه:

میکروکنترلرها تراشه های قابل برنامه ریزی هستند که به عنوان قلب تپنده و مدیر یک برد محسوب می شود به طوری که ما در برد الکترونیکی با برنامه نویسی به ان فرمان های مورد نیاز را منتقل می نماییم تا میکروپروسسور عملیات مورد نظر را پردازش و انجام دهد.

برخی از توانایی های این محصول عبارتند از :کنترل کیبوردها حسگرهای مختلف صفحات نمایشی و مدیریت ونگهداری اطلاعات و..... میکروکنترلر AVR ساخته شده شرکت ATMEL می باشد که در دنیا بسیار مورد توجه قرار گرفته است. نسل های قبلی که به میکروکنترلر های سری 80 معروفند امروزه جای خود را به این خانواده پرکاربرد در محصولات الکترونیکی داده اند . در طراحی های روز الکترونیک دیگر کمتر دیده می شود که در دل خود این قطعه کنترلی پر قدرت را جای نداده باشد.

خانواده AVR به سه سری زیر تقسیم می شوند:

:AT90S سری.1

این سری اعضای کلاسیک خانواده AVR را تشکیل می دهند و قابلیت های کمتری نسبت به دو سری دیگر دارند و کمتر استفاده می شوند.

:ATtiny سری.2

این میکروکنترها در ابعاد کوچک 8 و20 و28 پایه هستند و قابلیت خوبی نسبت به سری اول دارند و بیشتر در سیستم هایی که نیاز به پورت بالا نیست استفاده می شوند. یکی از اعضای 8 پایه این سری ATtiny85است که دارای امکانات خوبی از جمله مبدل ADC می باشد.

:ATmega سری.3

این سری از میکروکنترلرهای AVR امکانات بیشوتری نسبت به دو سری قبلی دارند و توجه مخاطبان را به خود جلب نموده اند.

چکیده:

در این پروژه ما به وسیله ی میکروکنترلر AVR(ATmega16A) , ماژول l298n , استپر موتور , lcd و push button سیستمی طراحی نموده ایم که میتوان با ان زاویه استپر موتور را تغییر داد.

: ATmega16 معرفی

ATmega16

میکروکنترلر Atmega16 یک میکروکنترلر پرکاربرد در بازار است و در پروژه های زیادی استفاده می شود. بیشترین استفاده این میکروکنترلر در پکیج PDIPاست که همانند Atmega32 دارای ۴۰ پین و ۳۲ پین ورودی و خروجی دارد .این میکروکنترلر AVR در پکیج ۴۴ پایه TQFP نیز برای مصارف SMD یافت می شود .میکرو کنترلر Atmega16A یکی از سری های Atmega16 می باشد. پسوند A دارای این معنی است که این میکرو بر خلاف Atmega16 که از ولتاژ ۴٫۵ تا ۵٫۵ ولت می تواند کار نماید همانند سری L می تواند با ولتاژ ۲٫۷۵ تا ۵٫۵ ولت کار کند اما بر خلاف سری L که دارای ماکزیمم فرکانس هارانتی شده ۸ مگاهرتز است Atmega16Aهمانند Atmega16می تواند دارای منبع کلاک تا سرعت ۱۶ MHzباشد.

ویژگی های میکروکنترلر : Atmega16A

پایداری بالا

مصرف توان کم

میکروکنترلر ۸ بیتیAtmel

معماری RISC پیشرفته ۱۳۱ دستورالعمل قدرتمند اجرای اغلب دستورالعمل ها در یک کلاک ۳۲ رجیستر ۸ بیتی با کاربرد عمومی بیش از ۱۶ میلیون دستورالعمل بر ثانیه (MIPS)با کلاک ۱۶ مگاهرتز( MHz)

۱۶ کیلوبایت حافظه فلش قابل برنامه ریزی

EEPROMبایت ۵۱۲ 

۱ کیلوبایتSRAM

قابلیت برنامه ریزی حافظه فلش تا ۱۰٫۰۰۰ بار و حافظه ی EEPROM تا ۱۰۰٫۰۰۰ بار

ماندگاری برنامه تا ۲۰ سال در دمای ۸۵ درجه و ۱۰۰ سال در دمای ۲۵ درجه سانتی گراد

دارای قفل برنامه برای حفاظت از نرم افزار

رابط JTAG مطابق استاندارد1149.1IEEE

دارای ۲ تایمر ۸ بیتی

دارای یک تایمر ۱۶ بیتی

دارای RTC با اسیلاتور مجزا

۴ کانالPWM

۸ کانال ADC ده بیتی

TWIیا TWO WIRE رابط سریال  USART 

Master/Slaveدر حالت SPI رابط سریال 

دارای تایمر دیده بان با اسیلاتور مجزای داخلی

مقایسه هر انالوگ داخلی

دارای اسلاتور RC کالیبره شده داخلی

۳۲ پورت ورودی و خروجی

ولتاژ تغذیه ۲٫۷۵ تا ۵٫۵ ولت

پشتبانی از فرکانس ۰ تا ۱۶ مگاهرتز

مصرف انرژی در فرکانس ۱ مگاهرتز ولتاژ ۳ ولت ودمای ۲۵ درجه : فعال : ۰٫۶ میلی امپر – حالت بیکاری: ۰٫۲ میلی امپر – حالت Power Down کمتر از ۱ میکرو امپر

معرفی استپر موتور:

استپ موتورها موتورهای DC هستند که در مراحل هسسته ای حرکت می کنند. آنها دارای چند سیم پیچ هستند که در هروه هایی به نام "فاز "سازماندهی می شوند. با انرژی هر فاز به ترتیب ، موتور چرخش می یابد ،یک قدم در یک زمان .

با یک پله کنترل شده کامپیوتر می توانید موقعیت یابی دقیق و یا کنترل سرعت را بدست اورید. به همین دلیل ، موتورهای استپر موتور انتخاب بسیاری از پروژه های کنترل حرکات دقیق هستند .

مدلسازی ساده از استپ موتور

شکل بالا مدلسازی ساده استپ موتور میباشد.با کنترل کردن کویل ها و ترتیب فعال شدن هرکدام از انها میتوانیم زاویه شفت را تغییر دهیم.با توجه به مدل موتور ما در این پروژه هام شفت استپ موتور 45 درجه میباشد.

در این پروژه پایه های c0,c1,c2,c3 به درایو متصل میشوند و فرمان فعال یا غیر فعال بودن هر کویل را از میکرو دریافت کرده و به موتور میرسانند.

معرفی درایوl298n :

ماژول راه اندازL298 ، جهت راه اندازی موتورهای DC ، با استفاده از میکروکنترلر می توانید سرعت و جهت حرکت موتور را کنترل کنید. این درایور توانایی کنترل همزمان 2 موتور DC را دارد.

از این ماژول می توان جهت راه اندازی دو موتور DCیا یک موتور پله ای Stepper Motorاستفاده کرد.

حداکثر ولتاژ قابل اعمال به موتور: 50 ولت حداکثر جریان مجاز خروجی ها: 2 امپر برای هر کانال دارای دو کانال خروجی برای دو موتور DC

معرفی درایو استفاده شده در پروتئوس:

CURRENT SENSING A : 1 پین

از این پایه جهت کنترل جریان موتور A استفاده می هردد. همچنین می توان این پایه را به صورت مستقیم به خط منفی مدار GND اتصال داد که در این صورت کنترلی بر روی جریان وجود ندارد

OUTPUT 1 : 2 پین

این پایه به یکی از ترمینالهای موتور Aمتصل می هردد

OUTPUT 2 : 3 پین

این پین به ترمینال دیگر موتور A متصل شده

SUPPLY VOLTAGE (VS( : 4 پین

به پایه باید ولتاژ مورد نظر خود جهت اعمال به موتورها را متصل نمایید. این ولتاژ با توجه به موتورهای مورد استفاده شما حداکثر تا 46 ولت می تواند افزایش یابد. برای ساخت رباتهای کوچک به طور معمول بین 6 تا 12 ولت است

TTL Compatible Inputs 1 to drive Motor A INPUT 1 : 5 پین

این پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 7 می توانند جهت هردش موتور را مشخص نمایند

TTL Compatible Enable Input for Motor A ENABLE A : 6 پین

این پایه جهت روشن و خاموش کردن موتور Aو در بیشتر مواقع جهت اعمال فرکانس PWMبه موتور استفاده می هردد. پنج ولت موتور را روشن و صفر موتور را خاموش می کند

TTL Compatible Inputs 2 to drive Motor A INPUT 2 : 7 پین

این پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 5 می توانند جهت هردش موتور را مشخص نمایند

GND : 8 پین

اتصال به خط منفی مدار GND

LOGIC SUPPLY VOLTAGE (VSS( : 9 پین

اتصال به 5 تا 7 ولت

TTL Compatible Inputs 1 to drive Motor B INPUT 3 : 10 پین

این پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 12 می توانند جهت هردش موتور Bرا مشخص نمایند

TTL Compatible Enable Input for Motor B ENABLE B : 11 پین

این پایه جهت روشن و خاموش کردن موتور Bو در بیشتر مواقع جهت اعمل فرکانس PWMبه موتور استفاده می هردد. پنج ولت موتور را روشن و صفر موتور را خاموش می کند

TTL Compatible Inputs 2 to drive Motor B INPUT 4 : 12 پین

این پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 10 می توانند جهت هردش موتور Bرا مشخص نمایند

OUTPUT 3 : 13 پین

این پایه به یکی از ترمینالهای موتور Bمتصل میگردد

پین 14 : OUTPUT 4

این پین به ترمینال دیگر موتور Bمتصل می گردد

CURRENT SENSING B : 15 پین

از این پایه جهت کنترل جریان موتور B استفاده می هردد. همچنین می توان این پایه را به صورت مستقیم به خط منفی مدار GNDاتصال داد که در این صورت کنترلی بر روی جریان وجود ندارد.

تنظیمات کدویرازد:

در محیط کدویزارد PORTB را به LCD اختصاص میدهیم و LCD16*2 را انتخاب میکنیم.

چهار بیت کم ارزش PORTA را خروجی میکنیم و PIN6 وPIN7 از پورت D را ورودی میکنیم و درحالت PULL UP قرار میدهیم.

برنامه نویسی در محیط کدویژن:

#include <mega16a.h>

#include <io.h>

#include <stdlib.h>

#include <delay.h>

#define STEPPER_PORT PORTA

#define SET PIND.6

#define OK PIND.7

// Alphanumeric LCD functions

#include <alcd.h>

// Declare your global variables here const unsigned char StepCodes[]={0b0011, 0b0010, 0b0110 ,0b0100 ,0b1100 ,0b1000 ,0b1001 ,0b0001};

unsigned char Step = 0;

void main(void)

{ int i;

char str[4];

// Input/Output Ports initialization

// Port A initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out

DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0

PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) |

(0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) |

(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) |

(0<<DDC2) | (0<<DDC1) | (0<<DDC0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) |

(0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

// State: Bit7=P Bit6=P Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) |

(0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=0xFF

// OC0 output: Disconnected

TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer1 Stopped

// Mode: Normal top=0xFFFF

// OC1A output: Disconnected

// OC1B output: Disconnected

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);

TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer2 Stopped

// Mode: Normal top=0xFF

// OC2 output: Disconnected

ASSR=0<<AS2;

TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) |

(0<<CS22) | (0<<CS21) | (0<<CS20);

TCNT2=0x00;

OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) |

(0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

MCUCSR=(0<<ISC2);

// USART initialization

// USART disabled

UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) |

(0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization

// Analog Comparator: Off

// The Analog Comparator's positive input is

// connected to the AIN0 pin

// The Analog Comparator's negative input is

// connected to the AIN1 pin

ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) |

(0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

SFIOR=(0<<ACME);

// ADC initialization

// ADC disabled

ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) |

(0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization

// SPI disabled

SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization

// TWI disabled

TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

// Alphanumeric LCD initialization

// Connections are specified in the

// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:

// RS - PORTB Bit 0

// RD - PORTB Bit 1

// EN - PORTB Bit 2

// D4 - PORTB Bit 4

// D5 - PORTB Bit 5

// D6 - PORTB Bit 6

// D7 - PORTB Bit 7

// Characters/line: 16 lcd_init(16);

while (1)

{

lcd_clear(); lcd_putsf("Angle : "); itoa(Step * 45, str); lcd_gotoxy(7, 0); lcd_puts(str); lcd_gotoxy(1, 1); lcd_putsf("system digital");

while(SET && OK); if(!SET)

{

Step = (++Step % 8); delay_ms(50); while(!SET); continue;

}

else if(!OK)

{

delay_ms(50); while(!OK); for(i = 0; i < Step; i++)

{

STEPPER_PORT = StepCodes[i]; delay_ms(100);

}

}

};

}

مهندس یعقوبی تبارavrمیکروکنترلرحسینعلی پوردانشگاه صدرا
شاید از این پست‌ها خوشتان بیاید