درایور دو موتور پله ای با میکروکنترلر PIC
سخت افزار و نرم افزار به کار رفته در کنترل دو موتور پله ای را که برای روبوت های با درایور دیفرانسیلی , مناسب می باشند را شرح می دهد.
بازدید :
زمان تقریبی مطالعه :
تاریخ : يکشنبه 1397/03/06 ساعت 14:37
مرکز یادگیری تبیان - محبوبه همت
مقدمه:
این مقاله سخت افزار و نرم افزار به کار رفته در کنترل دو موتور پله ای را که برای روبوت های با درایور دیفرانسیلی، مناسب می باشند را شرح می دهد. این مدار دو کلمه دو بیتی را می پذیرد تا به هر یک از موتورها فرامین حرکت به جلو، عقب، تثبیت موقعیت و سکون را دهد. همچنین هرگاه یک پله(گام) شکل گرفت (طی شد)، یک سیگنال خروجی ایجاد می کند.این مدار طرحی مناسب می باشد که با آن می توان تحریک سیم پیچ، سرعت موتور، شکل "کلمه کنترل " وسایر پارامترهای موتورهای تک قطبی و دو قطبی مبتنی بر میکروکنترلر را اصلاح کرد. نرم افزار آن نیز، به زبان های C و Assembly تهیه شده است.
مدار سخت افزار
مدار مذکور شامل سه آی سی است:
PIC16F84 وهمچنین دو درایور پل H،L293D برای موتورهای پله ای دوقطبی(شکل پایین) یا دو ULN2803 برای موتور پله ای های تک قطبی. سوای منابع تغذیه، قطعات مدار تنها به: نوسانساز 4MHz، یک مقاومت بالاکش 10 کیلو اهم و چند کانکتور محدود می شود. در این طرح یک بسته 6 تایی از باتری های 1.2 ولتی،که اختلاف پتانسیل 7.2 ولت تولید می کنند به طور خطی تنظیم(رگوله) می شوند تا تغذیه منطقی 5 ولتی را تامین نمایند. افت ولتاژ ترانزیستورهای دوقطبی درایور، به ولتاژ 7.2 ولت اجازه نمی دهد موتور را بیش از توان آن درایو کند.
" کلمه کنترل" به دو کلمه کنترل 2 بیتی شکسته شده است:
دوبیت با ارزش تر که بیتهای 2و3 از PORTA هستند، موتور سمت چپ را کنترل نموده و دو بیت کم ارزش تر یعنی بیت های 0،1 از PORTA موتور سمت راست را کنترل می کنند. برای این مقادیر: 00،01،10،11، کلمه کنترل به موتورها به ترتیب فرامین:جلو،عقب، تثبیت موقعیت و سکون را می دهد. این ترتیب را می توان به سادگی عوض کرد(نرم افزار پایین را ببینید)
بنا به مدار طراحی شده, امکان کنترل سرعت موتور فراهم شده است.بخصوص این که به پالس های کنترلی متناوب برای پیشبرد موتورها نیازی نیست. به علاوه هنگامی که یک گام(پله) طی شد، مداریک سیگنال خروجی در بیت 4 از PORTA تولید می کند.کنترل کننده اصلی می تواند این سیگنال را بازبینی کند تا هنگامی که کلمه کنترل بایستی تغییر کند را مشخص کند.
به عنوان مثال برای اینکه فاصله معینی به جلو حرکت نماید، پردازنده اصلی، تعداد گام های لازم برای دستیابی به این هدف را محاسبه نموده و به این ترتیب فرمان رو به جلو را به موتور صادر می کند. وقتی که تعداد گام های لازم طی شد، کلمه کنترل می تواند به وضعیت ایست تغییر کند یا مجددا حرکت نماید. در اکثر پردازنده ها عمل شمردن گام ها(پله ها) را می توان به یک فعالیت در پس زمینه موکول کرد تا این امر در هر زمان وبدون دخالت کاربر صورت گیرد.
نرم افزار
دو نسخه از نرم افزار موجود است.این یکی در C2C که نسخه ای خاص از زبان C است و دیگری در زبان اسمبلی که با کمک چند ماکرو ساختارهای برنامه نویسی سطح بالا ایجاد می کند.
برنامه اصلی به سادگی و به تناوب،PORTA را جهت یافتن تغییر در کلمه کنترل می خواند. این فرایند هر از چند گاهی هنگامی که موتور به یک تحریک جدید نیاز داشته باشد توسط وقفه TMR0 متوقف می شود.چون تحریک موتور دوره ای است، کنترل موتور در پس زمینه اجرا می شود.
نرم افزار موجود به ما اجازه تغییرات ساده ای در تحریک سیم پیچی موتور، کلمه کنترل و سرعت موتور را می دهد. بدین ترتیب می توان به سادگی جدول تحریک را از لحاظ اندازه و محتوی برای نیم پله اصلاح کرد.کلمات کنترل تنها یک شمارش(از صفر تا چهار) هستند.بنابراین می توانیم ترتیب آنها را انتخاب کرده و در صورت لزوم، عوض نمود.با تغییر مقدار اولیه TMR0 می توان سرعت را در مبنای دو تغییر داد. تغییرات بهتر با ایجاد تغییر در مقدار اولیه TMR0 به دست می آیند.
این خطوط شبه کد نرم افزار هستند:
Constants
EXCITATION_TABLE_SIZE = 4 // number of excitations in sequence
TMR0_CNT_UP = 100 // 256 - duration (motor speed)
// Motor states
RIGHT_FORWARD = 0 // These can be re-ordered
RIGHT_BACKWARD = 1
RIGHT_HOLD = 2
RIGHT_IDLE = 3
LEFT_FORWARD = 0 // Above states shifted 2 bits left (multiplied by 4)
LEFT_BACKWARD = 4
LEFT_HOLD = 8
LEFT_IDLE = 12
GlobalVariables
leftExcitationCntr // current left motor excitation number
rightExcitationCntr // current right motor excitation number
motorState // 4 bit function word for both motors
excitations[] = {11000000b, // Excitation table - if the table is changed in size,
01100000b, // then the EXCITATION_TABLE_SIZE constant
00110000b, // must be changed
10010000b}
Functions
motorISR // Motor Interrupt Service Routine
// Modifies global variables leftExcitationCntr and rightExcitationCntr as a function of motorState.
// It uses these counters as indices to read the motor excitation from the table and outputs it to PORTB.
LocalVariables leftExcitation, rightExcitation
if (motorState is RIGHT_FORWARD)
if (rightExcitationCntr = EXCITATION_TABLE_SIZE-1)
rightExcitationCntr = 0
else
increment rightExcitationCntr
rightExcitation = excitations[rightExcitationCntr]
else if (motorState is RIGHT_BACKWARD)
if (rightExcitationCntr = 0)
rightExcitationCntr = EXCITATION_TABLE_SIZE-1
else
decrement rightExcitationCntr
rightExcitation = excitations[rightExcitationCntr]
else if (motorState is RIGHT_HOLD)
rightExcitation = excitations[rightExcitationCntr]
else // RIGHT_IDLE
rightExcitation = 0
shift rightExcitation 4 bits right
if (motorState is LEFT_FORWARD)
if (leftExcitationCntr = EXCITATION_TABLE_SIZE-1)
leftExcitationCntr = 0
else
increment leftExcitationCntr
leftExcitation = excitations[leftExcitationCntr]
else if (motorState is LEFT_BACKWARD)
if (leftExcitationCntr = 0)
leftExcitationCntr = EXCITATION_TABLE_SIZE-1
else
decrement leftExcitationCntr
leftExcitation = excitations[leftExcitationCntr]
else if (motorState is LEFT_HOLD)
leftExcitation = excitations[leftExcitationCntr]
else
leftExcitation = 0
PORTB = leftExcitation + rightExcitation
end motorISR
interrupt // Main interrupt service routine gets control when TMR0 overflows
if (TMR0 overflowed causing an interrupt)
bit 4 of PORTA = 1 // signal motor step on
call motorISR // call motor interrupt service routine
bit 4 of PORTA = 0 // signal motor step off
TMR0 = TMR0_CNT_UP; // reset TMR0 to proper count
end interrupt
main
set TMR0 prescaler = 64 // divides clock by value set
bit 4 of PORTA = 0 // signal motor step off
leftExcitationCntr = 0
rightExcitationCntr = 0
TMR0 = TMR0_CNT_UP;
enable TMR0 interrupts
while (1) // continuously update motorState (and wait
motorState = PORTA // for a TMR0 interrupt)
end main
جمع بندی:
یک درایور معمولی موتور پله ای (هر چند ناقص) که مبتنی بر میکروکنترلر بود، طراحی شده و با موفقیت ساخته شد.از آنجا که تنها 124 تا از 1024 کلمه حافظه PIC16F84 استفاده شد(در زبان اسمبلی)، می توان خواصی نظیر افزایش سرعت و کاهش سرعت را نیز به آن اضافه نمود.همه 13 خط ورودی/خروجی در طرح حاضر استفاده شدند، بنابراین سیگنال های کنترلی خارجی اضافه بر این, به یک ارتقا در میکروکنترلرPIC شما نیازمندند.با PIC16F876 که دارای امکاناتی همچون "مدولاسیون پهنای پالس " و تبدیل آنالوگ به دیجیتال است، ممکن است بتوانید درایو برشگر طراحی نمایید.
مطالب مرتبط:
اختلاف پتانسیل الکتریکی
اختلاف پتانسیل (نورون ها)
مدار متوالی و مدار موازی
منبع: roboeq
مقدمه:
این مقاله سخت افزار و نرم افزار به کار رفته در کنترل دو موتور پله ای را که برای روبوت های با درایور دیفرانسیلی، مناسب می باشند را شرح می دهد. این مدار دو کلمه دو بیتی را می پذیرد تا به هر یک از موتورها فرامین حرکت به جلو، عقب، تثبیت موقعیت و سکون را دهد. همچنین هرگاه یک پله(گام) شکل گرفت (طی شد)، یک سیگنال خروجی ایجاد می کند.این مدار طرحی مناسب می باشد که با آن می توان تحریک سیم پیچ، سرعت موتور، شکل "کلمه کنترل " وسایر پارامترهای موتورهای تک قطبی و دو قطبی مبتنی بر میکروکنترلر را اصلاح کرد. نرم افزار آن نیز، به زبان های C و Assembly تهیه شده است.
مدار سخت افزار
مدار مذکور شامل سه آی سی است:
PIC16F84 وهمچنین دو درایور پل H،L293D برای موتورهای پله ای دوقطبی(شکل پایین) یا دو ULN2803 برای موتور پله ای های تک قطبی. سوای منابع تغذیه، قطعات مدار تنها به: نوسانساز 4MHz، یک مقاومت بالاکش 10 کیلو اهم و چند کانکتور محدود می شود. در این طرح یک بسته 6 تایی از باتری های 1.2 ولتی،که اختلاف پتانسیل 7.2 ولت تولید می کنند به طور خطی تنظیم(رگوله) می شوند تا تغذیه منطقی 5 ولتی را تامین نمایند. افت ولتاژ ترانزیستورهای دوقطبی درایور، به ولتاژ 7.2 ولت اجازه نمی دهد موتور را بیش از توان آن درایو کند.
" کلمه کنترل" به دو کلمه کنترل 2 بیتی شکسته شده است:
دوبیت با ارزش تر که بیتهای 2و3 از PORTA هستند، موتور سمت چپ را کنترل نموده و دو بیت کم ارزش تر یعنی بیت های 0،1 از PORTA موتور سمت راست را کنترل می کنند. برای این مقادیر: 00،01،10،11، کلمه کنترل به موتورها به ترتیب فرامین:جلو،عقب، تثبیت موقعیت و سکون را می دهد. این ترتیب را می توان به سادگی عوض کرد(نرم افزار پایین را ببینید)
بنا به مدار طراحی شده, امکان کنترل سرعت موتور فراهم شده است.بخصوص این که به پالس های کنترلی متناوب برای پیشبرد موتورها نیازی نیست. به علاوه هنگامی که یک گام(پله) طی شد، مداریک سیگنال خروجی در بیت 4 از PORTA تولید می کند.کنترل کننده اصلی می تواند این سیگنال را بازبینی کند تا هنگامی که کلمه کنترل بایستی تغییر کند را مشخص کند.
به عنوان مثال برای اینکه فاصله معینی به جلو حرکت نماید، پردازنده اصلی، تعداد گام های لازم برای دستیابی به این هدف را محاسبه نموده و به این ترتیب فرمان رو به جلو را به موتور صادر می کند. وقتی که تعداد گام های لازم طی شد، کلمه کنترل می تواند به وضعیت ایست تغییر کند یا مجددا حرکت نماید. در اکثر پردازنده ها عمل شمردن گام ها(پله ها) را می توان به یک فعالیت در پس زمینه موکول کرد تا این امر در هر زمان وبدون دخالت کاربر صورت گیرد.
نرم افزار
دو نسخه از نرم افزار موجود است.این یکی در C2C که نسخه ای خاص از زبان C است و دیگری در زبان اسمبلی که با کمک چند ماکرو ساختارهای برنامه نویسی سطح بالا ایجاد می کند.
برنامه اصلی به سادگی و به تناوب،PORTA را جهت یافتن تغییر در کلمه کنترل می خواند. این فرایند هر از چند گاهی هنگامی که موتور به یک تحریک جدید نیاز داشته باشد توسط وقفه TMR0 متوقف می شود.چون تحریک موتور دوره ای است، کنترل موتور در پس زمینه اجرا می شود.
نرم افزار موجود به ما اجازه تغییرات ساده ای در تحریک سیم پیچی موتور، کلمه کنترل و سرعت موتور را می دهد. بدین ترتیب می توان به سادگی جدول تحریک را از لحاظ اندازه و محتوی برای نیم پله اصلاح کرد.کلمات کنترل تنها یک شمارش(از صفر تا چهار) هستند.بنابراین می توانیم ترتیب آنها را انتخاب کرده و در صورت لزوم، عوض نمود.با تغییر مقدار اولیه TMR0 می توان سرعت را در مبنای دو تغییر داد. تغییرات بهتر با ایجاد تغییر در مقدار اولیه TMR0 به دست می آیند.
این خطوط شبه کد نرم افزار هستند:
Constants
EXCITATION_TABLE_SIZE = 4 // number of excitations in sequence
TMR0_CNT_UP = 100 // 256 - duration (motor speed)
// Motor states
RIGHT_FORWARD = 0 // These can be re-ordered
RIGHT_BACKWARD = 1
RIGHT_HOLD = 2
RIGHT_IDLE = 3
LEFT_FORWARD = 0 // Above states shifted 2 bits left (multiplied by 4)
LEFT_BACKWARD = 4
LEFT_HOLD = 8
LEFT_IDLE = 12
GlobalVariables
leftExcitationCntr // current left motor excitation number
rightExcitationCntr // current right motor excitation number
motorState // 4 bit function word for both motors
excitations[] = {11000000b, // Excitation table - if the table is changed in size,
01100000b, // then the EXCITATION_TABLE_SIZE constant
00110000b, // must be changed
10010000b}
Functions
motorISR // Motor Interrupt Service Routine
// Modifies global variables leftExcitationCntr and rightExcitationCntr as a function of motorState.
// It uses these counters as indices to read the motor excitation from the table and outputs it to PORTB.
LocalVariables leftExcitation, rightExcitation
if (motorState is RIGHT_FORWARD)
if (rightExcitationCntr = EXCITATION_TABLE_SIZE-1)
rightExcitationCntr = 0
else
increment rightExcitationCntr
rightExcitation = excitations[rightExcitationCntr]
else if (motorState is RIGHT_BACKWARD)
if (rightExcitationCntr = 0)
rightExcitationCntr = EXCITATION_TABLE_SIZE-1
else
decrement rightExcitationCntr
rightExcitation = excitations[rightExcitationCntr]
else if (motorState is RIGHT_HOLD)
rightExcitation = excitations[rightExcitationCntr]
else // RIGHT_IDLE
rightExcitation = 0
shift rightExcitation 4 bits right
if (motorState is LEFT_FORWARD)
if (leftExcitationCntr = EXCITATION_TABLE_SIZE-1)
leftExcitationCntr = 0
else
increment leftExcitationCntr
leftExcitation = excitations[leftExcitationCntr]
else if (motorState is LEFT_BACKWARD)
if (leftExcitationCntr = 0)
leftExcitationCntr = EXCITATION_TABLE_SIZE-1
else
decrement leftExcitationCntr
leftExcitation = excitations[leftExcitationCntr]
else if (motorState is LEFT_HOLD)
leftExcitation = excitations[leftExcitationCntr]
else
leftExcitation = 0
PORTB = leftExcitation + rightExcitation
end motorISR
interrupt // Main interrupt service routine gets control when TMR0 overflows
if (TMR0 overflowed causing an interrupt)
bit 4 of PORTA = 1 // signal motor step on
call motorISR // call motor interrupt service routine
bit 4 of PORTA = 0 // signal motor step off
TMR0 = TMR0_CNT_UP; // reset TMR0 to proper count
end interrupt
main
set TMR0 prescaler = 64 // divides clock by value set
bit 4 of PORTA = 0 // signal motor step off
leftExcitationCntr = 0
rightExcitationCntr = 0
TMR0 = TMR0_CNT_UP;
enable TMR0 interrupts
while (1) // continuously update motorState (and wait
motorState = PORTA // for a TMR0 interrupt)
end main
جمع بندی:
یک درایور معمولی موتور پله ای (هر چند ناقص) که مبتنی بر میکروکنترلر بود، طراحی شده و با موفقیت ساخته شد.از آنجا که تنها 124 تا از 1024 کلمه حافظه PIC16F84 استفاده شد(در زبان اسمبلی)، می توان خواصی نظیر افزایش سرعت و کاهش سرعت را نیز به آن اضافه نمود.همه 13 خط ورودی/خروجی در طرح حاضر استفاده شدند، بنابراین سیگنال های کنترلی خارجی اضافه بر این, به یک ارتقا در میکروکنترلرPIC شما نیازمندند.با PIC16F876 که دارای امکاناتی همچون "مدولاسیون پهنای پالس " و تبدیل آنالوگ به دیجیتال است، ممکن است بتوانید درایو برشگر طراحی نمایید.
مطالب مرتبط:
اختلاف پتانسیل الکتریکی
اختلاف پتانسیل (نورون ها)
مدار متوالی و مدار موازی
منبع: roboeq