1 minute read

감속 모터에 사용하는 BLC-22H06P 구동 드라이버

[㈜디엔지위드] BLDC감속모터+컨트롤러세트 BL3640A-24V-06P + RA35 with BLC-22H06P image

BLC-22H06P

BLC-22H06P.
spec image image

image

아두이노로 구동 영상

회로 구성 사진

image

arduino source code

6번핀을 PWM으로 속도를 제어 하는데 사용하고
8번핀을 GPIO pin으로 방향 제어용도로 사용

UART로 “u” 입력 : 속도 5% 업 UART로 “d” 입력 : 속도 5% 다운 UART로 “w” 입력 : 방향전환 (속도를 줄였다가 방향 바꿔서 이전 속도까지 증가)

const int pwmPin = 6;    // PWM 핀 (D6)
const int dirPin = 8;    // 방향 제어 핀 (D8)

int speedPercent = 50;   // 현재 속도 (%)
int targetSpeed = 50;    // 목표 속도 (%)
bool direction = LOW;    // 현재 방향

const int stepDelay = 20; // 감속/가속 단계 간 딜레이(ms)

void setup() {
  pinMode(pwmPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  Serial.begin(9600);

  analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
  digitalWrite(dirPin, direction);

  Serial.print("Init: speed=");
  Serial.print(targetSpeed);
  Serial.print("%, direction=");
  Serial.println(direction ? "HIGH" : "LOW");
}

void loop() {
  // 시리얼 입력 처리
  if (Serial.available()) {
    char cmd = Serial.read();

    if (cmd == 'u') {
      if (targetSpeed < 100) {
        targetSpeed = targetSpeed + 5;
        Serial.print("Target speed up: ");
        Serial.print(targetSpeed);
        Serial.println("%");
      }
    }
    else if (cmd == 'd') {
      if (targetSpeed > 0) {
        targetSpeed = targetSpeed - 5;
        Serial.print("Target speed down: ");
        Serial.print(targetSpeed);
        Serial.println("%");
      }
    }
    else if (cmd == 'w') {
      changeDirectionSmoothly();
    }
  }

  // 목표 속도에 맞춰 현재 속도 조정
  if (speedPercent < targetSpeed) {
    speedPercent++;
    analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
    Serial.print("Speed up: ");
    Serial.print(speedPercent);
    Serial.println("%");
    delay(stepDelay);
  } else if (speedPercent > targetSpeed) {
    speedPercent--;
    analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
    Serial.print("Speed down: ");
    Serial.print(speedPercent);
    Serial.println("%");
    delay(stepDelay);
  }
}

// 방향 전환 시 부드럽게 감속/정지 후 방향 변경, 다시 가속
void changeDirectionSmoothly() {
  int prevTarget = targetSpeed;

  // 1. 천천히 감속하여 정지
  while (speedPercent > 0) {
    speedPercent--;
    analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
    Serial.print("Speed down: ");
    Serial.print(speedPercent);
    Serial.println("%");
    delay(stepDelay);
  }

  // 2. 방향 토글
  direction = !direction;
  digitalWrite(dirPin, direction);
  Serial.print("Direction changed: ");
  Serial.println(direction ? "HIGH" : "LOW");

  // 3. 다시 이전 목표 속도까지 가속
  while (speedPercent < prevTarget) {
    speedPercent++;
    analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
    Serial.print("Speed up: ");
    Serial.print(speedPercent);
    Serial.println("%");
    delay(stepDelay);
  }
}

Tags:

Categories:

Updated: