שְׁאֵלָה:
מדוע לחלק מהסיכות יש תדר PWM שונה?
Peter Bloomfield
2014-02-14 21:08:10 UTC
view on stackexchange narkive permalink

על פי הפניה ל Arduino עבור analogWrite () , תדר ה- PWM ברוב הפינים הוא ~ 490 הרץ. עם זאת, זהו ~ 980 הרץ עבור סיכות 5 ו -6 ב- Uno, ועבור סיכות 3 ו -11 על לאונרדו.

מדוע אלה שונים? האם זו תכונת עיצוב מכוונת, או שהיא מוכתבת איכשהו על ידי החומרה?

שתיים תשובות:
#1
+24
Ricardo
2014-02-14 22:00:19 UTC
view on stackexchange narkive permalink

אלה אינם התדרים היחידים הזמינים עבור אותות ה- PWM. עם זאת, הם התדרים כפי שנקבעו על ידי מכשיר ההחלפה המיושם (שאותו תוכלו לשנות בקלות כמפורט להלן).

כל אחד משלושת הצמדים של סיכות PWM קשור לטיימר אחד, שלכל אחד מהם יש משלו. תדר בסיס, כדלקמן:

  • סיכות 5 ו -6 משויכות לטיימר 0, עם תדר בסיס של 62500 הרץ
  • סיכות 9 ו -10 משויכות לטיימר 1, עם תדר בסיס של 31250Hz
  • סיכות 3 ו- 11 משויכות לטיימר 2, עם תדר בסיס של 31250Hz

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

  • סיכות 5 ו -6 הן בעלות ערכי prescaler של 1, 8, 64, 256 ו- 1024
  • סיכות 9 ו -10 הן בעלות ערכי prescaler של 1 , 8, 64, 256 ו- 1024
  • סיכות 3 ו -11 הן בעלות ערכי prescaler של 1, 8, 32, 64, 128, 256 ו- 1024

שילובים שונים מניבים תדרים שונים בסיכת PWM נתונה. שים לב שלטיימר 2 (קשור לסיכות 3 ו -11) יש יותר ערכי prescaler זמינים, וכתוצאה מכך יותר תדרים זמינים.

עכשיו, מדוע טיימר 2 שונה, זו שאלה נפרדת.

עריכה: הנה רשימה של תדרי PWM אפשריים לכל סיכה (מתוך מאמר זה):

לסיכות 6 ו -5 (OC0A ו- OC0B):

  • אם TCCR0B = xxxxx001, התדר הוא 64kHz
  • אם TCCR0B = xxxxx010, התדר הוא 8 kHz
  • אם TCCR0B = xxxxx011, התדר הוא 1kHz (זו ברירת המחדל ממגף האתחול של Diecimila)
  • אם TCCR0B = xxxxx100, התדר הוא 250Hz
  • אם TCCR0B = xxxxx101, התדר הוא 62.5 הרץ

עבור סיכות 9 , 10, 11 ו -3 (OC1A, OC1B, OC2A, OC2B):

  • אם TCCRnB = xxxxx001, התדר הוא 32kHz
  • אם TCCRnB = xxxxx010, התדר הוא 4 kHz
  • אם TCCRnB = xxxxx011, התדר הוא 500 הרץ (זוהי ברירת המחדל ממאתחל הדיאצ'ימילה)
  • אם TCCRnB = xxxxx100, התדר הוא 125Hz
  • אם TCCRnB = xxxxx101, התדר הוא 31.25 הרץ

TCCRnB זה המקום בו אתה מגדיר את סיביות prescaler לטיימר n , ולהחליף את n ב- 0, 1 או 2, תלוי בטיימר שברצונך להגדיר. אם אתה עדיין לא בטוח לגבי פעולות סיביות, קרא את הדרכת המתמטיקה הסיבית.

המקורות שלי:

שים לב כי נראה שיש הבדלים במקורות אלה בשאלה האם לסיכות 9 ו -10 יש אותה התנהגות של 5 ו- 6 או 3 ו- 11, אך בכל זאת אתה מקבל את הרעיון. אני קורא את מאגר הנתונים כדי לנסות להבין מה נכון, או שמדובר בהבדל בין לוחות.

לאיזו ATmega מתייחסת תשובה זו? לא בדקתי, אבל אני מהמר שזה שונה מעט מכל בקר.
@jippie נקודה טובה! המקורות מתייחסים ל- ATmega168 ו- 328.
@jippie רק כדי להבהיר, בתשובה שלי, מספרי הסיכות מתייחסים לאופן שבו הם מוקצים על לוח ה- Uno (סיכה 1 פירושה סיכה דיגיטלית 1, או D1, למשל), ולא IC (ATmega328 סיכה 1 מאופסת).
אני מאמין שפרטים אלה משתנים גם עם לוחות, Uno, Duemilanove, Mega, ...
@jippie בהחלט, כן.
תשובה זו פשוט שגויה. הטיימרים משתמשים באותה הגדרת prescaler. ההבדל היחיד הוא טיימר 1 ו- 2 מוגדרים ל- PWM לתיקון פאזה, ואילו טיימר 0 מוגדר ל- PWM מהיר, ומכפיל את התדר.
#2
+8
jippie
2014-02-14 21:57:57 UTC
view on stackexchange narkive permalink

אני לא מודע לשיקולי העיצוב, אך אם תבדוק את גליון הנתונים עבור המיקרו-בקר בארדואינו שלך, תבחין כי סיכות PWM מקובצות יחד ולכל קבוצה המחוברות לטיימר. המהירות בה מגדילים את הטיימר משתנה בהתאם למחוון הגירוי המוגדר. אם אתה מחליף את prescaler עבור טיימר מסוים, אתה משנה את תדר PWM עבור סיכות PWM הקשורות. אני מאמין שחלק מהטיימרים כפולים למטרות אחרות כמו הפונקציה millis (); . אם תשנה את מחוון ההחלפה לאותו טיימר, הערכים שהוחזרו על ידי מיליס () יושבתו באותו גורם.

באפשרותך לחשב את ההגדרה עבור prescaler באופן הבא: p>

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ כ 128 $$

prescaler = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = כ- 128.

בדוק את גיליון נתונים ותגלה כי 128 הוא אכן אחד מערכי prescaler שאתה יכול לבחור.

ילד, האם אנחנו מתגעגעים למתי'קס או מה? אני מקווה שנפעיל אותו לאחר הבטא.
@Ricardo יש לי כפתור MathJax בדפדפן שלי; o) http://meta.arduino.stackexchange.com/questions/13/is-there-an-easy-way-to-enter-formulas-in-questions/51# 51


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...