|
Отследить разницу в позициях моторов. |
|
|
|
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 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, 20:12
|

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

|
Цитата(jcxz @ Feb 12 2018, 15:21)  В моей схеме датчики Холла дают разрешение ~1 градус (механический). Хм, датчик холла на моторе конечно даст большое разрешение, но это довольно рсковано. Тут мы буквально недавно нагрелись Судили о скорости выходного вала редуктора по датчикам холла на моторе, а китайцы сделали редуктор при определенных моментах силы начинающий прокручиваться. И все, проблема на ровном месте. Если человек говорит что ему подходит пропорциональное управление значит его управление очень медленное и неточное. Тут нет смысла что либо советовать. У него так или иначе будет работать любой способ управления.
|
|
|
|
Сообщений в этой теме
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 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 Цитата(jcxz @ Feb 12 2018, 16:21) В моей ... Feb 12 2018, 17:35   jcxz Цитата(AlexandrY @ Feb 12 2018, 22:12) Су... Feb 12 2018, 21:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|