主题中讨论的其他部件: DRV2605、 DRV2624
工具/软件:
大家好、我将 使用 4个 DRV2605L 连续驱动4个 LRA 电机、并通过 PWM 输入持续大约2小时。 我已经发布了一个嗅探我的代码。 它的配置使1个电机在 特定周期内以250 Hz 的频率振动一次、静置667ms。
但是、一段时间后、这些电机会开始变热。 我已经将占空比从180降低到140。 但是、根据数据表、一旦该值变为127、就会向电机提供0伏电压。 我如何解决这个问题。 流经电机的电流似乎过大。 我曾经使用过分压器,这是有效的,但出于效率的原因,我很愿意不这样做。 能否进一步降低占空比?
请告诉我您的任何建议:
#include <Wire.h>
#include "Adafruit_DRV2605.h"
#include <esp_now.h>
#include <WiFi.h>
Adafruit_DRV2605 drv0;
Adafruit_DRV2605 drv1;
Adafruit_DRV2605 drv2;
Adafruit_DRV2605 drv3;
const int PWM_CHANNEL0 = 0;
const int PWM_CHANNEL1 = 1;
const int PWM_CHANNEL2 = 2;
const int PWM_CHANNEL3 = 3;
const int PWM_FREQ = 32000;
const int PWM_RESOLUTION = 8;
const int JITTER = 23.5;
int dutyCycle = 140;
const int DRV1 = 3;
const int DRV2 = 4;
const int DRV3 = 5;
const int DRV4 = 10;
int perms[24][4] = {
{0, 1, 2, 3}, {1, 0, 2, 3}, {2, 0, 1, 3}, {0, 2, 1, 3},
{1, 2, 0, 3}, {2, 1, 0, 3}, {2, 1, 3, 0}, {1, 2, 3, 0},
{3, 2, 1, 0}, {2, 3, 1, 0}, {1, 3, 2, 0}, {3, 1, 2, 0},
{3, 0, 2, 1}, {0, 3, 2, 1}, {2, 3, 0, 1}, {3, 2, 0, 1},
{0, 2, 3, 1}, {2, 0, 3, 1}, {1, 0, 3, 2}, {0, 1, 3, 2},
{3, 1, 0, 2}, {1, 3, 0, 2}, {0, 3, 1, 2}, {3, 0, 1, 2}
};
void TCA9548A(uint8_t bus){
Wire.beginTransmission(0x70);
Wire.write(1 << bus);
Wire.endTransmission();
}
void setup() {
Wire.begin(6,7);
TCA9548A(0);
delay(50);
while (! drv0.begin()) {
delay(5000);
}
drv0.useLRA();
drv0.setMode(3);
drv0.writeRegister8(0x1D, 161);
TCA9548A(1);
while (! drv1.begin()) {
delay(5000);
}
drv1.useLRA();
drv1.setMode(3);
drv1.writeRegister8(0x1D, 161);
TCA9548A(2);
while (! drv2.begin()) {
delay(5000);
}
drv2.useLRA();
drv2.setMode(3);
drv2.writeRegister8(0x1D, 161);
TCA9548A(3);
while (! drv3.begin()) {
delay(5000);
}
drv3.useLRA();
drv3.setMode(3);
drv3.writeRegister8(0x1D, 161);
ledcSetup(PWM_CHANNEL1, PWM_FREQ, PWM_RESOLUTION);
ledcSetup(PWM_CHANNEL0, PWM_FREQ, PWM_RESOLUTION);
ledcSetup(PWM_CHANNEL2, PWM_FREQ, PWM_RESOLUTION);
ledcSetup(PWM_CHANNEL3, PWM_FREQ, PWM_RESOLUTION);
ledcAttachPin(DRV1, PWM_CHANNEL0);
ledcAttachPin(DRV2, PWM_CHANNEL1);
ledcAttachPin(DRV3, PWM_CHANNEL2);
ledcAttachPin(DRV4, PWM_CHANNEL3);
}
void loop() {
for(int period = 1; period < 4; period++){
int pattern = random(25);
for(int j = 0; j < 4; j++){
ledcWrite(perms[pattern][j], dutyCycle);
delay(100);
ledcWrite(perms[pattern][j], 0);
delay(66);
}
}
delay(666);
}