回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块 中等

头像 驴友花雕 2023.08.05 140 1

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十一:Maixduino AI开发板 k210 RISC-V AI+lOT ESP32视觉听觉开发套装

 

0.jpg

知识点:DRV8833芯片
为玩具、打印机和其它电机一体化应用提供一种双通道电机驱动方案。8833有两路H桥驱动,可以驱动两路刷式直流电机,或者一个双极步进电机,或者螺线管或者其它感性负载。每一个桥的功率输出模块由N通道功率MOSFET组成,叫作H桥驱动器。每个桥包含整流电路和限流电路。内部关断功能包含过流保护,短路保护,欠压锁定保护和过温保护,并提供一个错误输出管脚。8833提供一种带有裸露焊盘的TSSOP-16封装,能有效改善散热性能,另一种是SOP16,无铅产品,引脚框采用100%无锡电镀。
 

0-1.jpg
0-2.jpg
0-3.jpg
0-4.jpg
0-4-.jpg
0-5.jpg
0-7.jpg

DRV8833特性
双路H桥电流控制电机驱动器
可以驱动两部直流电机或一部步进电机
低金属氧化物半导体场效应应晶体管(MOSFET)导通电阻:高侧(HS)+低侧(LS)360mΩ
输出电流(V M = 5V,25°C时)
采用PWP /RTY封装:每条H桥的RMS电流为1.5A,峰值电流为2A
采用PW封装:每条H桥的RMS电流为500mA,峰值电流为2A
可以将输出并联,以实现
3A RMS电流, 4A峰值电流(PWP和RTY封装)
1A RMS电流,4A峰值电流(PW封装)
宽电源电压范围:
2.7V至10.8V
PWM绕组电流调节/电流限制
耐热增强型表面贴装封装

DRV8833应用
电池供电式玩具
服务点(POS)打印机
视频安保摄像机
办公自动化设备
游戏
机器人

 

0-8.jpg

12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
17.jpg
19.jpg
20.jpg
21.jpg

DRV8833电机驱动模块
1.尺寸:18.5 * 16mm
2.输入电压:2.7 V – 10.8 V
3.单H桥输出电流:1.5A
4.过流保护:是的
5.短路保护:是的
6.欠压锁定:是
7.过热保护:是的
8.具有低功耗睡眠模式
9.可驱动1.5A以下的二只直流电机或4线步进电机

 

03.jpg

DRV8833电机驱动模块特征:
•ULT PIN:模式设置,低级别是睡眠模式
•OUT1,OUT2:由IN1 / IN2控制的1通道H桥
•OUT3,OUT4:由IN3 / IN4控制的2通道H桥
•EEP PIN:输出保护,默认无需连接
•VCC:3-10V
•双H桥电机驱动器:可驱动双路直流电机或单路双极步进电机
•工作电压:2.7 V至10.8 V
•输出电流:每个电机1.2 A连续(2 A峰值)
•电机输出可并联以向单个电机提供2.4 A连续(4 A峰值)
•输入为3V兼容和5V兼容
•欠压锁定和过流和过温保护
•反向电压保护电路
•可通过添加检测电阻(不包括)来限制电流。

 

05.jpg

DRV8833电机驱动模块管脚说明:
ANI1:AO1的逻辑输入控制端口,电平0-5V。
AIN2:AO2的逻辑输入控制端口,电平0-5V。
BNI1:BO1的逻辑输入控制端口,电平0-5V。
BIN2:BO2的逻辑输入控制端口,电平0-5V。
AO1、AO2为1路H桥输出端口,接一个直流电机的两个脚。
BO1、BO2为2路H桥输出端口,接另一个外直接电机的两个脚。
GND:接地。
VM:芯片和电机供电脚,电压范围2.7 V – 10.8 V。
STBY:接地或悬空芯片不工作,无输出,接5V工作;电平0-5V。
NC:空脚

 

06.jpg

DRV8833电机驱动模块电原理图

 

07 (1).jpg

04.jpg
08.jpg
22.jpg
23.jpg
24 (1).jpg
25 (1).jpg

Arduino DRV8833电机控制器库
https://codeload.github.com/TheArduinist/DRV8833/zip/master

https://cfhcable.dl.sourceforge. ... ler_library-0.2.zip

 

26.jpg

27.jpg
28.jpg
31.jpg

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG

Arduino实验开源代码

代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
*/

#define mode_pin  10
#define IN1_PIN 9
#define IN4_PIN 6
#define IN3_PIN 5
#define IN4_PIN 3

void setup() {
  pinMode(IN1_PIN, OUTPUT);
  pinMode(IN4_PIN, OUTPUT);
  pinMode(IN3_PIN, OUTPUT);
  pinMode(IN4_PIN, OUTPUT);
  pinMode(mode_pin, INPUT);
  digitalWrite(IN1_PIN, LOW);
  digitalWrite(IN4_PIN, LOW);
  digitalWrite(IN3_PIN, LOW);
  digitalWrite(IN4_PIN, LOW);
}

void loop() {
  int sensorValue = analogRead(A0);
  int sensorValue1 = analogRead(A1);
  if (digitalRead(mode_pin) == LOW)
  {
    digitalWrite(IN3_PIN, LOW);
    analogWrite(IN4_PIN, sensorValue);
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN4_PIN, sensorValue1);
  }
  if (digitalRead(mode_pin) == HIGH)
  {
    digitalWrite(IN4_PIN, LOW);
    analogWrite(IN3_PIN, sensorValue);
    digitalWrite(IN4_PIN, LOW);
    analogWrite(IN1_PIN, sensorValue1);
  }        
}

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG

Arduino实验开源代码

代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
*/

// 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);
}

30.jpg

评论

user-avatar
  • hacker_

    hacker_2023.08.09

    666

    0
    icon 他的勋章
      展开更多