MiniMoto DRV8830 硬件设计开发指南

电子说

1.4w人已加入

描述

MiniMoto DRV8830 硬件设计开发指南

在电子设计领域,电机驱动是一个常见且重要的应用场景。SparkFun 的 MiniMoto 板作为一款基于 I²C 的直流电机驱动器,为低电压系统中的电机控制提供了一个优秀的解决方案。本文将详细介绍 MiniMoto DRV8830 的相关特性、使用方法以及注意事项。

文件下载:BOB-11890.pdf

一、MiniMoto 简介

MiniMoto 是 SparkFun 推出的一款 I²C 直流电机驱动器,它设计用于在同一数据线上最多可连接 8 个额外的 MiniMoto 设备的系统中。其最低电压输出能力为 2.7V,这使得它非常适合使用单节 LiPo 电池的低电压系统,同时也能与低电压电机(如 Tamiya 齿轮箱产品附带的电机)配合使用。通过 I²C 进行控制,还能释放 CPU 的数据线和处理能力,让 CPU 可以将资源用于其他任务。

二、使用前的准备

在开始使用 MiniMoto 之前,建议你先熟悉以下几个方面的知识:

  1. Arduino 基础:本教程将使用 Arduino 环境来演示 MiniMoto 的功能,因此你需要了解什么是 Arduino。
  2. Arduino IDE 安装:如果还没有安装 Arduino 软件,可以参考相关指南进行安装。
  3. Arduino 库安装:为了充分发挥 MiniMoto 的功能,需要安装 MiniMoto 库,可通过相关教程学习安装方法。
  4. 脉冲宽度调制(PWM):MiniMoto 使用 PWM 来控制电机的速度,了解 PWM 概念将有助于你更好地使用它。
  5. I²C 通信:虽然使用 MiniMoto 库不需要 I²C 知识,但如果想深入了解其工作原理,可以进一步学习 I²C 通信。

三、硬件特性

1. I/O 接口

两个 0.1 英寸的排针提供了对 I²C 线、FAULT 信号和接地参考的访问。一排用于连接控制 CPU,另一排可用于连接到下一个 MiniMoto 板。FAULT 线为开漏输出,这意味着在故障条件下,无论并联连接多少个 MiniMoto 板,信号都会拉低。

2. 电源接口

提供了两个电源接口,一个用于输入,另一个用于将电源传递到下一个 MiniMoto 板。每个接口都有两组焊盘,一组适合 0.1 英寸的排针,另一组适合 3.5mm 的螺丝端子。

3. 安装孔

板角有三个安装孔,边缘间距为 1 英寸(25mm)。孔的尺寸适合 #4 - 40 螺丝,公制 M3 螺丝也同样适用。

4. 散热垫

在电路板的元件面另一侧有一块裸铜散热垫,它与驱动 IC 底部的电源焊盘紧密耦合。该散热垫尺寸适合安装小型散热片,可使用导热胶带或导热膏固定,以提高散热性能。

5. 电机输出接口

电机输出连接到该接口,它既可以使用 0.1 英寸的引脚,也可以使用与电源连接相同的 3.5mm 螺丝端子。

6. I²C 地址选择跳线

每个板都有地址选择跳线,允许用户设置 9 个地址之一。通过添加或移除焊锡,可以改变地址。默认情况下,跳线处于 1 - 1 状态,设置地址为 0xD0。

四、电气特性

MiniMoto 设计工作电压范围为 2.75V 至 6.8V,能够驱动电流高达 900mA 的电机。与芯片可靠通信所需的最小逻辑电平随电源电压而变化,在最大工作电压 6.8V 时,芯片识别为高电平的最小值为 3.13V,因此 3.3V 的输入可以被轻松识别。I²C 总线最高可运行在 400kHz,但在负载较重的总线上,可能需要降低数据速率以保持信号完整性。MiniMoto 库默认以 100kHz 运行,在大多数情况下都能正常工作。

五、Arduino 库使用

1. 设置 I²C 地址

MiniMoto 板有两个用于设置 I²C 地址的跳线,跳线有三种状态:开路、1 或 0。通过改变跳线状态,可以设置不同的地址,具体设置如下表所示: A1 A0 Address
0 0 0xC0
0 open 0xC2
0 1 0xC4
open 0 0xC6
open open 0xC8
open 1 0xCA
1 0 0xCC
1 open 0xCE
1 1 0xD0

在声明 MiniMoto 类的对象时,需要根据上述表格传递相应的地址作为参数。

2. 库函数

  • MiniMoto(byte addr):这是 MiniMoto 类的构造函数,addr 参数是根据跳线设置确定的地址值。
  • void drive(int speed):通过 PWM 驱动电机,速度范围为 6 - 63。尝试设置低于 6 的速度将被忽略,高于 63 的速度将被截断为 63。速度值的符号决定了电机的运动方向。
  • void stop():使电机自由滑行至停止。
  • void brake():将电机线短路,给电机施加一个重负载,使其更快地停止。在斜坡或有负载试图转动电机时,还能提供制动功能。
  • byte getFault():当发生故障时,FAULTn 线将拉低,调用该函数可以确定故障的性质。调用该函数会清除故障位,允许驱动器恢复运行,但如果导致故障的条件仍然存在,驱动器可能会立即再次进入故障状态。为了确定故障的性质,定义了几个常量:
    • FAULT:如果 FAULT 位未设置,则表示没有发生故障。
    • ILIMIT:如果检测电阻设置的电流限制超过 275ms 被违反,ILIMIT 位将被设置,但不会导致电机驱动器禁用。
    • OTS:表示发生热关断事件,输出将被禁用,当芯片温度降至安全水平时,操作将自动恢复。
    • UVLO:由于电源电压降至安全水平以下(约 2.5V)导致欠压锁定,当电源电压升至安全水平(约 2.75V)时,操作将恢复。
    • OCP:表示发生严重过流事件,与 ILIMIT 故障不同,它是驱动器本身的问题,通常表示输出短路或类似问题。当发生 OCP 错误时,操作将暂停,直到故障位被清除。

六、示例代码

以下是一个使用 MiniMoto 库控制 Tamiya 双电机齿轮箱中两个直流电机的简单 Arduino 示例代码:

#include < minimoto.h > // Include the MiniMoto library
MiniMoto motor0(0xCE); // A1 = 1, A0 = clear
MiniMoto motor1(0xD0); // A1 = 1, A0 = 1 (default)
#define FAULTn 16 // Pin used for fault detection.

void setup()
{ 
    Serial.begin(9600);
    Serial.println("Hello, world!");
    pinMode(FAULTn, INPUT);
}

void loop() {
    Serial.println("Forward!");
    motor0.drive(10);
    motor1.drive(10);
    delayUntil(10000);
    Serial.println("Stop!");
    motor0.stop();
    motor1.stop();
    delay(2000);
    Serial.println("Reverse!");
    motor0.drive(-10);
    motor1.drive(-10);
    delayUntil(10000);
    Serial.println("Brake!");
    motor0.brake();
    motor1.brake();
    delay(2000);
}

void delayUntil(unsigned long elapsedTime)
{ 
    unsigned long startTime = millis();
    while (startTime + elapsedTime > millis())
    {
        if (digitalRead(FAULTn) == LOW) {
            byte result = motor0.getFault();
            if (result & FAULT) {
                Serial.print("Motor 0 fault: ");
                if (result & OCP) Serial.println("Chip overcurrent!");
                if (result & ILIMIT) Serial.println("Load current limit!");
                if (result & UVLO) Serial.println("Undervoltage!");
                if (result & OTS) Serial.println("Over temp!");
                break;
            }
            result = motor1.getFault();
            if (result & FAULT) { 
                Serial.print("Motor 1 fault: ");
                if (result & OCP) Serial.println("Chip overcurrent!");
                if (result & ILIMIT) Serial.println("Load current limit!");
                if (result & UVLO) Serial.println("Undervoltage!");
                if (result & OTS) Serial.println("Over temp!");
                break;
            } 
        }
    }
}

这段代码首先初始化了两个 MiniMoto 实例,设置了故障检测引脚。在 loop 函数中,电机先正向转动一段时间,然后停止,接着反向转动一段时间,最后制动。delayUntil 函数是一个自定义的延迟函数,它会在延迟期间检查 MiniMoto 板的故障条件,并在发生故障时报告故障信息。

七、资源与拓展

通过以上内容,你应该已经掌握了使用 MiniMoto 驱动电机的基本方法。如果你想进一步了解 MiniMoto,可以参考以下资源:

  1. MiniMoto GitHub 页面:可以获取更多的代码示例和技术文档。
  2. MiniMoto 数据手册(DRV8830):详细了解其电气特性和工作原理。

此外,还有一些其他的电机相关产品和连接指南可供你探索,如 AutoDriver Hookup 和 RedBot Hookup。

在实际应用中,你是否遇到过类似电机驱动的问题?你是如何解决的呢?欢迎在评论区分享你的经验和想法。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分