פורסם 2007 במרץ 718 שנים יש לי שני מנועים שהכנתי בשבילם קוד בשפת c ניסתי להפעיל את שתי המנועים ביחד ואחרי 5 שניות להפסיק את פעולתו של אחד המנועים..מישהו אולי יודע איזה פקודה יש כדי לשלוט בזמן בזמן פעולה של כל אחד מהמנועים בנפרד??
פורסם 2007 במרץ 818 שנים יש מישהו בעבודה שלי שעבד בחברה שהתעסקה בנושא אם אני מבין נכון משתמשים ב PWM כדי להפעיל אותם . אתה צריך לשלוח פולסים ברוחב מסוים כל כמה זמן יש מעגל אנלוגי שהופך את הרוחב לרמה. אתה צריך לדעת קודם כל מה רוחב הפולסים שאתה הולך לשלוח ואז תוכל לדעת באיזה סוג של Delay אתה יכול להשתמש. כל מנוע צריך מעגל כזה משלו . המעגל הזה נותן לך לשלוט על התעוצה של המנוע וכך לקבוע את מהירות הסיבוב שלו.אם אתה על ארכיטקטורת PowerPc יש לו שעון מאוד מדויק של 64 ביט שנקרא time base והרזולוציה שלו היא רבע משעון הbus (למרות שלא מצאתי את זה בספר) והגישה אליו היא שעון 1 של מעבד (לפחות פי 4 יותר מהר מהזמן ספירה שלו). עוד אופציה זה להסתנכרן על השעון שה sleep משתמש בו אם יש לו רזולוציה גבוהה יותר 1 מילי.הפתרון האחרון בלי שעון זה לעשות חשבון או סתם למדוד ולהשתמש ב delay loop שנראה ככהint a;a=COUNT_VAL;while(a--);אתה רוצה להשתמש ב post order -- כדי שהלופ לא יצא או לעשות את ה -- בתוך הלופ ולרוץ כל עוד a לא שווה 0הזמן השהיה שנוצר תלוי בארכיטקטורה ובפקודות ASM שנוצרות .החיסרון פה הוא שהמעבד תקוע לך שם. בגלל זה רצוי להשתמש בtimer חומרתי שנותן לך interrupt בשביל דברים כאילו.
פורסם 2007 במרץ 818 שנים הבעיה עם PWM בלי מעגל יעודי לזה (שיש בלוחות I/O) זה שאתה צריך לדאוג לסיגנל כל הזמן בזמן אמת, דבר שיכול להיות בעייתי על מחשב רגיל עם תוכנה רגילה.
פורסם 2007 במרץ 818 שנים מחבר העניין הוא שיש לי כבר את הפקודות להפעיל את המנועים אבל אני רוצה למשל שהמנוע יסתובב לזמן מסויים ואם אני משתמש בפקודה של Sleep אז זה לא עושה כלום ...אין אפשרות לגרום לתוכנית שתבצע את הפקודה של הפעלת המנוע רק לזמן מסויים שאני יחליט עליו כל פעם מחדש?
פורסם 2007 במרץ 818 שנים אתה יכול לבדוק מה השעה (ברזולוציה של מילי שניות) ולראות כמה זמן עבר. או לעשות חוט נוסף שישן וכשהוא מתעורר שיפסיק את האחר.
פורסם 2007 במרץ 918 שנים נשמע לי שאתה עובד "ערום" כלומר ללא מערכת הפעלה או עם מערכת הפעלה מינימלית.אני מציע שתשתמש בפסיקת שעון כלשהי על מנת למדוד זמן וכך לתזמן את רוחב הפולסים. לדוגמא אןם יש פסיקת שעון 1000 פעמים בשניה, ואתה רוצה פולס של 50 מילישניות פעם אחת כל שניה, אתה יכול לעשות משהו בסגנון:volatile int ticks = 0;void timer_interrupt_handler(){ ticks++;}void main_loop(){ int pre; while(1) { start_pulse(); pre = ticks; while( (ticks - pre) < 50 ) { } stop_pulse(); pre = ticks; while( (ticks - pre) < 950 ) { } }}כמובן, זה בהנחה שאתה לא מנסה לעשות שום דבר על המעבד הזה מלבד להניע את המנוע.בלי לדעת יותר על החומרה ועל הסביבה שבא אתה עובד, קשה לתת הוראות יותר ספציפיות.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.