|
Отследить разницу в позициях моторов. |
|
|
|
Feb 6 2018, 06:51
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Когда было два мотора я по энкодерам брал их позицию, сравнивал, и если была разница в позициях больше пороговой - один мотор замедлял, другой ускорял. Код uint32_t MOT_GetPosDif(uint32_t pos1, uint32_t pos2, uint32_t *gt) { if( pos1 > pos2) { *gt = 0; return (pos1 - pos2); } else { *gt = 1; return (pos2 - pos1); } }
void MOT_PositionLoopDouble(void) { uint32_t position1, position2, posdif, gt; uint32_t pwm1, pwm2; position1 = motor1_data_double->position; position2 = motor2_data_double->position; posdif = MOT_GetPosDif(position1, position2, >); if (posdif > glob_mot_data.max_pos_diff) { //retry glob_mot_data.pos_diff_count++; if (glob_mot_data.pos_diff_count > glob_mot_data.max_pos_diff_count) { //maximum retries - unable to adjust speed glob_mot_data.pos_diff_count = 0; //send stop command MOT_SendData(motor1_data_double, CAN_COM_STOP, 0); MOT_SendData(motor2_data_double, CAN_COM_STOP, 0); sys_status |= MOT_POS_DIFF; } } else glob_mot_data.pos_diff_count = 0; //no position difference - maximum speed if (posdif < glob_mot_data.max_pos_diff) { MOT_SendData(motor1_data_double, CAN_COM_SSET, glob_mot_data.pwm_max); MOT_SendData(motor2_data_double, CAN_COM_SSET, glob_mot_data.pwm_max); } else { pwm1 = motor1_data_double->speed; pwm2 = motor2_data_double->speed; if (gt == 0) //position1 > position2 -> motor1 runs faster { //adjust pwm pwm1 -= glob_mot_data.pwm_delta; //motor1 speed down pwm2 += glob_mot_data.pwm_delta; //motor2 speed up //check min pwm limit if (pwm1 < glob_mot_data.pwm_min) pwm1 = glob_mot_data.pwm_min; //check max pwm limit if (pwm2 > glob_mot_data.pwm_max) pwm2 = glob_mot_data.pwm_max; } else if (gt == 1) //position2 > position1 -> motor2 runs faster { //adjust pwm pwm1 += glob_mot_data.pwm_delta; //motor1 speed up pwm2 -= glob_mot_data.pwm_delta; //motor2 speed down //check max pwm limit if (pwm1 > glob_mot_data.pwm_max) pwm1 = glob_mot_data.pwm_max; //check min pwm limit if (pwm2 < glob_mot_data.pwm_min) pwm2 = glob_mot_data.pwm_min; } } //update speed MOT_SendData(motor1_data_double, CAN_COM_SSET, pwm1); MOT_SendData(motor2_data_double, CAN_COM_SSET, pwm2); } Теперь моторов 4 и алгоритмика намного усложнилась, Не соображу как отследить разницу в позициях нескольких моторов.
|
|
|
|
|
 |
Сообщений в этой теме
Jenya7 Отследить разницу в позициях моторов. Feb 6 2018, 06:51     Jenya7 Цитата(AlexandrY @ Feb 6 2018, 14:15) Так... Feb 6 2018, 09:18      AlexandrY Цитата(Jenya7 @ Feb 6 2018, 11:18) знаете... Feb 6 2018, 09:34 Jenya7 А что скажут алгоритмисты на такое решение?
Кодuin... Feb 6 2018, 14:22 jcxz Цитата(Jenya7 @ Feb 6 2018, 16:22) А что ... Feb 6 2018, 16:22  AlexandrY Цитата(jcxz @ Feb 6 2018, 18:22) В полоте... Feb 6 2018, 18:46   jcxz Цитата(AlexandrY @ Feb 6 2018, 20:46) В д... Feb 6 2018, 21:40 Dog Pawlowa Цитата(Jenya7 @ Feb 6 2018, 09:51) Теперь... Feb 12 2018, 05:58 jcxz Цитата(Dog Pawlowa @ Feb 12 2018, 07:58) ... Feb 12 2018, 13:21  Dog Pawlowa Цитата(jcxz @ Feb 12 2018, 16:21) В моей ... Feb 12 2018, 17:35  AlexandrY Цитата(jcxz @ Feb 12 2018, 15:21) В моей ... Feb 12 2018, 20:12   jcxz Цитата(AlexandrY @ Feb 12 2018, 22:12) Су... Feb 12 2018, 21:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|