Найти числовую разницу в массиве в С.

jenya7
Дата: 05.02.2018 17:42:25
Такая вот задача.
Есть массив чисел. Мне нужно сравнить скажем первые 4 числа и если между ними есть разница 10 - поднять флаг.
То есть функция примет аргументы - массив, количество элементов для сравнения и разницу между числами.
int GetPosDif(int pos[], int elements, int diff)

У меня получаются какие то громоздкие решения. Как это можно сделать максимально быстро?
Dima T
Дата: 05.02.2018 17:45:54
Что значит "если между ними есть разница 10" ?

Между какими разница? Максимальным и минимальным? Соседними? Еще как-то?
jenya7
Дата: 05.02.2018 17:56:13
Dima T
Что значит "если между ними есть разница 10" ?

Между какими разница? Максимальным и минимальным? Соседними? Еще как-то?

в принципе мне надо отследить разницу между любым из них. это моторы. когда их было два - я по энкодерам брал их позицию, сравнивал, и если была разница в позициях больше пороговой - один мотор замедлял, другой ускорял. теперь моторов 4 и алгоритмика намного усложнилась, не соображу как отследить разницу в позициях моторов.
exp98
Дата: 05.02.2018 18:00:51
jenya7, число парных сочетаний среди 4-х элементов = 6. Наверно вот столько флагов теперь ...
jenya7
Дата: 05.02.2018 18:59:28
+ Вот как я делал на два мотора
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, &gt);
    
    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;
        }
    }
    
    pwm1 = motor1_data_double->speed;   
    pwm2 = motor2_data_double->speed;
    
    //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 if (gt == 0)  //position1 > position2
    {
        //adjust pwm
        pwm1 -= glob_mot_data.pwm_delta;
        pwm2 += glob_mot_data.pwm_delta;
        
        //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
    {
        //adjust pwm
        pwm1 += glob_mot_data.pwm_delta;
        pwm2 -= glob_mot_data.pwm_delta;
        
        //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);
  
}

Вот ломаю голову как сделать на четыре мотора
Модератор: Просьба убирать большие исходники под спойлер
д0кХ
Дата: 05.02.2018 22:38:25
jenya7
Вот ломаю голову как сделать на четыре мотора

отсортировать массив .

соотвественно в массиве должны быть структуры
номер двигла и значение параметра.
Dima T
Дата: 06.02.2018 08:56:01
jenya7
Dima T
Что значит "если между ними есть разница 10" ?

Между какими разница? Максимальным и минимальным? Соседними? Еще как-то?

в принципе мне надо отследить разницу между любым из них. это моторы. когда их было два - я по энкодерам брал их позицию, сравнивал, и если была разница в позициях больше пороговой - один мотор замедлял, другой ускорял. теперь моторов 4 и алгоритмика намного усложнилась, не соображу как отследить разницу в позициях моторов.

ИМХО в случае с 4-мя моторами, как понимаю, может потребоваться коррекция работы нескольких моторов. Как вариант выводить какое-то среднее и относительно него выравнивать работу всех моторов.

Вобщем алгоритм непонятен, надо сначала сформулировать алгоритм, а затем его реализацией заниматься.

Опиши не на двигателях, а на массивах, т.е.: массив такой-то на входе, на выходе такой-то результат.
Dima T
Дата: 06.02.2018 09:15:21
jenya7
Вот как я делал на два мотора
    //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);
    }
...

Пытаюсь понять как два работают. Непонятно это место. Как понимаю это случай когда оба мотора работают почти синхронно, т.е. расхождение в пределах нормы. Но зачем-то происходит изменение их скоростей. Они не могут дальше работать как работали?
Dima T
Дата: 06.02.2018 09:34:37
Как тебе такой алгоритм:
1. Считаем медиану массива.
2. Проверяем каждый элемент на отклонение от медианы, если отклонение более допустимого, то корректируем работу данного двигателя.

Для расчета медианы необязательно сортировать, можно поизобретать альтернативные алгоритмы.
jenya7
Дата: 06.02.2018 09:41:17
Dima T
jenya7
Вот как я делал на два мотора
    //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);
    }
...

Пытаюсь понять как два работают. Непонятно это место. Как понимаю это случай когда оба мотора работают почти синхронно, т.е. расхождение в пределах нормы. Но зачем-то происходит изменение их скоростей. Они не могут дальше работать как работали?


в этом месте если расхождения нет или оно приемлимо я устанавливаю максимальную скорость для двух моторов.
не пойму какой алгоритм выбрать. наверно нужна какая то структура для каждого мотора содержащая разницу по отношению к каждому из соседних моторов. но как тогда принимать решение? какой замедлить а какой ускорить?