|
Отследить разницу в позициях моторов. |
|
|
|
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 и алгоритмика намного усложнилась, Не соображу как отследить разницу в позициях нескольких моторов.
|
|
|
|
|
 |
Ответов
|
Feb 6 2018, 16:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Jenya7 @ Feb 6 2018, 16:22)  А что скажут алгоритмисты на такое решение? В полотенцах разбираться лень. Почитайте теорию: https://ru.wikipedia.org/wiki/ПИД-регуляторРазница между скоростями ваших движков - это сигнал ошибки собственно. У него есть три составляющие согласно той ссылке. Цитата(AlexandrY @ Feb 6 2018, 10:40)  У вас и так нет интегральной составляющей, т.е. ваш алгоритм в пределе не стремится к нулевой ошибке. Здесь уважаемый AlexandrY говорит я думаю об интегральной составляющей из приведённой мной выше ссылки. Это второе слагаемое в первой формуле с той ссылки. На той же страничке есть график, показывающий что будет при неучёте каких-то составляющих.
|
|
|
|
|
Feb 6 2018, 18:46
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(jcxz @ Feb 6 2018, 18:22)  В полотенцах разбираться лень. Почитайте теорию: https://ru.wikipedia.org/wiki/ПИД-регуляторПри описании PID регуляторов почему-то всегда забыват сказать одну важную вещь, которая все ставит на свои места. А именно этот регулятор применим только к нагрузкам тоже являющимся как и PID системами второго порядка. Если система меньшего порядка, то у PID выкидыват какой-либо член, если система большего порядка, то PID-а недостаточно. Порядок в систему может добавить и управляющий сигнал отличающийся от скачка и хитрый сигнал возмущения отличный от шума. В данном случае мы видим применение простейшего пропорционального квантованного управления. Это худший из возможных регуляторов.
|
|
|
|
Сообщений в этой теме
Jenya7 Отследить разницу в позициях моторов. Feb 6 2018, 06:51 AlexandrY Цитата(Jenya7 @ Feb 6 2018, 08:51) Теперь... Feb 6 2018, 07:28 Jenya7 Цитата(AlexandrY @ Feb 6 2018, 12:28) При... Feb 6 2018, 07:59  AlexandrY Цитата(Jenya7 @ Feb 6 2018, 09:59) тогда ... Feb 6 2018, 08:40   Jenya7 Цитата(AlexandrY @ Feb 6 2018, 13:40) А г... Feb 6 2018, 08:46    AlexandrY Цитата(Jenya7 @ Feb 6 2018, 10:46) с двум... Feb 6 2018, 09:15     Jenya7 Цитата(AlexandrY @ Feb 6 2018, 14:15) Так... Feb 6 2018, 09:18      AlexandrY Цитата(Jenya7 @ Feb 6 2018, 11:18) знаете... Feb 6 2018, 09:34 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
|
|
|