
Ремонт регулятора холостого хода на экскаваторе Hitachi
У данного экскаватора что-то произошло с "мозгами" после чего, у него перестала работать "печка", поворотники и отказал регулятор, который выставляет обороты на холостом ходу и глушит машину. Поворотники и печку победили с помощью реле, осталось разобраться с холостым ходом. Задача оказалась по истине интересная и нетривиальная. Разобрав двигатель, который управлял заслонкой стало понятно, что он шаговый. И так, мы имеем шаговый двигатель, с редуктором, и потенциометром, осталось заставить это все работать.
![]() |
![]() |
Шаговый двигатель (Stepper), в отличии от коллекторных или асинхронных заставить работать на много сложней, так как для их работы необходим драйвер (Stepper Motor Driver). На драйвер поступает сигнал (импульс) и он поворачивает двигатель на 1'8 градуса (в зависимости от двигателя). Для того что бы нам повернуть на 360 градусов (один оборот) нам нужно дать 200 импульсов (шагов). Если выдавать 200 импульсов в минуту, то мы получим скорость вращения 1 оборот в минуту. Из-за своей особенности данные двигатели получили широкое распространение в ЧПУ станках.
Был согласован принцип работы — блок управления, на блоке две кнопки. В момент нажатия и удержания кнопки двигатель вращался бы в одну и или другую сторону, в момент отпускания оставался бы неподвижен. Так же надо было добавить светодиод (LED), который был бы индикатором того, что блок включен или что двигатель в данный момент вращается. Для того, чтобы принимать сигналы с кнопок, выдавать сигналы DIR (направление движения), STEP (шаг), EN (удержание) и "моргать" светодиодом. Самым быстрым и дешевым средством для этих целей оказался Arduino Nano. Можно было использовать и аналоги от Амперки или Китай, но к сожалению сроки были довольно сжатые.
![]() |
![]() |
Технические характеристики Arduino Nano:
- Напряжение питания 5В;
- Входное питание 7-12В (рекомендованное);
- Количество цифровых пинов – 14, из них 6 могут использоваться в качестве выходов ШИМ;
- 8 аналоговых входов;
- Максимальный ток цифрового выхода 40 мА;
- Флэш- память 16 Кб или 32 Кб, в зависимости от чипа;
- ОЗУ 1 Кб или 2 Кб, в зависимости от чипа;
- EEPROM 512 байт или 1 Кб;
- Частота 16 МГц;
- Размеры 19 х 42 мм;
- Вес 7 г.
Данного арсенала под нашу задачу, более чем достаточно.
![]() |
![]() |
В первой версии в качестве драйвера был выбран BB-A4983, Двухканальный драйвер шагового двигателя, 2.5 А, 6-35В, так как рассчитать рабочие токи двигателя было затруднительно (почти невозможно), то взят был почти на угад. В последствии на машине он смог один раз открыть/закрыть и сгорел. В финальной версии в качестве драйвера использован "взрослый" драйвер CW5045.
Код Arduino выкладываю больше даже для себя, мало ли придется его доработать. Скажу сразу, что с точки зрения программирования код "очень" не идеален, скетч написан на скорую руку. Можно было оптимизировать работу, но к сожалению было мало времени.
#define pinLedRed 9
#define pinLedGreen 10
#define pushUP 2
#define pushDown 3
#define movingSpeed A1
#define StepPin 4
#define DirPin 6
int BlinkGreen = 0;
int BlinkGreen2 = 0;
int RotationSrart = 0;
int RotationSrart2 = 0;
int stopDriver = 0;
int Dir = 0;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 200;
void setup() {
//start serial connection
Serial.begin(9600);
pinMode(pushUP,INPUT_PULLUP);
pinMode(pushDown,INPUT_PULLUP);
pinMode(StepPin,OUTPUT);
pinMode(DirPin,OUTPUT);
pinMode(pinLedRed,OUTPUT);
pinMode(pinLedGreen,OUTPUT);
pinMode(movingSpeed,INPUT);
digitalWrite(DirPin, LOW);
digitalWrite(pinLedRed, LOW);
digitalWrite(pinLedGreen, HIGH);
}
void loop() {
int MovingSpeedValue = analogRead(movingSpeed);
//Serial.println(MovingSpeedValue);
unsigned long currentMillis = millis();
if (BlinkGreen == 0 && BlinkGreen2 == 0) {
digitalWrite(pinLedGreen, HIGH);
}
else {
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(pinLedGreen, ledState);
}
}
int upVal = digitalRead(pushUP);
int DownVal = digitalRead(pushDown);
if (DownVal == HIGH) {
BlinkGreen2 = 0;
RotationSrart2 = 0;
Dir = 0;
digitalWrite(pinLedRed, LOW);
} else {
BlinkGreen2 = 1;
RotationSrart2 = 1;
Dir = 1;
}
if (upVal == HIGH) {
BlinkGreen = 0;
RotationSrart = 0;
digitalWrite(pinLedRed, LOW);
} else {
BlinkGreen = 1;
RotationSrart = 1;
}
if (RotationSrart == 1 || RotationSrart2 == 1) {
if(Dir == 0) {
digitalWrite(DirPin, LOW);
}
else {
digitalWrite(DirPin, HIGH);
}
digitalWrite(StepPin, LOW);
delayMicroseconds(1500);
digitalWrite(StepPin, HIGH);
delayMicroseconds(1500);
}
}
![]() |
![]() |
Как это выглядит в кабине.
Получилось в итоге довольно неплохо. Машинисту понравилось. Если бы у меня было изначально чуть больше представления о том, что делаю, то можно было бы использовать даже штатный потенциометр для управления.