התיאוריה שמאחורי בקר FOC
מדריך מעשי · קושחת בקרת מנועים · ~13 דקות קריאה
לבקרת שדה מכוונת (FOC) יש מוניטין של חומר לתארים מתקדמים — ובפועל, כל האלגוריתם הוא בערך ארבעים שורות קוד שבנויות על רעיון אחד. מימשנו אותו על הכול: מכרטיס של 16 מ״מ ועד דרייבר תעשייתי של 100V/30A. זה המאמר שהיינו רוצים לקרוא בפעם הראשונה: הרעיון, המתמטיקה שבאמת צריך, הגברים שמחושבים אנליטית (בלי ניסוי וטעייה), פסיקת ISR מוערת — והתקלות של היישור והכיול שמעכבות כל הפעלה ראשונה.
קומוטציית שישה צעדים (טרפזואידלית) מניעה מנוע BLDC כמו מתג אור: מזרימים זרם לשני ליפופים, מחכים שהרוטור יחצה גבול של חיישן Hall, מחליפים. זה עובד — וזו בדיוק הסיבה שדרייברים זולים מגרגרים במהירות נמוכה, מרטיטים תחת עומס ומבזבזים מתח. FOC מניע את המנוע כמו המכונה הסינכרונית שהוא באמת: מחזיקים את וקטור הזרם בסטטור בדיוק 90° לפני השטף המגנטי של הרוטור, כל הזמן, בצורה חלקה. תגובת מומנט משופרת, מומנט יציב כמעט באפס מהירות, עבודה בארבעה רבעים — התכונות שמופיעות בדפי המפרט של הבקרים שלנו נובעות כולן מהמשמעת האחת הזאת.
1 · הרעיון האחד: המומנט יושב על ציר q
מנקודת המבט של הרוטור, רק רכיב הזרם שניצב לשטף המגנטי שלו מייצר מומנט. למנוע עם מגנטים על פני הרוטור (SPM):
קראו את זה פעמיים, כי זה כל המשחק: המומנט פרופורציוני ל-i_q. הזרם שמקביל לשטף (i_d) לא מייצר מומנט — במנוע SPM פשוט מווסתים אותו לאפס. כך ש"לשלוט במנוע" מצטמצם ל"לשלוט בשני זרמי DC": מחזיקים i_d = 0, ומפקדים על i_q לפי המומנט הרצוי. כל שאר ה-FOC הוא העבודה החישובית שגורמת לשני הזרמים האלה להיות DC.
2 · נכנסים למערכת הצירים של הרוטור: קלארק ופארק
העבודה החישובית הזאת היא שתי טרנספורמציות קואורדינטות. טרנספורמציית קלארק מקפלת את שלושת זרמי הפאזה (מרוחקים 120°; מודדים רק שניים — הסכום שלהם אפס) למערכת דו-צירית נייחת שקולה:
טרנספורמציית פארק מסובבת את המערכת הזאת בזווית החשמלית של הרוטור θₑ, כך שהצירים מסתובבים יחד איתו:
וזה כל הרווח: במערכת dq, הזרמים הסינוסואידליים שהייתם רואים בסקופ הופכים לערכים קבועים. וערכים קבועים הם בדיוק מה שבקרי PI טובים בו. זו כל הסיבה שהטרנספורמציות האלה קיימות.
3 · שתי לולאות PI — עם הגברים שמחשבים, לא מנחשים
במערכת dq, כל ציר של המנוע נראה (בקירוב ראשון) כמו מעגל פשוט של נגד וסליל:
קוטב אחד, ידוע מדף הנתונים. שמים עליו את האפס של ה-PI (ביטול קוטב-אפס), בוחרים רוחב פס ללולאת הזרם ω_c — וההגברים מתקבלים ישירות מהנוסחה:
זה החלק שמתחילים לא מאמינים לו: את לולאות הזרם לא מכווננים ביד. מודדים או קוראים את R ו-L, בוחרים ω_c (בחירה נפוצה: עשירית מתדר המיתוג, ברדיאנים לשנייה — למשל רוחב פס של ~1kHz ב-PWM של 20kHz, ω_c ≈ 6300), מחשבים את K_p ו-K_i — וזהו. אם הלולאה משתוללת אחרי זה, הבעיה היא במדידה, ביישור או ב-Deadtime — לא בהגברים. במהירויות גבוהות מוסיפים את ההיזון-קדים הסטנדרטי שמנתק את הצימוד בין הצירים:
(כל מה שכתבנו על Anti-Windup ועל רוויה במדריך השטח ל-PID תקף כאן אחד-לאחד — עם טוויסט אחד: הגבול הוא מעגל, |v| ≤ v_max, אז חוסמים את הווקטור, וציר q אחרון.)
4 · ובחזרה החוצה: פארק הפוך ו-SVPWM
את שתי היציאות של ה-PI (v_d, v_q) מסובבים בחזרה למערכת הנייחת (פארק הפוך — משוואה 3 עם זווית בסימן הפוך), והופכים לשלושה מחזורי עבודה של PWM. משתמשים ב-Space-Vector PWM ולא ב-PWM סינוסואידלי רגיל: בכך שרוכבים על גבול המתח המשושה של הממיר במקום על המעגל החסום בו, SVPWM מוציא בערך 15% יותר מתח שמיש מאותו מתח DC — מהירות מרבית בחינם.
5 · ה-ISR — כל האלגוריתם, עם הערות
כל מה שלמעלה רץ פעם אחת בכל מחזור PWM — בדרך כלל 10–40kHz — בתוך פסיקה אחת:
// FOC core — runs in the ADC end-of-conversion interrupt, every PWM cycle
void foc_isr(void) {
// 1) Currents: sampled mid-PWM (low-side window), offsets removed
float ia = adc_a() - offs_a, ib = adc_b() - offs_b;
// 2) Electrical angle: encoder counts → mech angle → × pole pairs + offset
float theta = wrap(enc_angle() * POLE_PAIRS + theta_offset);
float s = sinf(theta), c = cosf(theta);
// 3) Clarke + Park: three sinusoids in, two DC values out
float i_alpha = ia, i_beta = (ia + 2.0f*ib) * INV_SQRT3;
float id = i_alpha*c + i_beta*s;
float iq = -i_alpha*s + i_beta*c;
// 4) Two PI loops (analytic gains, anti-windup inside)
float vd = pi_step(&pi_d, id_ref - id); // id_ref = 0 for SPM
float vq = pi_step(&pi_q, iq_ref - iq); // iq_ref = torque command
// 5) Respect the voltage circle: |v| <= v_max — clamp as a vector
vlimit_circle(&vd, &vq, vbus * SQRT3_INV);
// 6) Inverse Park + SVPWM → three compare registers
float v_alpha = vd*c - vq*s, v_beta = vd*s + vq*c;
svpwm_write(v_alpha, v_beta, vbus);
}
הערות שחשובות: את הטריגונומטריה לוקחים מטבלת Lookup או מיחידת CORDIC ברכיבים הגדולים; הלולאה חייבת לרוץ בקצב קבוע (ההגברים מניחים את זה); ו-iq_ref הוא הנקודה שבה העולם החיצון מתחבר — לולאת מהירות, לולאת מיקום, או פקודת מומנט ישירה מסקריפט. בדיוק כך הבקרים שלנו חושפים אותו.
6 · התקלות שמעכבות כל הפעלה ראשונה
ארבעים השורות למעלה הן החלק הקל. אלה הבעיות של השטח:
| תסמין | כמעט תמיד | תיקון |
|---|---|---|
| המנוע קופץ לזווית ואז בורח בהדלקה | אופסט הזווית החשמלית שגוי | נועלים את הרוטור: מפעילים מתח על ציר d בלבד, קוראים את האנקודר, שומרים כ-theta_offset |
| רץ מצוין בכיוון אחד, לא יציב בשני | אי-התאמה בין סדר הפאזות לכיוון האנקודר | מחליפים שתי פאזות של המנוע, או הופכים את סימן הזווית |
| גליות מומנט במהירות נמוכה למרות FOC | אופסט / הגבר לא תואמים בין מדידות הזרם | מכיילים את אופסטי ה-ADC בזרם אפס, בכל אתחול |
| עיוות ורעש אקוסטי סביב מעבר האפס | Deadtime של הממיר | פיצוי Deadtime לפי סימן הזרם |
| הלולאה לא יציבה למרות שההגברים 'נכונים' | R או L לא מדויקים (דף נתונים מול מציאות, טמפרטורה), או נקודת דגימה שגויה | מודדים R/L במעגל; דוגמים זרמים באמצע חלון ה-Low-Side |
| עובד על השולחן, נופל במהירות גבוהה | רוויית מתח בלי ניתוק צימוד | משוואה 6 + הגבלת מתח וקטורית |
הראשונה שווה מילה, כי כולם נופלים בה: FOC צריך את הזווית החשמלית של הרוטור, והאנקודר נותן זווית מכנית עם אפס שרירותי. מהלך היישור הסטנדרטי פשוט להפליא — מפקדים מתח קבוע על ציר d בלבד; הרוטור ננעל עליו כמו מחט מצפן; מה שהאנקודר מראה באותו רגע הוא האופסט שלכם. שומרים, וגמרנו.
7 · איפה זה יושב בתמונה הגדולה
לולאות הזרם שבניתם כאן הן הטבעת הפנימית ביותר של כל מערכת תנועה שאנחנו בונים. סביבן יושבת לולאת מהירות PI (שמכווננים בשיטות ממדריך השטח ל-PID), וסביבה לולאת מיקום — וכשהרבה צירים כאלה צריכים לפעול כמכונה אחת, אתם כבר בטריטוריה של המאמר שלנו על תנועה מדויקת של רובוטים. אותה משמעת בכל קנה מידה: להכיר את המערכת, לקבוע את ההגברים בכוונה, ולכבד את הגבולות במפורש.
מכרטיס של 16 מ״מ ועד 100V / 30A
מימשנו את כל המחסנית הזאת — FOC, לולאות זרם אנליטיות, SVPWM, ותנועה מבוססת-סקריפטים מעל — על בקר ה-BLDC המשולב הקטן בעולם, על דרייברים בסטנדרט רפואי ועל בקרים תעשייתיים בהספק גבוה עם WiFi. אם המוצר שלכם צריך מנוע שמתנהג — בואו נדבר.
מבוסס על: Texas Instruments, "Field Orientated Control of 3-Phase AC-Motors" (BPRA073); Microchip AN1078, "Sensorless Field Oriented Control of a PMSM"; פרויקט הקוד הפתוח SimpleFOC והתיעוד שלו; ותיעוד ST Motor Control SDK. הסימון לפי מוסכמת שימור-האמפליטודה.