This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
Defines | |
#define | __attribute__(x) |
Functions | |
char | __attribute__ ((unused)) dcmotor_h[]="$Id |
int | dcmotorInit (DC_MOTOR_STRUCT *dcmotor) |
int | dcmotorResetState (DC_MOTOR_STRUCT *dcmotor) |
int | dcmotorSetCycleTime (DC_MOTOR_STRUCT *dcmotor, double seconds) |
double | dcmotorGetCycleTime (DC_MOTOR_STRUCT *dcmotor) |
int | dcmotorSetParameters (DC_MOTOR_STRUCT *dcmotor, DC_MOTOR_STRUCT params) |
DC_MOTOR_STRUCT | dcmotorGetParameters (DC_MOTOR_STRUCT *dcmotor) |
int | dcmotorSetOffset (DC_MOTOR_STRUCT *dcmotor, double _offset) |
double | dcmotorGetOffset (DC_MOTOR_STRUCT *dcmotor) |
int | dcmotorSetRevsPerUnit (DC_MOTOR_STRUCT *dcmotor, double _revsPerUnit) |
double | dcmotorGetRevsPerUnit (DC_MOTOR_STRUCT *dcmotor) |
double | dcmotorGetOutput (DC_MOTOR_STRUCT *dcmotor) |
double | dcmotorRunCycle (volatile DC_MOTOR_STRUCT *dcmotor, volatile double ea) |
int | dcmotorIniLoad (DC_MOTOR_STRUCT *dcmotor, const char *filename, const char *section) |
Variables | |
DC_MOTOR_STRUCT |
|
|
|
Definition at line 42 of file dcmotor.h. 00042 : dcmotor.h,v 1.2 2000/10/27 20:34:42 terrylr Exp $"; 00043 00044 typedef struct 00045 { 00046 /* parameters */ 00047 double Ra; /* armature resistance, ohms */ 00048 double La; /* armature inductance, henries */ 00049 double Kb; /* back emf constant, V/rad/s, N-m/amp */ 00050 double Jm; /* motor rotor inertia, N-m-s^2 */ 00051 double Bm; /* viscous friction coefficient, N-m/rad/sec */ 00052 00053 /* state vars */ 00054 double ia; /* armature current */ 00055 double dia; /* derivative of above */ 00056 double wm; /* angular velocity of motor */ 00057 double dwm; /* derivative of above */ 00058 double thm; /* angular position of motor */ 00059 double dthm; /* derivative of above */ 00060 double lastTime; /* timestamp of last cycle */ 00061 00062 /* internal vars */ 00063 int configured; 00064 double cycleTime; /* copy of arg to setCycleTime() */ 00065 double offset; 00066 double revsPerUnit; 00067 00068 } DC_MOTOR_STRUCT; |
|
Definition at line 132 of file dcmotor2.c. |
|
Definition at line 307 of file dcmotor2.c. |
|
Definition at line 343 of file dcmotor2.c. |
|
Definition at line 261 of file dcmotor2.c. 00262 { 00263 DC_MOTOR_STRUCT retval; 00264 00265 if (0 == dcmotor) 00266 { 00267 /* parameters */ 00268 retval.Ra=0; /* armature resistance, ohms */ 00269 retval.La=0; /* armature inductance, henries */ 00270 retval.Kb=0; /* back emf constant, V/rad/s, N-m/amp */ 00271 retval.Jm=0; /* motor rotor inertia, N-m-s^2 */ 00272 retval.Bm=0; /* viscous friction coefficient, N-m/rad/sec */ 00273 00274 /* state vars */ 00275 retval.ia=0; /* armature current */ 00276 retval.dia=0; /* derivative of above */ 00277 retval.wm=0; /* angular velocity of motor */ 00278 retval.dwm=0; /* derivative of above */ 00279 retval.thm=0; /* angular position of motor */ 00280 retval.dthm=0; /* derivative of above */ 00281 retval.lastTime=0; /* timestamp of last cycle */ 00282 00283 /* internal vars */ 00284 retval.configured=0; 00285 retval.cycleTime=0; /* copy of arg to setCycleTime() */ 00286 retval.offset=0; 00287 retval.revsPerUnit=0; 00288 return retval; 00289 } 00290 00291 return *dcmotor; 00292 } |
|
Definition at line 332 of file dcmotor2.c. |
|
The angular velocity(w) is controlled by the equation. (14) w = A*e^(sa_real*t)*cos(sa_img*t)+ B*e^(sa_real*t)*sin(sa_img*t)+ea/c sa_real, sa_img and c were calculated in dcmotorSetParameters() (e is ofcourse 2.7182818 ... ) A and B still need to be calculated from the initial conditions. At time t = 0, e^(sa_real)*t = 1, cos(sa_img*t)=1, sin(sa_img*t)=0, and w = wo, so (15) wo = A*(1)*(1) + B*(1)*(0) + ea/c The derivative of both sides of (14) (16) w' = A*sa_real*e^(sa_real*t)*cos(sa_real*t)+ -A*sa_img*e^(sa_real*t)*sin(sa_real*t)+ B*sa_real*e^(sa_real*t)*sin(sa_real*t)+ A*sa_img*e^(sa_real*t)*cos(sa_real*t) At time t = 0, e^(sa_real)*t = 1, cos(sa_img*t)=1, sin(sa_img*t)=0, and w' = dwo, so (17) dwo = A*sa_real*(1)*(1) + -A*sa_real*(1)*(0) + B*sa_real*(1)*(0) + B*sa_img*(1)*(1) Once A and B are calculated from (15) and (17) it is straight forward to calculate the current values of w and w' by substiting t=cycleTime in to equations (14) and (16). e^(sa_real*cycleTime)*cos(sa_img*cycleTime) and e^(sa_real*cycleTime)*sin(sa_img*cycleTime) were previously calculated in dcmotorSetParameters and stored in sa_time_factor and sb_time_factor. To get the change in position or delta_thm, integrate (14) from 0 to time t=cycleTime. Definition at line 494 of file dcmotor2.c. 00495 { 00496 #ifndef NO_STDIO_SUPPORT 00497 00498 DC_MOTOR_STRUCT dcm; 00499 double cycleTime; 00500 double offset; 00501 double revsPerUnit; 00502 int retval = 0; 00503 const char *inistring; 00504 enum {TORQUE_UNITS_INVALID = 0, 00505 N_M, 00506 OZ_IN, 00507 LB_FT 00508 } torque_units; 00509 00510 #ifndef UNDER_CE 00511 FILE *fp; 00512 00513 if (NULL == (fp = fopen(filename, "r"))) 00514 { 00515 rcs_print_error( "can't open ini file %s\n", filename); 00516 return -1; 00517 } 00518 #else 00519 INET_FILE *fp; 00520 00521 if (NULL == (fp = inet_file_open(filename, "r"))) 00522 { 00523 rcs_print_error( "can't open ini file %s\n", filename); 00524 return -1; 00525 } 00526 #endif 00527 00528 /* look up torque units */ 00529 if (NULL != (inistring = iniFind(fp, "TORQUE_UNITS", section))) 00530 { 00531 /* found the entry in the ini file */ 00532 if (!strcmp(inistring, "N_M")) 00533 { 00534 torque_units = N_M; 00535 } 00536 else if (!strcmp(inistring, "LB_FT")) 00537 { 00538 torque_units = LB_FT; 00539 } 00540 else if (!strcmp(inistring, "OZ_IN")) 00541 { 00542 torque_units = OZ_IN; 00543 } 00544 else 00545 { 00546 torque_units = TORQUE_UNITS_INVALID; 00547 rcs_print_error( "bad torque units specified in ini file: %s\n", 00548 inistring); 00549 retval = -1; 00550 } 00551 } 00552 else 00553 { 00554 /* not in ini file-- use default */ 00555 torque_units = N_M; 00556 } 00557 00558 if (NULL != (inistring = iniFind(fp, "ARMATURE_RESISTANCE", section))) 00559 { 00560 #ifndef UNDER_CE 00561 if (1 != sscanf((char *) inistring, "%lf", &dcm.Ra)) 00562 { 00563 /* found, but invalid */ 00564 rcs_print_error( "invalid ARMATURE_RESISTANCE: %s\n", inistring); 00565 retval = -1; 00566 } 00567 #else 00568 dcm.Ra = RCS_CE_ATOF(inistring); 00569 #endif 00570 } 00571 if (NULL != (inistring = iniFind(fp, "ARMATURE_INDUCTANCE", section))) 00572 { 00573 #ifndef UNDER_CE 00574 if (1 != sscanf((char *) inistring, "%lf", &dcm.La)) 00575 { 00576 /* found, but invalid */ 00577 rcs_print_error( "invalid ARMATURE_INDUCTANCE: %s\n", inistring); 00578 retval = -1; 00579 } 00580 #else 00581 dcm.La = RCS_CE_ATOF(inistring); 00582 #endif 00583 } 00584 if (NULL != (inistring = iniFind(fp, "BACK_EMF_CONSTANT", section))) 00585 { 00586 #ifndef UNDER_CE 00587 if (1 != sscanf((char *) inistring, "%lf", &dcm.Kb)) 00588 { 00589 /* found, but invalid */ 00590 rcs_print_error( "invalid BACK_EMF_CONSTANT: %s\n", inistring); 00591 retval = -1; 00592 } 00593 #else 00594 dcm.Kb = RCS_CE_ATOF(inistring); 00595 #endif 00596 } 00597 if (NULL != (inistring = iniFind(fp, "ROTOR_INERTIA", section))) 00598 { 00599 #ifndef UNDER_CE 00600 if (1 != sscanf((char *) inistring, "%lf", &dcm.Jm)) 00601 { 00602 /* found, but invalid */ 00603 rcs_print_error( "invalid ROTOR_INERTIA: %s\n", inistring); 00604 retval = -1; 00605 } 00606 #else 00607 dcm.Jm = RCS_CE_ATOF(inistring); 00608 #endif 00609 switch (torque_units) 00610 { 00611 case OZ_IN: 00612 dcm.Jm *= OZ_IN_TO_N_M; 00613 break; 00614 case LB_FT: 00615 dcm.Jm *= LB_FT_TO_N_M; 00616 break; 00617 default: 00618 break; 00619 } 00620 } 00621 if (NULL != (inistring = iniFind(fp, "DAMPING_FRICTION_COEFFICIENT", section))) 00622 { 00623 #ifndef UNDER_CE 00624 if (1 != sscanf((char *) inistring, "%lf", &dcm.Bm)) 00625 { 00626 /* found, but invalid */ 00627 rcs_print_error( "invalid DAMPING_FRICTION_COEFFICIENT: %s\n", inistring); 00628 retval = -1; 00629 } 00630 #else 00631 dcm.Bm = RCS_CE_ATOF(inistring); 00632 #endif 00633 switch (torque_units) 00634 { 00635 case OZ_IN: 00636 dcm.Bm *= OZ_IN_TO_N_M; 00637 break; 00638 case LB_FT: 00639 dcm.Bm *= LB_FT_TO_N_M; 00640 break; 00641 default: 00642 break; 00643 } 00644 } 00645 00646 if (retval == 0) 00647 { 00648 dcmotorSetParameters(dcmotor, dcm); 00649 } 00650 00651 if (NULL != (inistring = iniFind(fp, "CYCLE_TIME", section))) 00652 { 00653 #ifndef UNDER_CE 00654 if (1 != sscanf((char *) inistring, "%lf", &cycleTime)) 00655 { 00656 /* found, but invalid */ 00657 rcs_print_error( "invalid CYCLE_TIME: %s\n", inistring); 00658 retval = -1; 00659 } 00660 else 00661 { 00662 dcmotorSetCycleTime(dcmotor, cycleTime); 00663 } 00664 #else 00665 cycleTime = RCS_CE_ATOF(inistring); 00666 dcmotorSetCycleTime(dcmotor, cycleTime); 00667 #endif 00668 } 00669 00670 if (NULL != (inistring = iniFind(fp, "SHAFT_OFFSET", section))) 00671 { 00672 #ifndef UNDER_CE 00673 if (1 != sscanf((char *) inistring, "%lf", &offset)) 00674 { 00675 /* found, but invalid */ 00676 rcs_print_error( "invalid OFFSET: %s\n", inistring); 00677 retval = -1; 00678 } 00679 else 00680 { 00681 dcmotorSetOffset(dcmotor, offset); 00682 } 00683 #else 00684 offset = RCS_CE_ATOF(inistring); 00685 dcmotorSetOffset(dcmotor, offset); 00686 #endif 00687 } 00688 00689 if (NULL != (inistring = iniFind(fp, "REVS_PER_UNIT", section))) 00690 { 00691 #ifndef UNDER_CE 00692 if (1 != sscanf((char *) inistring, "%lf", &revsPerUnit)) 00693 { 00694 /* found, but invalid */ 00695 rcs_print_error( "invalid REVS_PER_UNIT: %s\n", inistring); 00696 retval = -1; 00697 } 00698 else 00699 { 00700 dcmotorSetRevsPerUnit(dcmotor, revsPerUnit); 00701 } 00702 #else 00703 revsPerUnit = RCS_CE_ATOF(inistring); 00704 dcmotorSetRevsPerUnit(dcmotor, revsPerUnit); 00705 #endif 00706 } 00707 00708 /* close inifile */ 00709 #ifndef UNDER_CE 00710 fclose(fp); 00711 #else 00712 inet_file_close(fp); 00713 #endif 00714 00715 return retval; 00716 00717 #else 00718 00719 return -1; 00720 00721 #endif /* not STDIO_SUPPORT */ 00722 } |
|
|
|
Definition at line 98 of file dcmotor2.c. |
|
Definition at line 354 of file dcmotor2.c. 00355 { 00356 double A,B; 00357 double delta_thm; 00358 00359 A=0.0; 00360 B=0.0; 00361 delta_thm=0.0; 00362 00363 if (0 == dcm || 00364 dcm->configured != ALL_SET) 00365 { 00366 return 0.0; 00367 } 00368 00369 if(dcm->order == 2) 00370 { 00371 if(dcm->fourac_minus_b_squared > 0 ) 00372 { 00373 /* The angular velocity is (w) is controlled by a formula of the 00374 form: 00375 00376 (10) w = A* e^(sa*t) + B*e^(sb*t) + ea/c 00377 00378 sb, sa and c were previously calculated in dcmotorSetParameters. 00379 (e is ofcourse 2.7182818 ... ) 00380 00381 00382 A and B still need to be calculated from the initial conditions. 00383 00384 At time t = 0, e^(sa*t) = e^(sb*t) = 1, and w = wo. 00385 00386 (11) wo = A + B + ea/c 00387 00388 The derivative of both sides of (10); 00389 00390 (12) w' = A*sa*e^(sa*t)+ B*sb*e^(sb*t) 00391 00392 at time t = 0, e^(sa*t) = e^(sb*t) = 1 again, and w`=dwo. 00393 00394 (13) dwo = A*sa + B*sb 00395 00396 Once A and B are calculated from (13) and (11) it is straight forward to calculate the current values of w and w' by substiting t=cycleTime in to equations 10 and 12. 00397 00398 e^(sa*cycleTime) and e^(sb*cycleTime) were previously calculated in dcmotorSetParameters and stored in sa_time_factor and sb_time_factor. 00399 00400 To get the change in position or delta_thm, integrate (10) from 0 to time t=cycleTime. 00401 00402 */ 00403 00404 if( (dcm->sb_real - dcm->sa_real) > 1E-15 || 00405 (dcm->sb_real - dcm->sa_real) < -1E-15 00406 ) 00407 { 00408 B = (dcm->dwo - dcm->sa_real *(dcm->wo-ea/dcm->c))/(dcm->sb_real - dcm->sa_real); 00409 A = dcm->wo -ea/dcm->c - B; 00410 } 00411 dcm->wo = A*dcm->sa_time_factor + B*dcm->sb_time_factor + ea/dcm->c; 00412 dcm->dwo = A*dcm->sa_real*dcm->sa_time_factor + B*dcm->sb_real*dcm->sb_time_factor; 00413 delta_thm = A*(dcm->sa_time_factor-1)/dcm->sa_real + B*(dcm->sb_time_factor -1)/dcm->sb_real + ea/dcm->c*dcm->cycleTime; 00414 } 00415 else if (dcm->fourac_minus_b_squared < 0) 00416 { 00417 /** 00418 The angular velocity(w) is controlled by the equation. 00419 00420 (14) w = A*e^(sa_real*t)*cos(sa_img*t)+ B*e^(sa_real*t)*sin(sa_img*t)+ea/c 00421 00422 sa_real, sa_img and c were calculated in dcmotorSetParameters() 00423 (e is ofcourse 2.7182818 ... ) 00424 00425 A and B still need to be calculated from the initial conditions. 00426 00427 At time t = 0, e^(sa_real)*t = 1, cos(sa_img*t)=1, sin(sa_img*t)=0, and w = wo, so 00428 00429 (15) wo = A*(1)*(1) + B*(1)*(0) + ea/c 00430 00431 The derivative of both sides of (14) 00432 00433 (16) w' = A*sa_real*e^(sa_real*t)*cos(sa_real*t)+ 00434 -A*sa_img*e^(sa_real*t)*sin(sa_real*t)+ 00435 B*sa_real*e^(sa_real*t)*sin(sa_real*t)+ 00436 A*sa_img*e^(sa_real*t)*cos(sa_real*t) 00437 00438 At time t = 0, e^(sa_real)*t = 1, cos(sa_img*t)=1, sin(sa_img*t)=0, and w' = dwo, so 00439 00440 (17) dwo = A*sa_real*(1)*(1) + 00441 -A*sa_real*(1)*(0) + 00442 B*sa_real*(1)*(0) + 00443 B*sa_img*(1)*(1) 00444 00445 00446 Once A and B are calculated from (15) and (17) it is straight forward to calculate the current values of w and w' by substiting t=cycleTime in to equations (14) and (16). 00447 00448 e^(sa_real*cycleTime)*cos(sa_img*cycleTime) and e^(sa_real*cycleTime)*sin(sa_img*cycleTime) were previously calculated in dcmotorSetParameters and stored in sa_time_factor and sb_time_factor. 00449 00450 To get the change in position or delta_thm, integrate (14) from 0 to time t=cycleTime. 00451 00452 */ 00453 if( 00454 (dcm->sa_img > 1E-15 || dcm->sa_img < -1E-15 ) && 00455 (dcm->c > 1E-15 || dcm->c < -1E-15 ) && 00456 (dcm->sa_real > 1E-15 || dcm->sa_real < -1E-15 ) 00457 ) 00458 { 00459 A = dcm->wo-ea/dcm->c; 00460 B = (dcm->dwo-dcm->sa_real*A)/dcm->sa_img; 00461 dcm->wo = A*dcm->sa_time_factor + 00462 B*dcm->sb_time_factor + 00463 ea/dcm->c; 00464 dcm->dwo = A*dcm->sa_real*dcm->sa_time_factor - 00465 A*dcm->sa_img*dcm->sb_time_factor + 00466 B*dcm->sb_real*dcm->sb_time_factor + 00467 B*dcm->sa_img*dcm->sa_time_factor; 00468 delta_thm = 00469 A*(dcm->sa_real*dcm->sa_time_factor+ 00470 dcm->sa_img*dcm->sb_time_factor - dcm->sa_real)/ 00471 (dcm->sa_real*dcm->sa_real + dcm->sa_img*dcm->sa_img) + 00472 B*(dcm->sa_real*dcm->sb_time_factor- 00473 dcm->sa_img*dcm->sa_time_factor + dcm->sa_img)/ 00474 (dcm->sa_real*dcm->sa_real + dcm->sa_img*dcm->sa_img) + 00475 (ea/dcm->c)*dcm->cycleTime; 00476 } 00477 } 00478 else 00479 { 00480 //FINISHME handle the case of fourac_minus_b_squared exactly equal zero. 00481 } 00482 } 00483 dcm->delta_thm = delta_thm; 00484 dcm->A = A; 00485 dcm->B = B; 00486 dcm->last_ea = ea; 00487 dcm->thm += delta_thm; 00488 00489 /* return motor position */ 00490 00491 return dcm->thm + dcm->offset; 00492 } |
|
Definition at line 111 of file dcmotor2.c. 00112 { 00113 if (0 == dcmotor) 00114 { 00115 return -1; 00116 } 00117 00118 /* note that seconds <= 0.0 means use real time */ 00119 dcmotor->cycleTime = seconds; 00120 dcmotor->configured |= CYCLE_TIME_SET; 00121 00122 00123 if(dcmotor->configured & PARAMETERS_SET) 00124 { 00125 // The sa_time_factor and sb_time_factor probably need to be recalculated. 00126 dcmotorSetParameters(dcmotor,*dcmotor); 00127 } 00128 00129 return 0; 00130 } |
|
Definition at line 294 of file dcmotor2.c. |
|
Definition at line 143 of file dcmotor2.c. 00144 { 00145 if (0 == dcmotor) 00146 { 00147 return -1; 00148 } 00149 00150 dcmotor->Ra = params.Ra; 00151 dcmotor->La = params.La; 00152 dcmotor->Kb = params.Kb; 00153 dcmotor->Jm = params.Jm; 00154 dcmotor->Bm = params.Bm; 00155 00156 /*** 00157 The simulation is based on two differential equations. 00158 From modified version of Newton's second law the rotor inertia(Jm) * angular accelleration(w') equals the sum of the torques. The torque applied by the motor is the torque constant(Kb==Ki)*armature current(i). A torque in the opposite direction caused by friction or the friction coefficent (Bm) * angular velocity(w). 00159 00160 (1) Jm*w' + Bm*w + Kb*i = 0. 00161 00162 From ohms law the sum of all the voltages around a loop must equal zero. The voltages include the externally applied voltage from the amplifier (ea), the voltage across the armature resistance (Ra) * the current (i) , the voltage accross the armature inductance (La) * the derivative of the current(i'), and the voltage caued by back emf or Kb * the angular velocity (w). 00163 00164 (2) La*i' + Ra*i + Kb*w - ea = 0. 00165 00166 Solving for i from equation (1): 00167 00168 (3) i = (Jm*w' + Bm*w)/Kb 00169 00170 Taking the derivative of both sides of (3): 00171 00172 (4) i' = (Jm*w'' + Bm*w')/Kb 00173 00174 where (w'') is the second derivative of angular velocity. 00175 00176 Substituting equations (3) and (4) into (2) : 00177 00178 (5) La*Jm/Kb * w'' + (Ra*Jm+La*Bm)/Kb * w' + (Ra*Bm/Kb + Kb)* w - ea = 0 00179 00180 The coefficients of w'',w' and w are calculated below and stored in 00181 a,b and c respecively. 00182 00183 If a is not equal to zero, the roots of this differential equation can be calculated with the quadratic formula. The roots are sa and sb. 00184 00185 (6) sa = -(b + sqrt(4*a*c-b^2))/(2*a) 00186 00187 (7) sb = -(b - sqrt(4*a*c-b^2))/(2*a) 00188 00189 If 4*a*c-b^2 is greater than zero then the real parts of sa and sb (sa_real and sb_real are calculate using (6) and (7), and the imaginary parts are zero. Otherwise both sb_real and sa_real equal -b/(2*a) and the imaginary parts sa_img and sb_img equal sqrt(4*a*c-b^2)/(2*a) and its negative. 00190 00191 If the cycle time is set and can therefore be considered constant, the time dependant parts of the solution can be calculated ahead of time and hopefully save the CPU bandwidth. If 4*a*c-b^2 is less than zero then the variable names sa_time_factor and sb_time_factor are a little misleading. They actually correspond to the cos factor (sa_time_factor) and sin factor (sb_time_factor). 00192 00193 Some degenerate cases to consider: 00194 00195 if a = 0 then it is only a first order system. 00196 00197 if b = 0 then any exitation would cause it to oscillate forever, a fairly unrealistic system, not handled here. 00198 00199 if c = 0 then Kb must be zero and the input voltage will have no effect on 00200 motor position. 00201 00202 */ 00203 if (params.Kb > 1E-15) 00204 { 00205 dcmotor->a = params.La*params.Jm/params.Kb; 00206 dcmotor->b = (params.La*params.Bm + params.Ra*params.Jm)/params.Kb; 00207 dcmotor->c = params.Ra*params.Bm/params.Kb + params.Kb; 00208 if( dcmotor->a > 1E-15) 00209 { 00210 dcmotor->order = 2; 00211 dcmotor->fourac_minus_b_squared = 4*dcmotor->a*dcmotor->c - dcmotor->b*dcmotor->b; 00212 if(dcmotor->fourac_minus_b_squared >= 0) 00213 { 00214 dcmotor->sa_real = -(dcmotor->b+sqrt(dcmotor->fourac_minus_b_squared))/(2*dcmotor->a); 00215 dcmotor->sa_img = 0; 00216 dcmotor->sb_real = -(dcmotor->b+sqrt(dcmotor->fourac_minus_b_squared))/(2*dcmotor->a); 00217 dcmotor->sb_img = 0; 00218 if(dcmotor->configured & CYCLE_TIME_SET) 00219 { 00220 dcmotor->sa_time_factor = exp(dcmotor->cycleTime*dcmotor->sa_real); 00221 if(dcmotor->fourac_minus_b_squared != 0) 00222 { 00223 dcmotor->sb_time_factor = exp(dcmotor->cycleTime*dcmotor->sb_real); 00224 } 00225 else 00226 { 00227 dcmotor->sb_time_factor = dcmotor->cycleTime*exp(dcmotor->cycleTime*dcmotor->sb_real); 00228 } 00229 } 00230 } 00231 else 00232 { 00233 dcmotor->sa_real = dcmotor->sb_real = -(dcmotor->b/(2*dcmotor->a)); 00234 dcmotor->sa_img = sqrt(-dcmotor->fourac_minus_b_squared)/(2*dcmotor->a); 00235 dcmotor->sb_img = -dcmotor->sa_img; 00236 if(dcmotor->configured & CYCLE_TIME_SET) 00237 { 00238 dcmotor->sa_time_factor = exp(dcmotor->cycleTime*dcmotor->sa_real)*cos(dcmotor->cycleTime*dcmotor->sa_img); 00239 dcmotor->sb_time_factor = exp(dcmotor->cycleTime*dcmotor->sa_real)*sin(dcmotor->cycleTime*dcmotor->sa_img); 00240 } 00241 } 00242 } 00243 else if(dcmotor->b > 1E-15) 00244 { 00245 dcmotor->order =1; 00246 dcmotor->sa_real = -dcmotor->c/dcmotor->b; 00247 dcmotor->sb_real = dcmotor->sa_img = dcmotor->sb_img = 0; 00248 if(dcmotor->configured & CYCLE_TIME_SET) 00249 { 00250 dcmotor->sa_time_factor = exp(dcmotor->cycleTime*dcmotor->sa_real); 00251 dcmotor->sb_time_factor = 0; 00252 } 00253 } 00254 } 00255 00256 dcmotor->configured |= PARAMETERS_SET; 00257 00258 return 0; 00259 } |
|
Definition at line 318 of file dcmotor2.c. |
|
|