עבור לתוכן

הפעלת מנוע לזמן קצוב בשפת c

Featured Replies

פורסם

יש לי שני מנועים שהכנתי בשבילם קוד בשפת c ניסתי להפעיל את שתי המנועים ביחד ואחרי 5 שניות להפסיק את פעולתו של אחד המנועים..

מישהו אולי יודע איזה פקודה יש כדי לשלוט בזמן בזמן פעולה של כל אחד מהמנועים בנפרד??

פורסם

זה תלוי איך אתה שולט בהם....

פורסם

אולי הפקודה delay או sleep תעזור לך.

פורסם

יש מישהו בעבודה שלי שעבד בחברה שהתעסקה בנושא אם אני מבין נכון משתמשים ב 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 בשביל דברים כאילו.

פורסם

אם אתה משתמש בUNIX\LINUX תבדוק את הפונ ALARM. היא זורקת SIGALRM כשהזמן פג.

פורסם

הבעיה עם PWM בלי מעגל יעודי לזה (שיש בלוחות I/O) זה שאתה צריך לדאוג לסיגנל כל הזמן בזמן אמת, דבר שיכול להיות בעייתי על מחשב רגיל עם תוכנה רגילה.

פורסם
  • מחבר

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

פורסם

אתה יכול לבדוק מה השעה (ברזולוציה של מילי שניות) ולראות כמה זמן עבר. או לעשות חוט נוסף שישן וכשהוא מתעורר שיפסיק את האחר.

פורסם

נשמע לי שאתה עובד "ערום" כלומר ללא מערכת הפעלה או עם מערכת הפעלה מינימלית.

אני מציע שתשתמש בפסיקת שעון כלשהי על מנת למדוד זמן וכך לתזמן את רוחב הפולסים. לדוגמא אןם יש פסיקת שעון 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 ) { }
}
}

כמובן, זה בהנחה שאתה לא מנסה לעשות שום דבר על המעבד הזה מלבד להניע את המנוע.

בלי לדעת יותר על החומרה ועל הסביבה שבא אתה עובד, קשה לתת הוראות יותר ספציפיות.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים