התיאוריה שמאחורי בקר 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
משרד ·
תל אביב, ישראל