התיאוריה שמאחורי בקר FOC

בקר BLDC FOC משולב על כרטיס 16 מ״מ

מדריך מעשי · קושחת בקרת מנועים · ‎~13 דקות קריאה

לבקרת שדה מכוונת (FOC) יש מוניטין של חומר לתארים מתקדמים — ובפועל, כל האלגוריתם הוא בערך ארבעים שורות קוד שבנויות על רעיון אחד. מימשנו אותו על הכול: מכרטיס של 16 מ״מ ועד דרייבר תעשייתי של ‎100V/30A. זה המאמר שהיינו רוצים לקרוא בפעם הראשונה: הרעיון, המתמטיקה שבאמת צריך, הגברים שמחושבים אנליטית (בלי ניסוי וטעייה), פסיקת ISR מוערת — והתקלות של היישור והכיול שמעכבות כל הפעלה ראשונה.

קומוטציית שישה צעדים (טרפזואידלית) מניעה מנוע BLDC כמו מתג אור: מזרימים זרם לשני ליפופים, מחכים שהרוטור יחצה גבול של חיישן Hall, מחליפים. זה עובד — וזו בדיוק הסיבה שדרייברים זולים מגרגרים במהירות נמוכה, מרטיטים תחת עומס ומבזבזים מתח. ‏FOC מניע את המנוע כמו המכונה הסינכרונית שהוא באמת: מחזיקים את וקטור הזרם בסטטור בדיוק 90° לפני השטף המגנטי של הרוטור, כל הזמן, בצורה חלקה. תגובת מומנט משופרת, מומנט יציב כמעט באפס מהירות, עבודה בארבעה רבעים — התכונות שמופיעות בדפי המפרט של הבקרים שלנו נובעות כולן מהמשמעת האחת הזאת.

1 · הרעיון האחד: המומנט יושב על ציר q

מנקודת המבט של הרוטור, רק רכיב הזרם שניצב לשטף המגנטי שלו מייצר מומנט. למנוע עם מגנטים על פני הרוטור (SPM):

τ=32pλpmiq\tau = \tfrac{3}{2}\,p\,\lambda_{pm}\,i_q
משוואה 1 — מומנט במכונת SPM: זוגות קטבים p, שטף המגנטים λ_pm, זרם ציר q

קראו את זה פעמיים, כי זה כל המשחק: המומנט פרופורציוני ל-i_q. הזרם שמקביל לשטף (i_d) לא מייצר מומנט — במנוע SPM פשוט מווסתים אותו לאפס. כך ש"לשלוט במנוע" מצטמצם ל"לשלוט בשני זרמי DC": מחזיקים i_d = 0, ומפקדים על i_q לפי המומנט הרצוי. כל שאר ה-FOC הוא העבודה החישובית שגורמת לשני הזרמים האלה להיות DC.

2 · נכנסים למערכת הצירים של הרוטור: קלארק ופארק

העבודה החישובית הזאת היא שתי טרנספורמציות קואורדינטות. טרנספורמציית קלארק מקפלת את שלושת זרמי הפאזה (מרוחקים 120°; מודדים רק שניים — הסכום שלהם אפס) למערכת דו-צירית נייחת שקולה:

iα=ia,iβ=ia+2ib3i_\alpha = i_a, \qquad i_\beta = \frac{i_a + 2\,i_b}{\sqrt{3}}
משוואה 2 — טרנספורמציית קלארק (צורה מאוזנת, שומרת-אמפליטודה)

טרנספורמציית פארק מסובבת את המערכת הזאת בזווית החשמלית של הרוטור θₑ, כך שהצירים מסתובבים יחד איתו:

id=iαcosθe+iβsinθe,iq=iαsinθe+iβcosθei_d = i_\alpha\cos\theta_e + i_\beta\sin\theta_e, \qquad i_q = -\,i_\alpha\sin\theta_e + i_\beta\cos\theta_e
משוואה 3 — טרנספורמציית פארק: אל מערכת dq המסתובבת
איור 1. שלוש מערכות הייחוס. קלארק ממפה את שלושת הליפופים (abc) למערכת דו-צירית נייחת (αβ); פארק מסובב אותה בזווית החשמלית θe אל המערכת של הרוטור עצמו (dq). במערכת dq, זרמי הפאזה הסינוסואידליים הופכים לשני ערכי DC — שבקרי PI רגילים יודעים לווסת.
איור 1. שלוש מערכות הייחוס. קלארק ממפה את שלושת הליפופים (abc) למערכת דו-צירית נייחת (αβ); פארק מסובב אותה בזווית החשמלית θe אל המערכת של הרוטור עצמו (dq). במערכת dq, זרמי הפאזה הסינוסואידליים הופכים לשני ערכי DC — שבקרי PI רגילים יודעים לווסת.

וזה כל הרווח: במערכת dq, הזרמים הסינוסואידליים שהייתם רואים בסקופ הופכים לערכים קבועים. וערכים קבועים הם בדיוק מה שבקרי PI טובים בו. זו כל הסיבה שהטרנספורמציות האלה קיימות.

3 · שתי לולאות PI — עם הגברים שמחשבים, לא מנחשים

במערכת dq, כל ציר של המנוע נראה (בקירוב ראשון) כמו מעגל פשוט של נגד וסליל:

G(s)=i(s)v(s)=1Ls+RG(s) = \frac{i(s)}{v(s)} = \frac{1}{L s + R}
משוואה 4 — המערכת החשמלית שכל לולאת זרם רואה

קוטב אחד, ידוע מדף הנתונים. שמים עליו את האפס של ה-PI (ביטול קוטב-אפס), בוחרים רוחב פס ללולאת הזרם ω_c — וההגברים מתקבלים ישירות מהנוסחה:

Kp=ωcL,Ki=ωcRK_p = \omega_c\,L, \qquad K_i = \omega_c\,R
משוואה 5 — הגברי לולאת זרם אנליטיים מתוך R ו-L של המנוע; ω_c הוא רוחב הפס שבחרתם, ברדיאנים לשנייה

זה החלק שמתחילים לא מאמינים לו: את לולאות הזרם לא מכווננים ביד. מודדים או קוראים את R ו-L, בוחרים ω_c (בחירה נפוצה: עשירית מתדר המיתוג, ברדיאנים לשנייה — למשל רוחב פס של ‎~1kHz‎ ב-PWM של 20kHz, ‏ω_c ≈ 6300), מחשבים את K_p ו-K_i — וזהו. אם הלולאה משתוללת אחרי זה, הבעיה היא במדידה, ביישור או ב-Deadtime — לא בהגברים. במהירויות גבוהות מוסיפים את ההיזון-קדים הסטנדרטי שמנתק את הצימוד בין הצירים:

vd=ωeLiq,vq+=ωe(Lid+λpm)v_d \mathrel{-}= \omega_e L\, i_q, \qquad v_q \mathrel{+}= \omega_e\,(L\, i_d + \lambda_{pm})
משוואה 6 — ניתוק צימוד dq + היזון-קדים של הכא״מ החוזר

(כל מה שכתבנו על Anti-Windup ועל רוויה במדריך השטח ל-PID תקף כאן אחד-לאחד — עם טוויסט אחד: הגבול הוא מעגל, ‎|v| ≤ v_max‎, אז חוסמים את הווקטור, וציר q אחרון.)

4 · ובחזרה החוצה: פארק הפוך ו-SVPWM

את שתי היציאות של ה-PI‏ (v_d,‏ v_q) מסובבים בחזרה למערכת הנייחת (פארק הפוך — משוואה 3 עם זווית בסימן הפוך), והופכים לשלושה מחזורי עבודה של PWM. משתמשים ב-Space-Vector PWM ולא ב-PWM סינוסואידלי רגיל: בכך שרוכבים על גבול המתח המשושה של הממיר במקום על המעגל החסום בו, ‏SVPWM מוציא בערך 15% יותר מתח שמיש מאותו מתח DC — מהירות מרבית בחינם.

איור 2. הלולאה השלמה, בכל מחזור PWM: מודדים שני זרמי פאזה → קלארק → פארק (עם θe מהאנקודר) → שני בקרי PI → פארק הפוך → SVPWM → ממיר. מעל זה רצה לולאת מהירות בקצב איטי יותר, שמפקדת על iq. כל הדיאגרמה הזאת היא פסיקה אחת.
איור 2. הלולאה השלמה, בכל מחזור PWM: מודדים שני זרמי פאזה → קלארק → פארק (עם θe מהאנקודר) → שני בקרי PI → פארק הפוך → SVPWM → ממיר. מעל זה רצה לולאת מהירות בקצב איטי יותר, שמפקדת על iq. כל הדיאגרמה הזאת היא פסיקה אחת.

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. הסימון לפי מוסכמת שימור-האמפליטודה.

שיתוף
05 — צור קשר

צריך פרטים נוספים?

אימייל
rotem@segevtech.com
טלפון
+972-52-6444408
משרד
תל אביב, ישראל