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

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

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

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

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

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

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

τ=32pλpmiq\tau = \frac{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. (הערת שלמות: במכונות בעלות בולטות מגנטית — IPM — מצטרף למשוואה 1 איבר רילוקטנטי, ‎(3/2)·p·(L_d − L_q)·i_d·i_q‎, שהופך גם את i_d לשימושי; המאמר הזה מניח מנוע מגנטים שטחיים, שבו האיבר מתאפס.)

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

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

iα=iaiβ=ia+2ib3\begin{aligned} i_\alpha &= i_a \\[4pt] i_\beta &= \frac{i_a + 2\,i_b}{\sqrt{3}} \end{aligned}
משוואה 2 — טרנספורמציית קלארק (צורה שומרת-אמפליטודה; בהנחת מכונה מאוזנת, i_a + i_b + i_c = 0)

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

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 ומסינון המדידה — וכולם שוחקים את שולי הפאזה ככל ש-ω_c עולה; בדיוק בגלל זה קיים כלל העשירית, ומי שדוחף את רוחב הפס מאבד את הערבות של הנוסחה. שנית, אם הלולאה משתוללת גם ב-ω_c צנוע, הבעיה כמעט תמיד במדידה, ביישור הזווית או בנקודת דגימת הזרם — לא בהיעדר כוונון ידני. במהירויות גבוהות מוסיפים למוצא של בקרי ה-PI את איברי ההיזון-קדים הסטנדרטיים שמנתקים את הצימוד בין הצירים (כתובים עם L_d ו-L_q, כך שהם תקפים גם למכונות בעלות בולטות מגנטית):

vdff=ωeLqiq,vqff=ωe(Ldid+λpm)v_d^{ff} = -\,\omega_e L_q\, i_q, \qquad v_q^{ff} = \omega_e\,(L_d\, i_d + \lambda_{pm})
משוואה 6 — ניתוק צימוד dq + היזון-קדים של הכא״מ החוזר, שמתווספים למוצא בקרי ה-PI. במכונת מגנטים שטחיים (SPM)‏: L_d ≈ L_q = L

(כל מה שכתבנו על 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 הוא הנקודה שבה העולם החיצון מתחבר — לולאת מהירות, לולאת מיקום, או פקודת מומנט ישירה מסקריפט. בדיוק כך הבקרים שלנו חושפים אותו. ועוד מלכודת מוסכמות אחת: ה-vbus * SQRT3_INV שבחסימת המתח (כלומר ‎v_bus/√3‎) נכון לסקיילינג שומר-האמפליטודה שבו השתמשנו לאורך המאמר — בנרמול אחר הקבוע משתנה, אז בדקו כל קבוע מול המוסכמה שבחרתם.

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
משרד
תל אביב, ישראל