אין שום קשר בין הקוד לבין התנהגות הרובוט!!!

הפורום הראשי, אתר הרובוטיקה הישראלי

המנהלים: אסף פוניס, גיא יונה

אין שום קשר בין הקוד לבין התנהגות הרובוט!!!

הודעהעל ידי ארבל » ב' מרץ 19, 2007 8:53 pm

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


 #define F_CPU 20000000UL


#include <avr/io.h>


#include <util/delay.h>





// Initialize timer 0 to do PWM for our motors:
void pwm0_init(void)
{
   // Set Timer Control Register 0 A for PWM on both OC0A and OC0B,
   (mode 3):

   TCCR0A = (2 << COM0A0) | (2 << COM0B0) | (3 << WGM00);

   

   TCCR0B = (4 << CS00);

   // We're in PWM mode, so no need of interrupts:

   TIMSK0 = 0;

   // Enable output on PD5 and PD6 so we get our PWM outputs on the
   // LMB1836M motor driver inputs:

   DDRD |= (1 << PD5);
   DDRD |= (1 << PD6);

   // Enable output on PB1 and PB2 so we can set those bits to get
   // directional control on the other inputs on the LMB1836M:

   DDRB |= (1 << PB1);
   DDRB |= (1 << PB2);

   // Set our waveforms to zero for the time being:  (Zero speed.)

   OCR0A = 0;
   OCR0B = 0;
}

// Motor A uses PB2 and PD6
void pwm0_a(int speed)
{
   if (speed > 0)
   {
      // Forward

      // Turn off PB2
      PORTB &= ~(1 << PB2);
      // Clear compare mode for PWM0A and set to clear on compare
      // match, set at bottom:
      TCCR0A = (TCCR0A & ~(3 << COM0A0)) | (2 << COM0A0);
      // Set our PWM duty cycle
      OCR0A = speed;
   }   
   if (speed == 0)
   {
      // Disconnect PWM from 0C0A:
      TCCR0A &= ~(3 << COM0A0);
      // Set outputs to zero to coast
      PORTD &= ~(1 << PD6);
      PORTB &= ~(1 << PB2);
      // No PWM duty cycle to set
   }
   if (speed < 0)
   {
      // Reverse

      // Turn on PB2
      PORTB |= (1 << PB2);
      // Clear compare mode for PWM0A and set to set on compare
      // match, clear at bottom:
      TCCR0A = (TCCR0A & ~(3 << COM0A0)) | (3 << COM0A0);
      // Set our PWM duty cycle
      OCR0A = -speed;
   }
}

// Motor B uses PB1 and PD5
void pwm0_b(int speed)
{
   if (speed > 0)
   {
      // Forward

      // Turn off PB1
      PORTB &= ~(1 << PB1);
      // Clear compare mode for PWM0B and set to clear on compare
      // match, set at bottom:
      TCCR0A = (TCCR0A & ~(3 << COM0B0)) | (2 << COM0B0);
      // Set our PWM duty cycle
      OCR0B = speed;
   }   
   if (speed == 0)
   {
      // Disconnect PWM from 0C0A:
      TCCR0A &= ~(3 << COM0B0);
      // Set outputs to zero to coast
      PORTD &= ~(1 << PD5);
      PORTB &= ~(1 << PB1);
      // No PWM duty cycle to set
   }
   if (speed < 0)
   {
      // Reverse

      // Turn on PB1
      PORTB |= (1 << PB1);
      // Clear compare mode for PWM0B and set to set on compare
      // match, clear at bottom:
      TCCR0A = (TCCR0A & ~(3 << COM0B0)) | (3 << COM0B0);
      // Set our PWM duty cycle
      OCR0B = -speed;
   }
}

void pwm0_a_brake(void)
{
   // Set motor speed to zero (turns off PWM):
   pwm0_a(0);
   // Enable both PD6 and PB2 to hit the brakes (POWER HUNGRY):
   PORTD &= ~(1 << PD6);
   PORTB &= ~(1 << PB2);
}

void pwm0_b_brake(void)
{
   // Set motor speed to zero (turns off PWM):
   pwm0_b(0);
   // Enable both PD5 and PB1 to hit the brakes (POWER HUNGRY):
   PORTD &= ~(1 << PD5);
   PORTB &= ~(1 << PB1);
}


// That's really it for the motor stuff.  The only other subroutine
// is a delay routine that will let us pause for a couple of seconds.
// Almost all the example code will have this routine in it.

// Delay for N seconds
void delay_sec(unsigned char sec)
{
   unsigned int cycles;

   // Delay 25ms at a time (38.4ms is the most we can delay with a
   // 20MHz processor, unfortunately.  See the delay.h include file
   // for more info.)

   for(cycles = 0; cycles < (sec * 40); cycles ++)
   {
      _delay_ms(25);
   }
}


// And now for our main routine:

int main(void)
{
   // Make sure all our registers are clear
   DDRB = 0;
   DDRC = 0;
   DDRD = 0;

   // Make sure all our pull-up resistors are clear
   PORTB = 0;
   PORTC = 0;
   PORTD = 0;

   // Initialize the timer0 PWM system:

   pwm0_init();
   
   
   
   
   

   // Motors are stopped when we initialize them, so there's
   // no need to do that after the init routine.

   // The endless loop

   for(;;)
   {
      
      pwm0_a(150);
      pwm0_b(150);
      delay_sec(4);
      
      
      
      pwm0_a(150);
      pwm0_b(-150);
      delay_sec(2);
      

}


   // We never get here, but return a zero if we ever do.
   return(0);
}


הרובוט לא עושה מה שהקוד אומר לו לעשות, בערך בשני הסיבובים הראשונים של הלולאה, הכל סבבה, אחר כך, נראה כאילו אין שום חוקיות בהתנהגות שלו ואין שום קשר לקוד. לרובוט לא מחוברים חיישנים בכלל (כרגע). לפני שעבדתי עם הרובוט הזה, חיברתי את הלוח לרובוט עם מנועים גדולים שחיממו את גשר ה-H האם יכול להיות שהגשר נשרף ולכן קשה לו לשלוט במנועים? או שאולי אתם רואים משהו בקוד שאני פיספסתי? או שהתקלה הזו יכולה להיגרם ממשהו אחר לגמרי...
אשמח לשמוע את דעתכם.
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » ג' מרץ 20, 2007 4:31 pm

בלי להכיר את המעבד שלך ולעבוד מול הTechnical Data והReference Manual שלו אני לא יכול להגיד לך הרבה, אבל במקומך: מה שהכי נראה פה מזמין צרות זה מנגנון הOUTPUT COMPARE שלך תנסה לדלג עליו ולהכניס את כל הפונקציות שלו לCOMMENT, ופשוט תדליק אחד לוגי רגיל בפורט שיוצא לבקר מנועים (אלו שOCR0B וOCR0A מתייחסים אליהם) ותכבה את PB1 ו PB2 (זה אמור לתת לך נסיעה קדימה במהירות מלאה כי זה ידמה מצב שהPWM DUTY שווה לPWM PERIOD) תראה אם הוא נוסע ישר כמו שצריך, אחרי זה (במידה וזה יעבוד) פשוט תעשה שוב את לולאת הDELAY שלך עם אחורה/קדימה/איך שבא לך אבל בלי הPWM, בשביל לראות ששינוי הכיוונים עובד בסדר.

אם כל זה יעבוד לך תבדוק את הPWM GENERATOR שלך, לפי איך שאני רואה את זה אתה משתמש בOUTPUT COMPARE בשביל להוציא פולסים של PWM, ואני לא רואה איך אתה קובע את ה PERIOD לעומת הDUTY, אני רואה רק שאתה משנה את הDUTY ולפי איך שזה נראה הPERIOD משתנה ביחד איתו (זה לא טוב, הPERIOD אמור להיות קבוע), יכול להיות שאני טועה אבל ככה זה נראה, בכל-מקרה מה שאני מציע זה שתבדוק פעולה בסיסית יותר של הרובוט לפי מה שכתבתי למעלה ואז תמשיך הלאה משם.

דבר איתי אם אתה צריך עוד עזרה.
דניאל.
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

אז ככה

הודעהעל ידי ארבל » ד' מרץ 21, 2007 11:38 pm

ניסיתי את מה שאמרת לי וזה עבד אחלה! אני מבין שזה אומר שהגשר בסדר והבעיה היא למעשה עם הקוד... למרות שהשתמשתי באותן הפונקציות בדיוק והן עבדו נפלא! אז אני לא מצליח להבין מה נשתנה...:)
המעבד הוא atmega168
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » ה' מרץ 22, 2007 11:47 pm

אז באיזה מצב אתה עכשיו? השליטה בכיוונים עובדת, אבל רק כאשר הגל PWM מלא (משמע אין שליטת מהירות) ? או שהכל עובד לך עכשיו?
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

כרגע

הודעהעל ידי ארבל » ו' מרץ 23, 2007 10:20 am

ניסיתי להפעיל את המנועים בלי PWM,, לשני הכיוונים, זה עבד. אני מתכוון לנקות קצת את הקוד של ה-PWM ולנסות שוב. אני רק רוצה להיות רגוע ולדעת שהלוח שלי לא נהרס (כי כבר הרסתי פורט אחד ולא בא לי להרוס גם את הגשר...)
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » ו' מרץ 23, 2007 5:28 pm

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

דניאל.
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

או קיי

הודעהעל ידי ארבל » ו' מרץ 23, 2007 6:32 pm

אני בטוח שהמנועים נדלקים ונכבים בגלל שגשר ה H מתחמם, הפעלתי את המנועים למשך של כמה דקות, ולאחר 30 שניות בערך הם התחילו לעבוד לסרוגין. נגעתי בגשר והוא היה חם מאוד. הצמדתי אליו להב של סכין חיתוך על מנת שחלק מהחום יעבור ללהב, והמנועם התחילו שוב לפעול בצורה רצופה. לאחר 30 שניות בערך, הלהב של הסכין כבר היה חם מאוד וכנראה כבר לא לקח מספיק חום והמנועים התחילו לעבוד שוב לסירוגין. האם נין להדביק בעזרת דבק 3 שניות איזה שהוא סליל מתכת שיקרר קצת את הגשר או שיש לכם הצעה אחרת?
ארבל
וחג פסח שמח לכולם!!!
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » ו' מרץ 23, 2007 8:31 pm

איך הגשר שלך נראה? בד"כ יש צלעות קירור מיוחדות שאפשר לקנות.
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

הוא

הודעהעל ידי ארבל » ש' מרץ 24, 2007 10:55 am

הוא קטנטן, 1ס"מ על 0.5 ס"מ. חשבתי להצמיד אותו ליחידת קירור של מעבד של מחשב, אני יודע שזה קצת גדולן, אבל זה מה שיש לי כרגע... יש לי שתי התלבטויות מרכזיות:
1. האם זה בטוח להשתמש בדבק 3 שניות? כלומר, האם אין סיכוי שהדבק יהרוס משהו בגשר?
2. האם זה נכון לקרר את הגשר, כי החימום שלו מעיד על כך שהוא מספק יותר מידי זרם ושקשה לו עם זה, ואז, אם אני מקרר אותו, אני מתעלם מהבעיה ומטפל בסימפטום דבר אשר עלול לגרום יותר נזק לטווח הארוך...
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » ש' מרץ 24, 2007 7:34 pm

אין בעיה עם לקרר גשר, סה"כ זה טרזיסטור שמתחמם. דבק שלוש שניות לא נראה לי יהרוס אבל גם לא יעזור, אתה צריך דבק/משחה טרמית בשביל זה (ניתן להשיג בחנויות מחשבים).
חוץ מזה עם הגשר שלך הוא בצורת טרנזיסטור סטנדרתי קיימים גופי קירור מוכנים לזה, בשביל זה שאלתי איך הגשר שלך נראה (אם אתה יכול לשים תמונה זה הכי טוב).
נערך לאחרונה על ידי Daniel-Orion בתאריך א' מרץ 25, 2007 10:42 am, נערך פעם אחת בסך הכל.
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

אני לא מצליח

הודעהעל ידי ארבל » א' מרץ 25, 2007 10:16 am

אני לא מצליח לשים תמונה של הגשר... :oops:
בכל אופן, אתה יודע איפה ניתן להשיג צלעות קירור שכאלה? הגשר נראה כמו שבב קטן מלבני עם רגליים בגוגל של 1X0.5 ס"מ.
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » א' מרץ 25, 2007 10:46 am

עם הH-BRIDGE שלך הוא בצורת ג'וק קיימים HEATSINKS של CHIPSETS של מחשב, הייתי מנסה להדביק אחד כזה עם משחה טרמית. בכל מקרה כדאי לך לנסות חנויות אלקטרוניקה/מחשבים בשביל לחפש HEATSINK מתאים (תלך עם הגשר לחנות).
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

אבל

הודעהעל ידי ארבל » א' מרץ 25, 2007 12:07 pm

המשחה התרמית לא מדביקה!!! הצלעות יזוזו כל הזמן... אני צריך ממש להדביק את זה לגשר... חשבתי על 2 אפשרויות:
1. דבק אפוקסי
2. דבק מגע רגיל (כאן הסכנה היא שהבנזין שבדבק המגע, יפגע בסיליקון שעל הגשר...)
מה דעתך?
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי Daniel-Orion » א' מרץ 25, 2007 2:50 pm

דבק אפוקסי יכול לתפוס אותו (אם יש לך איך להדביק אותו), אבל בשביל שצלע הקירור תהיה אפקטיבית חייב להיות בין הצלע לבין הIC משחה טרמית.
Don't let school interfere with your education
סמל אישי של המשתמש
Daniel-Orion
משתמש ותיק
משתמש ותיק
 
הודעות: 380
הצטרף: א' אוקטובר 20, 2002 12:58 pm
מיקום: רמת גן

אבל

הודעהעל ידי ארבל » א' מרץ 25, 2007 5:20 pm

אז הצלעות יזוזו כל הזמן! אני מבין את החשיבות של המשחה, אבל היא רלוונטית רק כאשר ניתן לחבר את גוף הקירור ללוח עצמו ולא לרכיב... כאן, אני צריך לחבר את הצלע ישר לרכיב כי הלוח קטן מידי...
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הבא

חזור אל פורום הרובוטיקה

מי מחובר

משתמשים הגולשים בפורום זה: Google [Bot], xalmek ו 2 אורחים

cron