Motorfish: הסטפר לא מפספס אף שלב (ה-Firmware) – Open Electronics

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp
Share on email
פרסומת
MAGNEZIX מגנזיקס


נתאר את הקושחה של בקר המשוב של מנוע צעד ונבדוק אותה במדפסת התלת-ממד.
(קרא את הפוסט הראשון)

בגבולות של בקרת מנוע צעד לא רטרואקטיבית היא שבאפליקציות להנעה של מכונות, מכונות כרסום CNC או מדפסות תלת מימד, המיקום יכול להיות מושפע משגיאה שגורמת לכך שלא תמיד ניתן לחזור על כך להגיע למצבים הרצויים; זה קורה כי לפעמים מנוע הצעד, למרות שהוא מקבל פקודה, יכול לאבד את הגובה שלו.

במקרה של הדפסה תלת מימדית, בהדפסות שנמשכות שעות או עשרות שעות, היצירה עשויה להציג את עצמה עם כמה פרוסות שאינן מיושרות ולכן פגומות. הפתרון לבעיה הוא להפוך את המנוע שמניע אותו עם בקר המסוגל לוודא שכל פקד קובע את המיקום הרצוי ולהתערב, במידת הצורך, לתקן את אובדן הפיצול.

זה מה שקורה ב-MotorFish, שנועד לקרוא את אות המשוב שמסופק על ידי מקודד מגנטי של אפקט Hall המותקן על גל המנוע.

לאחר שתאר, בפרק הראשון, את החומרה ואת היתרונות של הבקר הזה, הגיע הזמן לעבור לתכנות הלוח, שמתחיל בהכנסת מאתחול האתחול; הסיבה לכך היא ש-MotorFish, כפי שהשם מרמז, מבוסס על ארכיטקטורת Fishino ולכן מתוכנת כמו לוח Arduino.

התקנת אתחול וטעינת קושחה

אם עקבת אחר הכתבות על לוח Fishino32, Fishino Piranha או Fishino Shark, אתה כבר בדרך! הפעולה, למעשה, זהה, הן מבחינת טעינת האתחול והן מבחינת סקיצות. למען הקיצור, כאן נעשה סיכום ונצביע על ההבדלים בין הגיליונות; לכל השאר, אנו מפנים אותך למאמרים המקבילים.

אז, פתח את ה-IDE והתחל בהוספת חבילת 'Fishino' ל-IDE דרך הגדרות תַפרִיט; לאחר מכן, כל הכרטיסיות מסדרת Fishino יופיעו ברשימת הכרטיסיות, כולל MotorFish. כמובן שזה יקרה אם תוסיף את החבילה העדכנית ביותר או לפחות תעדכן אותה לחודש שעבר.

אם התקנת את הלוח בעצמך, אתה צריך לטעון את טוען האתחול; הוא ממוקם בתיקייה בתוך arduino15 תיקיה של ה-IDE (חפש, המיקום משתנה בהתאם למערכת ההפעלה!). השם של טוען האתחול הוא MotorFish.hex.

עקוב אחר ההוראות שכבר השתמשו ב-32-bit Fishino לטעינה; עדיין תצטרך לקבל א PicKit3 או להכין מתכנת PIC בעבודת יד, כפי שהוסבר במאמרים לעיל.

לאחר טעינת האתחול, כדי לטעון את הסקיצות שלך, פשוט לחץ על כפתור האיפוס והשאר אותו לחוץ במשך כמה שניות עד שנורית על הלוח מתחילה להבהב.

בשלב זה, אתה יכול להמשיך כרגיל עבור כל לוחות Arduino.

הקושחה

עבור הנהג שלנו, הכנו ספרייה ספציפית בשם MotorFish, מסוגל לנהל את כל האלמנטים בלוח.

הספרייה מכילה שני מודולים נפרדים, הנקראים סטפר ו קוֹדַאִי, וכן קובץ המכיל טבלאות של סינוסים וקוסינוסים להפקת זרמים בפיתולי המנוע; טבלאות אלו נוצרו כדי לבצע מיקרו-סטפינג ב-64 שלבים בכל שלב.

נתחיל עם דוגמה שאינה משתמשת בספרייה, ה MotorFishFullStepTest, להכיר את החומרה; בדוגמה זו, אנו מבצעים "ידנית" את דריכת המנוע, במצב של צעד מלא, תוך הנעה ישירה של הנהג.

כדי להבין את פעולתו, חיוני להתייחס לסעיף המוקדש, בפרק הראשון, לנהג DRV8843; בדוגמה זו, המקודד אינו בשימוש.

הסקיצה שאתה מוצא בו רישום 1 מזין את שתי הפיתולים לחלופין דרך כניסות xIN1 ו-xIN2, תחילה בכיוון אחד ולאחר מכן בכיוון השני, בהתאם לתכנית ב איור 1: זה מה שנקרא "כונן גל", בפועל לא נעשה בו שימוש מכיוון שהוא מספק מומנט קטן יותר מהפעלה בו-זמנית של שני פיתולים, כמו בתכנית ב איור 2, שקוראים לו "כונן צעד מלא".

רישום 1

#define DEBUG_LEVEL_INFO
#include <FishinoDebug.h>
#include <FishinoFlash.h>
//////////////////////////////////////////////////////////////////
// Controller Connections -> Drivers //
//////////////////////////////////////////////////////////////////
// First winding
const int AVREF = 17; // PWM voltage reference
const int AIN1 = 18; // control input 1
const int AIN2 = 19; // control input 2
const int AI0 = 20; // current fractionation input 1
const int AI1 = 21; // current fractionation input 2
// Second winding
const int BVREF = 22; // PWM voltage reference
const int BIN1 = 23; // control input 1
const int BIN2 = 24; // control input 2
const int BI0 = 25; // current fractionation input 1
const int BI1 = 26; // current fractionation input 2
// Control I/O
const int NRESET = 27; // reset input (active low)
const int NSLEEP = 28; // sleep input (low active)
const int NFAULT = 29; // error output (active low)
const int DECAY = 30; // DECAY mode selection input (3 states)
const double RSense = 0.20; // resistance value for current measurement (ohm)
void setup()
{
// initializes the serial and waits for its opening
Serial.begin(115200);
while(!Serial)
 ;
// sets PWM frequency and resolution
analogWriteFrequency(200000);
analogWriteResolution(16);
// calculates the pwm value based on the maximum current expected in the winding
// 5.0 is a driver constant, 3.3V is the maximum output voltage from the PWM
double c = 1.0; // maximum expected current
double ARef = 5.0 * RSense * c / 3.3; // voltage value to apply on ARef
uint16_t _pwmWindingCurrent = (uint16_t)(ARef * 65535);
// sets the reference voltage for the required current
pinMode(AVREF, OUTPUT);
pinMode(BVREF, OUTPUT);
analogWrite(AVREF, _pwmWindingCurrent);
analogWrite(BVREF, _pwmWindingCurrent);
// sets the current fractionation to 100% for both windings
pinMode(AI0, OUTPUT);
digitalWrite(AI0, 0);
pinMode(AI1, OUTPUT);
digitalWrite(AI1, 0);
pinMode(BI0, OUTPUT);
digitalWrite(BI0, 0);
pinMode(BI1, OUTPUT);
digitalWrite(BI1, 0);
// de-energises both windings
pinMode(AIN1, OUTPUT);
digitalWrite(AIN1, 0);
pinMode(AIN2, OUTPUT);
digitalWrite(AIN2, 0);
pinMode(BIN1, OUTPUT);
digitalWrite(BIN1, 0);
pinMode(BIN2, OUTPUT);
digitalWrite(BIN2, 0);
// disables the SLEEP mode
pinMode(NSLEEP, OUTPUT);
digitalWrite(NSLEEP, HIGH);
// releases the driver reset, enabling it
pinMode(NRESET, OUTPUT);
digitalWrite(NRESET, HIGH);
// sets the error I/O to input, so that it can detect
// possible errors in the driver
pinMode(NFAULT, INPUT_PULLUP);
}
// 10 milliseconds between each motor phase
// to vary the speed you need to modify this number
const int del = 10;
void loop()
{
// cycles between the 4 phases of the windings
Serial << “Fase 1n”;
digitalWrite(AIN1, 1);
digitalWrite(AIN2, 0);
digitalWrite(BIN1, 0);
digitalWrite(BIN2, 0);
delay(del);
Serial << “Fase 2n”;
digitalWrite(AIN1, 0);
digitalWrite(AIN2, 0);
digitalWrite(BIN1, 1);
digitalWrite(BIN2, 0);
delay(del);
Serial << “Fase 3n”;
digitalWrite(AIN1, 0);
digitalWrite(AIN2, 1);
digitalWrite(BIN1, 0);
digitalWrite(BIN2, 0);
delay(del);
Serial << “Fase 4n”;
digitalWrite(AIN1, 0);
digitalWrite(AIN2, 0);
digitalWrite(BIN1, 0);
digitalWrite(BIN2, 1);
delay(del);
}

איור 1

איור 2

במקרה האחרון, שתי פיתולים תמיד מופעלים, בעוד המנוע ממוקם בנקודת האמצע בין שני הקטבים, ובכך מספק מומנט גבוה יותר. אנו משאירים לכם את הניסוי של מצב זה, שאינו נושא המאמר, מכיוון שאנו מעוניינים במיקרו-סטפינג, כדי להשיג זאת, במקום זאת, לא מספיק להפעיל את הפיתולים ברצף. ובכל זאת, יש צורך לגוון את הזרם בהם, וזה מה שהספרייה המסופקת עושה כאשר באמצעות PWM עם תדר גבוה למדי ורזולוציית 16 סיביות, הזרם משתנה באופן רציף על ידי פעולה על כניסות ה-AREF וה-BREF. הזרם חייב להשתנות בצורה סינוסואידית, כאשר הסינוסואידים מחוץ לפאזה של 90 מעלות בין פיתול אחד לשני, כמו ב איור 3; בסכימה זו, הסינוסואידים נותרו רציפים בכוונה, ללא דיסקרטיות; מספר ה"מיקרו-צעדים" תלוי באיזו דקיקה מחולקים הסינוסואידים, אשר, בעבודה דיגיטלית, יהיו מדורגים בכפייה. אם הזרם משתנה ברציפות, מושגת פעולתו של מנוע ללא מברשות עם microstepping אינסופי.

איור 3

הספרייה המסופקת משתמשת בטבלה המכילה 64 ערכים עבור הסינוס והקוסינוס, שהוחזרו למספר שלם של 16 סיביות, בעוד שהמערכת "מברשת" את רצף הערכים הזה ויוצרת מחדש את שתי צורות הגל; כדי להתקדם במיקרו-צעד אחד מספיק לנוע בטבלה ולקחת את ערכי הזרם המתאימים. ב רישום 2, אנו מדווחים על אחת הטבלאות כדוגמה.

רישום 2

const uint16_t cosineTable[] = {
65535, 65515, 65456, 65357, 65219, 65042, 64825, 64570, 64275, 63942, 63570, 63161, 62713, 62227, 61704, 61143,
60546, 59912, 59242, 58537, 57796, 57021, 56211, 55367, 54490, 53580, 52638, 51664, 50659, 49623, 48558, 47463,
46340, 45189, 44010, 42805, 41574, 40319, 39039, 37735, 36409, 35061, 33691, 32302, 30892, 29465, 28019, 26557,
25079, 23585, 22078, 20557, 19023, 17479, 15923, 14358, 12785, 11203, 9615, 8022, 6423, 4821, 3215, 1608,
 0, 1608, 3215, 4821, 6423, 8022, 9615, 11203, 12785, 14358, 15923, 17479, 19023, 20557, 22078, 23585,
25079, 26557, 28019, 29465, 30892, 32302, 33691, 35061, 36409, 37735, 39039, 40319, 41574, 42805, 44010, 45189,
46340, 47463, 48558, 49623, 50659, 51664, 52638, 53580, 54490, 55367, 56211, 57021, 57796, 58537, 59242, 59912,
60546, 61143, 61704, 62227, 62713, 63161, 63570, 63942, 64275, 64570, 64825, 65042, 65219, 65357, 65456, 65515,
65535, 65515, 65456, 65357, 65219, 65042, 64825, 64570, 64275, 63942, 63570, 63161, 62713, 62227, 61704, 61143,
60546, 59912, 59242, 58537, 57796, 57021, 56211, 55367, 54490, 53580, 52638, 51664, 50659, 49623, 48558, 47463,
46340, 45189, 44010, 42805, 41574, 40319, 39039, 37735, 36409, 35061, 33691, 32302, 30892, 29465, 28019,...



קישור לכתבת המקור – 2021-11-11 16:42:09

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on telegram
Telegram
Share on whatsapp
WhatsApp
Share on email
Email
פרסומת
תכנון תשתיות רפואיות

עוד מתחומי האתר