电子说
在电子设计领域,电机驱动是一个常见且重要的应用场景。SparkFun 的 MiniMoto 板作为一款基于 I²C 的直流电机驱动器,为低电压系统中的电机控制提供了一个优秀的解决方案。本文将详细介绍 MiniMoto DRV8830 的相关特性、使用方法以及注意事项。
文件下载:BOB-11890.pdf
MiniMoto 是 SparkFun 推出的一款 I²C 直流电机驱动器,它设计用于在同一数据线上最多可连接 8 个额外的 MiniMoto 设备的系统中。其最低电压输出能力为 2.7V,这使得它非常适合使用单节 LiPo 电池的低电压系统,同时也能与低电压电机(如 Tamiya 齿轮箱产品附带的电机)配合使用。通过 I²C 进行控制,还能释放 CPU 的数据线和处理能力,让 CPU 可以将资源用于其他任务。
在开始使用 MiniMoto 之前,建议你先熟悉以下几个方面的知识:
两个 0.1 英寸的排针提供了对 I²C 线、FAULT 信号和接地参考的访问。一排用于连接控制 CPU,另一排可用于连接到下一个 MiniMoto 板。FAULT 线为开漏输出,这意味着在故障条件下,无论并联连接多少个 MiniMoto 板,信号都会拉低。
提供了两个电源接口,一个用于输入,另一个用于将电源传递到下一个 MiniMoto 板。每个接口都有两组焊盘,一组适合 0.1 英寸的排针,另一组适合 3.5mm 的螺丝端子。
板角有三个安装孔,边缘间距为 1 英寸(25mm)。孔的尺寸适合 #4 - 40 螺丝,公制 M3 螺丝也同样适用。
在电路板的元件面另一侧有一块裸铜散热垫,它与驱动 IC 底部的电源焊盘紧密耦合。该散热垫尺寸适合安装小型散热片,可使用导热胶带或导热膏固定,以提高散热性能。
电机输出连接到该接口,它既可以使用 0.1 英寸的引脚,也可以使用与电源连接相同的 3.5mm 螺丝端子。
每个板都有地址选择跳线,允许用户设置 9 个地址之一。通过添加或移除焊锡,可以改变地址。默认情况下,跳线处于 1 - 1 状态,设置地址为 0xD0。
MiniMoto 设计工作电压范围为 2.75V 至 6.8V,能够驱动电流高达 900mA 的电机。与芯片可靠通信所需的最小逻辑电平随电源电压而变化,在最大工作电压 6.8V 时,芯片识别为高电平的最小值为 3.13V,因此 3.3V 的输入可以被轻松识别。I²C 总线最高可运行在 400kHz,但在负载较重的总线上,可能需要降低数据速率以保持信号完整性。MiniMoto 库默认以 100kHz 运行,在大多数情况下都能正常工作。
| 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 类的对象时,需要根据上述表格传递相应的地址作为参数。
以下是一个使用 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,可以参考以下资源:
此外,还有一些其他的电机相关产品和连接指南可供你探索,如 AutoDriver Hookup 和 RedBot Hookup。
在实际应用中,你是否遇到过类似电机驱动的问题?你是如何解决的呢?欢迎在评论区分享你的经验和想法。
全部0条评论
快来发表一下你的评论吧 !