|
Отследить разницу в позициях моторов. |
|
|
|
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 и алгоритмика намного усложнилась, Не соображу как отследить разницу в позициях нескольких моторов.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
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-а недостаточно. Порядок в систему может добавить и управляющий сигнал отличающийся от скачка и хитрый сигнал возмущения отличный от шума. В данном случае мы видим применение простейшего пропорционального квантованного управления. Это худший из возможных регуляторов.
|
|
|
|
|
Feb 12 2018, 05:58
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Jenya7 @ Feb 6 2018, 09:51)  Теперь моторов 4 и алгоритмика намного усложнилась, Не соображу как отследить разницу в позициях нескольких моторов. У меня в похожей задаче в качестве базы задавался всегда наиболее медленный мотор, потому что ускорить его невозможно (заполнение ШИМ 100%). Так что алгоритм и был построен на поиске наиболее медленного мотора(максимальном удалении от цели). ШИМ быстрых моторов определялся эмпирической формулой пропорционально рассогласованию. При ускорении/торможении всех моторов максимум ШИМ (значение ШИМ наиболее медленного мотора ) изменялось линейно. Что касается ПИД ... Не очень хорошо он работает в этих системах, т.к. разрешение датчиков Холла как правило недостаточное, а требования к синхронности - высокие.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 12 2018, 13:21
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Dog Pawlowa @ Feb 12 2018, 07:58)  Что касается ПИД ... Не очень хорошо он работает в этих системах, т.к. разрешение датчиков Холла как правило недостаточное, а требования к синхронности - высокие. У датчиков Холла нет разрешения. Оно есть у системы построенной на них. В моей схеме датчики Холла дают разрешение ~1 градус (механический). В системе ТС разрешение может быть ещё выше. И это только разрешение по импульсам самих датчиков. Система построенная на них, при более-менее равномерном вращении, может дать угловое разрешение во много раз выше. PS: Я имею в виду цифровые датчики Холла.
|
|
|
|
|
Feb 12 2018, 17:35
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(jcxz @ Feb 12 2018, 16:21)  В моей схеме датчики Холла дают разрешение ~1 градус (механический). Мало о чем говорит - слишком много разных моторов существует. Есть датчики на первичном валу, есть на вторичном, со своими достоинствами и недостатками. Надеюсь, топикстартер решит проблему, для этого советую выводить диагностическую информацию в консоль, т.к. просто отладка работает слишком медленно.
--------------------
Уходя, оставьте свет...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|