Ovládání stejnosměrných motorů pomocí ovladače motoru DRV8833

13.09.2024 Arduino #motor #arduino #esp32 #drv8833

Ovladače L293D a L298N jsou bezpochyby hlavními ovladači motoru pro projekty Arduino. Jsou spolehlivé a byly použity ve stovkách, ne-li tisících projektů. Mají však velkou nevýhodu – používají bipolární tranzistory (BJT), díky čemuž jsou extrémně neefektivní. U ovladače DRV8833 se tento neduh odstraňuje.


Problém s BJT je, že mají pokles napětí v zapnutém stavu. Energie z tohoto napětí musí někam jít, a to skutečně jde; rozptyluje se jako teplo. Postupem času to může mít za následek značné ztráty energie a v některých případech způsobit přehřátí řidiče. To může být značnou nevýhodou pro projekty, které musí běžet delší dobu.

Naštěstí moderní ovladače motorů, jako je DRV8833, opravdu fungují, pokud jde o efektivitu. Namísto použití BJT používá DRV8833 MOSFETy. MOSFETy mají téměř zanedbatelný pokles napětí, což znamená, že téměř veškeré napětí z napájecího zdroje je dodáváno do motoru. To je důvod, proč je DRV8833 nejen energeticky účinnější než motorové ovladače založené na BJT, ale také generuje mnohem méně tepla, takže je bezpečnější používat po delší dobu.

Ovladač motoru DRV8833

Srdcem modulu je integrovaný IC ovladače H-Bridge od společnosti Texas Instruments, který je optimalizován pro aplikace motorového řízení – DRV8833.

DRV8833 obsahuje dva NMOS H-bridge drivery, které mu umožňují ovládat dva DC kartáčové motory, bipolární krokový motor, solenoidy a další indukční zátěže.

Pracuje v rozsahu napětí od 2,7 V do 10,8 V a může nepřetržitě dodávat až 1,2 A na kanál. Kromě toho může tolerovat špičkové proudy až 2 A na kanál po dobu několika sekund.

DRV8833 také obsahuje řadu ochranných funkcí, jako je podpěťové uzamčení, nadproudová ochrana a ochrana proti přehřátí, které nabízejí vysokou úroveň spolehlivosti. Každá z těchto událostí deaktivuje MOSFETy H-Bridge. Po odstranění poruchového stavu bude zařízení pokračovat ve své činnosti.

Zahrnuje také režim spánku s nízkou spotřebou, který vám umožní šetřit energii, zejména když se motory nepoužívají.

Všechny tyto vlastnosti z něj dělají vynikající volbu pro napájení malých nízkonapěťových motorů.

Technické specifikace

Napětí motoru 2,7V – 10,8V
Logické napětí Kompatibilní s 3V a 5V
Trvalý výstupní proud 1,2A (na kanál)
Špičkový výstupní proud 2A (na kanál)
Kanály motoru 2
Ochranné funkce podpětí, nadproud a nadměrná teplota

DRV8833 Pinout ovladače motoru

Ovladač DRV8833 má celkem 12 pinů, které jej spojují s vnějším světem. Pinout je následující:

Napájecí kolíky

Na rozdíl od většiny motorových ovladačů má DRV8833 pouze jedno připojení napájení (protože napětí motoru je stejné jako logické napětí).

VCC a GND je místo, kde připojíte napájecí zdroj, který pohání motory, který může být v rozsahu 2,7V až 10,8V.

Všimněte si, že DRV8833 může pracovat s napětím až 2,7 V. To znamená, že je ideální pro nízkonapěťové projekty, jako jsou ty, které běží na jednočlánkové LiPo baterie a nízkonapěťové motory.

Výstupní kolíky

Výstupní piny budiče motoru DRV8825, jmenovitě OUT1, OUT2, OUT3 a OUT4, jsou vhodně umístěny na jedné straně modulu pro snadné propojení.

Motor A by měl být připojen k OUT1 a OUT2, zatímco motor B by měl být připojen k OUT3 a OUT4. K těmto kolíkům můžete připojit jakýkoli kartáčovaný stejnosměrný motor v rozsahu od 2,7 V do 10,8 V.

Mějte na paměti, že DRV8833 může dodávat 1,2 A na kanál nepřetržitě (špička 2 A) do dvojice stejnosměrných motorů.

Ovládací vstupní piny

Každý motor má dva řídicí vstupy;IN1aIN2jsou řídicí vstupy pro motor A, zatímcoIN3aIN4jsou pro motor B. Tyto řídicí vstupy umožňují ovládat rychlost a směr otáčení motoru.

Ovládání směru:

Směr otáčení motoru lze řídit aplikací logického HIGH (5V) nebo logického LOW (zem) na tyto vstupy. Níže uvedená pravdivostní tabulka ukazuje, jak vstupy ovlivňují výstupy budiče.

IN1/IN3 IN2/IN4 Směr otáčení
Nízká (0) Nízká (0) Motor VYP
vysoká (1) Nízká (0) Vpřed
Nízká (0) vysoká (1) Zvrátit
vysoká (1) vysoká (1) Motor VYP

Ovládání rychlosti:

Pokud chcete ovládat rychlost, můžete použít Pulse Width Modulation (PWM) na kolíku, který je obvykle vysoký. Pokud ovládání rychlosti nepotřebujete, nastavte je buď na VYSOKÉ nebo NÍZKÉ.

Pin režimu spánku

TheSPÁTkolík (označený EEP na sítotisku desky) ovládá režim spánku DRV8833. Nastavením tohoto pinu na nízkou hodnotu přepne DRV8833 do režimu spánku s nízkou spotřebou energie, zatímco nastavením na vysokou hodnotu jej opět aktivujete.

V tomto režimu jsou H-můstky deaktivovány, nabíjecí čerpadlo pohonu brány je zastaveno, veškerá vnitřní logika je resetována, všechny interní hodiny jsou zastaveny a všechny vstupy jsou ignorovány. Je důležité si uvědomit, že při návratu z režimu spánku potřebuje ovladač motoru trochu času, až 1 milisekundu, aby byl opět plně funkční.

Ve výchozím nastavení je kolík SLEEP vytažen vysoko na desce, takže pokud neplánujete používat režim spánku s nízkou spotřebou, můžete jej nechat odpojený.

Na zadní straně modulu DRV8833 je pájecí propojka J1.

Ve výchozím nastavení je J1 zavřený, což připojuje integrovaný pullup ke kolíku SLEEP, čímž zůstává DRV8833 povolený. Pokud však otevřete J1, integrovaný pullup se odpojí od kolíku SLEEP. Tato akce povolí rozbalení na čipu, což znamená, že DRV8833 zůstane ve výchozím nastavení vypnutý. Pokud se tedy rozhodnete otevřít J1, pamatujte, že v případě potřeby budete muset DRV8833 zapnout ručně.

Pin detekce závad

Pin pro detekci chyb (označený ULT na sítotisku na desce) je výstup s otevřeným výstupem, který je řízen na nízkou úroveň čipem, kdykoli dojde k nadproudu, přehřátí nebo podpětí.

Ve výchozím nastavení zůstává tento kolík v plovoucím stavu. Pokud tedy chcete monitorovat poruchové stavy na ovladači, budete muset připojit externí pull-up rezistor (nebo použít vstup mikrokontroléru s povoleným vestavěným pull-up).

Omezení proudu

DRV8833 může aktivně omezovat proud procházející motory. Toho se obecně dosáhne připojením odporu mezi kolík AISEN a zem pro nastavení limitu pro motor A a dalšího odporu mezi kolík BISEN a zem pro nastavení limitu pro motor B.

Tato specifická vylamovací deska DRV8833 však spojuje tyto kolíky snímání proudu přímo se zemí, čímž účinně deaktivuje funkci omezení proudu.

Zapojení modulu DRV8833 k Arduinu

Pro začátek připojte napájení motoru. Pin VCC je napájecí zdroj pro motory a měl by být připojen ke vhodnému zdroji napájení v závislosti na požadavcích vašeho motoru (2,7 V až 10,8 V). V našem experimentu používáme stejnosměrné motory s převodovkou, nazývané také motory „TT“, které se často vyskytují u robotů s pohonem dvou kol. Jsou dimenzovány na 3 až 12V. Na pin VCC tedy připojíme externí zdroj 5V.

Nyní připojte řídicí vstupy DRV8833 (IN1, IN2, IN3 a IN4) ke čtyřem digitálním výstupním pinům (10, 9, 6 a 5) na Arduinu. Všimněte si, že všechny tyto piny podporují PWM.

Připojte jeden motor ke svorce A (OUT1 a OUT2) a druhý ke svorce B (OUT3 a OUT4). Můžete vyměnit připojení motoru. Technicky neexistuje správný nebo špatný způsob.

Pokud chcete monitorovat poruchové stavy, můžete připojit pin FAULT k digitálnímu pinu na Arduinu. Nezapomeňte použít externí pull-up rezistor nebo povolit vestavěný pull-up rezistor v Arduinu pro tento pin, protože je to výstup s otevřeným odtokem.

Nakonec se ujistěte, že váš obvod a Arduino sdílejí společnou zem.

Následující tabulka uvádí pinová připojení pro připojení ovladače motoru DRV8833 k Arduinu:

Ovladač DRV8833 Arduino
GND GND
IN1 10
IN2 9
IN3 6
IN4 5

 

Obrázek níže ukazuje, jak sestavit obvod.

Příklad kódu Arduino

Náčrt níže vám ukáže, jak ovládat rychlost a směr otáčení dvojice stejnosměrných motorů – pomocí ovladače motoru DRV8833 a může sloužit jako základ pro praktičtější experimenty a projekty.

// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5

void setup(void)
{
  // Set all the motor control inputs to OUTPUT
  pinMode(MOT_A1_PIN, OUTPUT);
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);

  // Initialize the serial UART at 9600 baud
  Serial.begin(9600);
}

void loop(void)
{
  // Generate a fixed motion sequence to demonstrate the motor modes.

  // Ramp speed up.
  for (int i = 0; i < 11; i++) {
    spin_and_wait(25*i, 25*i, 500);
  }
  // Full speed forward.
  spin_and_wait(255,255,2000);

  // Ramp speed into full reverse.
  for (int i = 0; i < 21 ; i++) {
    spin_and_wait(255 - 25*i, 255 - 25*i, 500);
  }

  // Full speed reverse.
  spin_and_wait(-255,-255,2000);

  // Stop.
  spin_and_wait(0,0,2000);

  // Full speed, forward, turn, reverse, and turn for a two-wheeled base.
  spin_and_wait(255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, -255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(255, -255, 2000);
  spin_and_wait(0, 0, 1000);
}

/// Set the current on a motor channel using PWM and directional logic.
///
/// \param pwm    PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN  pin number xIN1 for the given channel
/// \param IN2_PIN  pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

/// Set the current on both motors.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
  set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);

  // Print a status message to the console.
  Serial.print("Set motor A PWM = ");
  Serial.print(pwm_A);
  Serial.print(" motor B PWM = ");
  Serial.println(pwm_B);
}

/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
  set_motor_currents(pwm_A, pwm_B);
  delay(duration);
}

 

Literatura

Controlling DC Motors with DRV8833 Motor Driver and Arduino. Online. LastMinuteEngineers.com. 2024. Dostupné z: https://lastminuteengineers.com/drv8833-arduino-tutorial/. [cit. 2024-09-13].