avatar_verial

Программа для переделки гироскутера.

Автор verial, 23 Дек. 2018 в 08:29

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

verial

Шим  параллелить не получиться.
Каждый человек индивидум оставьте его в этом состоянии.

NaN

#991
Цитата: verial от 10 Апр. 2021 в 05:22А если сделать провод - разветвитель
Я пробовал параллелить, это так не работает, там нужен какойто цифровой "разветвитель" сигнала видимо. А какие контакты еще нужно, пишите сюда в личку.

NaN

Цитата: DrGEM от 09 Апр. 2021 в 12:02#define CONTROL_ADC             0         // use ADC as input. Number indicates priority for dual-input. Disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2!

У меня вот тут вместо "ноль" пустая строка. Вот полностью:

Спойлер
// ############################ VARIANT_HOVERCAR SETTINGS ############################
#ifdef VARIANT_HOVERCAR
  #undef  CTRL_MOD_REQ
  #define CTRL_MOD_REQ        TRQ_MODE  // HOVERCAR works best in TORQUE Mode
  #define CONTROL_ADC                   // use ADC as input. disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2!
  //#define ADC_PROTECT_ENA               // ADC Protection Enable flag. Use this flag to make sure the ADC is protected when GND or Vcc wire is disconnected
  #define ADC_PROTECT_TIMEOUT 100       // ADC Protection: number of wrong / missing input commands before safety state is taken
  #define ADC_PROTECT_THRESH  300       // ADC Protection threshold below/above the MIN/MAX ADC values
  #define ADC1_MIN            1000      // min ADC1-value while poti at minimum-position (0 - 4095)
  #define ADC1_MAX            2500      // max ADC1-value while poti at maximum-position (0 - 4095)
  #define ADC2_MIN            500       // min ADC2-value while poti at minimum-position (0 - 4095)
  #define ADC2_MAX            2200      // max ADC2-value while poti at maximum-position (0 - 4095)
  #define SPEED_COEFFICIENT   8192     //  1.0f
  #define STEER_COEFFICIENT   0         //  0.0f
  #define INVERT_R_DIRECTION            // Invert rotation of right motor
  #define INVERT_L_DIRECTION            // Invert rotation of left motor
  //#define SIDEBOARD_SERIAL_USART3
  //#define FEEDBACK_SERIAL_USART3        // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
  // #define DEBUG_SERIAL_USART3           // right sensor board cable, disable if I2C (nunchuk or lcd) is used!

  // Extra functionality
  // #define STANDSTILL_HOLD_ENABLE        // [-] Flag to hold the position when standtill is reached. Only available and makes sense for VOLTAGE or TORQUE mode.
  // #define ELECTRIC_BRAKE_ENABLE         // [-] Flag to enable electric brake and replace the motor "freewheel" with a constant braking when the input torque request is 0. Only available and makes sense for TORQUE mode.
  // #define ELECTRIC_BRAKE_MAX    100     // (0, 500) Maximum electric brake to be applied when input torque request is 0 (pedal fully released).
  // #define ELECTRIC_BRAKE_THRES  120     // (0, 500) Threshold below at which the electric brake starts engaging.
#endif

Если не секрет что это за версия прошивки? Как я понял по сравнению с моей она намного более функциональна, я правильно понимаю что там есть сдвоенное управление от правой "гироскутерной" платы? И еще, если попробуете "круиз" отпишите как оно реализовано?

DrGEM

[user]NaN[/user], Прошивка FOC c github-a EmanuelFeru. С электроникой и паяльником дружу очень хорошо а вот с программированием только начинаю учиться по этому пока что не реализовал ничего, так как не нашел ответа как правильно править конфиг под датчик холла в варианте ховер кара.

Shadow_ru

Цитата: DrGEM от 10 Апр. 2021 в 10:48как правильно править конфиг под датчик холла
Перекидываете в отладочный режим, там выводится на UART показания АЦП, давите педальку туда-сюда, записываете циферки, правите настройки.

// ############################### DEBUG SERIAL ###############################
/* Connect GND and RX of a 3.3v uart-usb adapter to the left (USART2) or right sensor board cable (USART3)
* Be careful not to use the red wire of the cable. 15v will destroye evrything.
* If you are using VARIANT_NUNCHUK, disable it temporarily.
* enable DEBUG_SERIAL_USART3 or DEBUG_SERIAL_USART2
* and DEBUG_SERIAL_ASCII use asearial terminal.
*
*
* DEBUG_SERIAL_ASCII output is:
* // "1:345 2:1337 3:0 4:0 5:0 6:0 7:0 8:0\r\n"
*
* 1:   (int16_t)adc_buffer.l_tx2);                                         ADC1
* 2:   (int16_t)adc_buffer.l_rx2);                                         ADC2
* 3:   (int16_t)speedR);                                                   output command: [-1000, 1000]
* 4:   (int16_t)speedL);                                                   output command: [-1000, 1000]
* 5:   (int16_t)adc_buffer.batt1);                                         Battery adc-value measured by mainboard
* 6:   (int16_t)(batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC));    Battery calibrated voltage multiplied by 100 for verifying battery voltage calibration
* 7:   (int16_t)board_temp_adcFilt);                                       for board temperature calibration
* 8:   (int16_t)board_temp_deg_c);                                         Temperature in celcius for verifying board temperature calibration
*
*/

NaN

Цитата: DrGEM от 10 Апр. 2021 в 10:48как правильно править конфиг под датчик холла в варианте ховер кара
Да может и не придется больше ничего править, попробуйте убрать 0 из той строки что я указал, думаю сразу все заработает... Так то я тоже не силен во всех этих программах, но по моему вполне логично что там не должно быть 0

DrGEM

Спасибо за ответы. В понедельник попробую. Если правильно понял перевод то
Цитировать//use ADC as input. Number indicates priority for dual-input Disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2
это
Цитировать//Использование ЦАП как вход. Номер указывает приоритет двойного входа. Отключить (отключение, выключить, выключение) CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2
,
Вот тут я не понял приоритет чего ? Под двойным входом подразумевается управление по уарт2 и обратная связь по уарт2 ? Не кидайте сильно тапками, для меня это сложно потому как не понимаю смысл этого выражения. Я так понимаю что 1 это задействовать а 0 - отключить. А при чем тут приоритет ? Я воспринял эту информацию так
CONTROL_SERIAL_USART2 это 0 а FEEDBACK_SERIAL_USART2 это 1
то есть в приоритете контроль по уарт2 а не обратная связь.

Pau62

В исходниках, которые у меня -
#define CONTROL_ADC // use ADC as input. disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2!
Это значит - если есть ( не закоментирована строка #define CONTROL_ADC )
То АЦП используется для управления, и другое использование этого пина контроллера ( этого контакта платы ) не возможно.

#define CONTROL_ADC             0    - так наверное можно написать, но такой синтаксис не используется обычно.
Видимо, это то же самое, что закоментировать строку.

Добавлено 11 Апр 2021 в 11:49

Цитата: DrGEM от 11 Апр. 2021 в 10:29Вот тут я не понял приоритет чего ?

Приоритет этого дефайна.
Если он дефайнед, то други дефы для этого пина не рассматриваются.

Нет, там немного черезжопней сделано. Просто вывод данных работать не будет, вход будет анелоговым.

DrGEM

Спасибо за разъяснения. Убрал ноль из строки, не компилируются , появились три ошибки  в файле main.c
Спойлер
// ####### VARIANT_HOVERCAR #######
      #if defined(VARIANT_HOVERCAR) || defined(VARIANT_SKATEBOARD) || defined(ELECTRIC_BRAKE_ENABLE)
        uint16_t speedBlend;                                        // Calculate speed Blend, a number between [0, 1] in fixdt(0,16,15)
        speedBlend = (uint16_t)(((CLAMP(speedAvgAbs,10,60) - 10) << 15) / 50); // speedBlend [0,1] is within [10 rpm, 60rpm]
      #endif

      #ifdef STANDSTILL_HOLD_ENABLE
        standstillHold();                                           // Apply Standstill Hold functionality. Only available and makes sense for VOLTAGE or TORQUE Mode
      #endif

      #ifdef VARIANT_HOVERCAR
      if (inIdx == CONTROL_ADC) {                                   // Only use use implementation below if pedals are in use (ADC input)
        if (speedAvgAbs < 60) {                                     // Check if Hovercar is physically close to standstill to enable Double tap detection on Brake pedal for Reverse functionality
          multipleTapDet(input1[inIdx].cmd, HAL_GetTick(), &MultipleTapBrake); // Brake pedal in this case is "input1" variable
        }

        if (input1[inIdx].cmd > 30) {                               // If Brake pedal (input1) is pressed, bring to 0 also the Throttle pedal (input2) to avoid "Double pedal" driving
          input2[inIdx].cmd = (int16_t)((input2[inIdx].cmd * speedBlend) >> 15);
          cruiseControl((uint8_t)rtP_Left.b_cruiseCtrlEna);         // Cruise control deactivated by Brake pedal if it was active
        }
      }
      #endif

      #ifdef ELECTRIC_BRAKE_ENABLE
        electricBrake(speedBlend, MultipleTapBrake.b_multipleTap);  // Apply Electric Brake. Only available and makes sense for TORQUE Mode
      #endif

      #ifdef VARIANT_HOVERCAR
      if (inIdx == CONTROL_ADC) {                                   // Only use use implementation below if pedals are in use (ADC input)
        if (speedAvg > 0) {                                         // Make sure the Brake pedal is opposite to the direction of motion AND it goes to 0 as we reach standstill (to avoid Reverse driving by Brake pedal)
          input1[inIdx].cmd = (int16_t)((-input1[inIdx].cmd * speedBlend) >> 15);
        } else {
          input1[inIdx].cmd = (int16_t)(( input1[inIdx].cmd * speedBlend) >> 15);
        }
      }
      #endif

      #ifdef VARIANT_SKATEBOARD
        if (input2[inIdx].cmd < 0) {                                // When Throttle is negative, it acts as brake. This condition is to make sure it goes to 0 as we reach standstill (to avoid Reverse driving)
          if (speedAvg > 0) {                                       // Make sure the braking is opposite to the direction of motion
            input2[inIdx].cmd  = (int16_t)(( input2[inIdx].cmd * speedBlend) >> 15);
          } else {
            input2[inIdx].cmd  = (int16_t)((-input2[inIdx].cmd * speedBlend) >> 15);
          }
        }
      #endif
// ####### VARIANT_HOVERCAR #######
      #ifdef VARIANT_HOVERCAR
      if (inIdx == CONTROL_ADC) {               // Only use use implementation below if pedals are in use (ADC input)
        if (!MultipleTapBrake.b_multipleTap) {  // Check driving direction
          speed = steer + speed;                // Forward driving: in this case steer = Brake, speed = Throttle
        } else {
          speed = steer - speed;                // Reverse driving: in this case steer = Brake, speed = Throttle
        }
        steer = 0;                              // Do not apply steering to avoid side effects if STEER_COEFFICIENT is NOT 0
      }
      #endif
      // ####### LOW-PASS FILTER #######
      rateLimiter16(input1[inIdx].cmd , RATE, &steerRateFixdt);
      rateLimiter16(input2[inIdx].cmd , RATE, &speedRateFixdt);
      filtLowPass32(steerRateFixdt >> 4, FILTER, &steerFixdt);
      filtLowPass32(speedRateFixdt >> 4, FILTER, &speedFixdt);
      steer = (int16_t)(steerFixdt >> 16);  // convert fixed-point to integer
      speed = (int16_t)(speedFixdt >> 16);  // convert fixed-point to integer

      // ####### MIXER #######
      // cmdR = CLAMP((int)(speed * SPEED_COEFFICIENT -  steer * STEER_COEFFICIENT), INPUT_MIN, INPUT_MAX);
      // cmdL = CLAMP((int)(speed * SPEED_COEFFICIENT +  steer * STEER_COEFFICIENT), INPUT_MIN, INPUT_MAX);
      mixerFcn(speed << 4, steer << 4, &cmdR, &cmdL);   // This function implements the equations above
красным выделил скобки которые высвечиваются как ошибки. Но если вместо нуля вписываю 1 то компилируется.

Jenya_m

может возьмёшь последние исходники, там немного проще..
у меня вот так: Type 3 - это автоматическое определение и задал минимум и максимум 1000 и 2500 если выйдет за предел, управление прерывается.
// ############################ VARIANT_HOVERCAR SETTINGS ############################
#ifdef VARIANT_HOVERCAR
  #define FLASH_WRITE_KEY         0x1107  // Flash memory writing key. Change this key to ignore the input calibrations from the flash memory and use the ones in config.h
  #undef  CTRL_MOD_REQ
  #define CTRL_MOD_REQ            TRQ_MODE  // HOVERCAR works best in TORQUE Mode
  #define CONTROL_ADC             0         // use ADC as input. Number indicates priority for dual-input. Disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2!
  // #define SIDEBOARD_SERIAL_USART3 1         // Rx from right sensor board: to use photosensors as buttons. Number indicates priority for dual-input. Comment-out if sideboard is not used!
  // #define FEEDBACK_SERIAL_USART3            // Tx to   right sensor board: for LED battery indication. Comment-out if sideboard is not used!

  // #define DUAL_INPUTS                       // ADC*(Primary) + Sideboard_R(Auxiliary). Uncomment this to use Dual-inputs
  #define PRI_INPUT1              3,  1000, 0, 2500, 0  // Pedal Brake        TYPE, MIN, MID, MAX, DEADBAND. See INPUT FORMAT section
  #define PRI_INPUT2              3,  1000, 0, 2500, 0  // Pedal Accel        TYPE, MIN, MID, MAX, DEADBAND. See INPUT FORMAT section
  #define AUX_INPUT1              0, -1000, 0, 1000, 0  // Sideboard Steer    TYPE, MIN, MID, MAX, DEADBAND. See INPUT FORMAT section
  #define AUX_INPUT2              0, -1000, 0, 1000, 0  // Sideboard Speed    TYPE, MIN, MID, MAX, DEADBAND. See INPUT FORMAT section

  #define SPEED_COEFFICIENT       16384     // 1.0f
  #define STEER_COEFFICIENT       8192      // 0.5f Only active in Sideboard input
  // #define INVERT_R_DIRECTION                // Invert rotation of right motor
  // #define INVERT_L_DIRECTION                // Invert rotation of left motor
  // #define DEBUG_SERIAL_USART3               // right sensor board cable, disable if I2C (nunchuk or lcd) is used! !!!!!!!Вот тут надо разкоментировать для отладки!!!!!

  // Extra functionality
  // #define CRUISE_CONTROL_SUPPORT            // [-] Flag to enable Cruise Control support. Activation/Deactivation is done by sideboard button or Brake pedal press.
  // #define STANDSTILL_HOLD_ENABLE            // [-] Flag to hold the position when standtill is reached. Only available and makes sense for VOLTAGE or TORQUE mode.
  // #define ELECTRIC_BRAKE_ENABLE             // [-] Flag to enable electric brake and replace the motor "freewheel" with a constant braking when the input torque request is 0. Only available and makes sense for TORQUE mode.
  // #define ELECTRIC_BRAKE_MAX    100         // (0, 500) Maximum electric brake to be applied when input torque request is 0 (pedal fully released).
  // #define ELECTRIC_BRAKE_THRES  120         // (0, 500) Threshold below at which the electric brake starts engaging.

DrGEM

[user]Jenya_m[/user],    Спасибо за ответ, да ,на предыдущей странице нарисовал схему только газ и тормоз на базе SS49E холов и естественно проигнорировал про 5 вольт ,с электроникой дружу , проц на 3.3 и из даташита четко сказано  2.0 to 3.6 V application supply and I/Os .  Так вроде последние скачал с гитхаба.

Добавлено 11 Апр. 2021 в 22:38

у меня там единица, попробую завтра с 3-кой и отпишусь. Спасибо.

DrGEM

Мне не разрешены пока выкладывать ссылки но качал вроде это EmanuelFeru/hoverboard-firmware-hack-FOC в начале дописать гитхаб. Перекачал ещё раз архив вроде такой же , но сейчас почему то не активируются настройки в config.h для ховеркара из платформио. Какой бы не раскоментил  вариант в platformio.ini в config.h активен для настроек только VARIANT_ADC SETTINGS. Чет я совсем увяз.

verial

#1002



Каждый человек индивидум оставьте его в этом состоянии.

Balbes323

Добрый день! Кто-нибудь пробовал использовать разъём программирования для управления? Есть возможность сконфигурировать swclk/swdio как входы?
Осталось 99%...

Dj.Ad

Добрый день, делал кто подсчет пройденного расстояния? или подскажите где что подправить, сам то понимаю что нужно найти где опрашивается датчик холла и поделить это на 15, равно 1 оборот

Pau62

#1005
В bldc. c

Спойлер


  // ========================= RIGHT MOTOR =========================== 
    // Get hall sensors values
      static uint8_t r_halls_old;
            
    uint8_t hall_ur = !(RIGHT_HALL_U_PORT->IDR & RIGHT_HALL_U_PIN);
    uint8_t hall_vr = !(RIGHT_HALL_V_PORT->IDR & RIGHT_HALL_V_PIN);
    uint8_t hall_wr = !(RIGHT_HALL_W_PORT->IDR & RIGHT_HALL_W_PIN);
      
      uint8_t r_halls =  hall_ur | hall_vr | hall_wr;
      if (r_halls != r_halls_old)
      {
         r_halls_old = r_halls;
         
         
         
         /*вот здесь пишем то, что должно происходить при каждом изменении состояния холлов*/
         
      }


А, да, состояние холлов будет меняться 30*3 раз за оборот.
Можно проще написать, я поторопился немного.

   // Get hall sensors values
      static uint8_t r_hall_u_old;
            
    uint8_t hall_ur = !(RIGHT_HALL_U_PORT->IDR & RIGHT_HALL_U_PIN);
    uint8_t hall_vr = !(RIGHT_HALL_V_PORT->IDR & RIGHT_HALL_V_PIN);
    uint8_t hall_wr = !(RIGHT_HALL_W_PORT->IDR & RIGHT_HALL_W_PIN);
      

      if (hall_ur != r_hall_u_old)
      {
         r_hall_u_old = hall_ur;
         
         
         
         /*вот здесь пишем то, что должно происходить при каждом изменении состояния одного из холлов
типа типа добавляем расстояние, соответствующее одному изменению состояния 1 холла к счетчику пробега */
         
      }


Теперь на 30 делить и умножать на длину окружности колеса.

Balbes323

Осталось 99%...

verial

Пытаюсь писать свою программу может есть тут кто хороше знает Си ++ ?
с Фазами какая то беда бьется в конвульсиях мотор.
Могу скинуть исходник пишите мыло.
Чисто для изучения работы моторов так сказать из нутри.
Каждый человек индивидум оставьте его в этом состоянии.