Dùng mạch cầu H: L9110S điều khiển động cơ

16/06/2016
dung-mach-cau-h-l9110s-dieu-khien-dong-co

Mạch cầu H là mạch có hình chữ “H”, hiểu một cách nôm na là như thế, chúng thường được sử dụng trong cách mạch điện tử có dòng điện thấp và dùng để điều khiển hướng xoay của động cơ DC (cùng chiều hoặc ngược chiều kim đồng hồ).

Hầu hết các motor controllers sử dụng cầu H, thông dụng nhất là cầu H dùng để điều khiển hướng xoay của step motor. Để điều khiển một DC, xoay với vận tốc thay đổi, và theo 1 hướng nhất định, thì bạn có thể không cần dùng đến cầu H, nhưng, chuyện nếu bạn có nhu cầu điều khiển DC quay xuôi, ngược chiều kim đồng hồ thì đây là một sự lựa chọn thích hợp, hơn nữa, với cầu H bạn có thể điều khiển cùng lúc nhiều DC (hơn 1 DC).

Cấu tạo
Cầu H có 4 công tắc, tuỳ theo trạng thái của các công tắc này mà output của nó sẽ quyết định động cơ nào, xoay theo hướng nào.

Thông số kĩ thuật
Trong bài viết hôm nay, module L9110S sẽ được sử dụng làm ví dụ với thiết kế nhỏ gọn nhưng có khả năng điều khiển 2 động cơ DC hoặc 1 động cơ bước.

Thông số kỹ thuật:

Điện áp hoạt động: 2.5V đến 12V
Điện áo động cơ: 2.5V đến 12V
Số kênh điều điều khiển: 4
Dòng cực đại mỗi kênh: 0.8A

Cách sử dụng
Bạn có thể nối dây như sau:
port AIA kết nối chân pwm số 9
port AIB kết nối chân pwm số 5
port BIA kết nối chân pwm số 10
port BIB kết nối chân pwm số 6

Ví dụ 1
Trong ví dụ này, bạn dùng module L9110S để điều khiển 2 DC, với vận tốc tăng dần một cách lần lượt.

const int AIA = 9;

const int AIB = 5;

const int BIA = 10;

const int BIB = 6;

 

byte speed = 50; // change this (0-255) to control the speed of the motors

 

void setup() {

 

Serial.begin(9600);

pinMode(AIA, OUTPUT); // set pins to output

pinMode(AIB, OUTPUT);

pinMode(BIA, OUTPUT);

pinMode(BIB, OUTPUT);

 

Serial.print(" speed :");

Serial.println(speed);

 

}

 

void loop() {

forward();

delay(1000);

backward();

delay(1000);

left();

delay(1000);

right();

delay(1000);

 

Serial.print(" speed :");

Serial.println(speed);

speed+= 5;

if (speed>255) speed=0;

 

}

 

void backward()

{

analogWrite(AIA, 0);

analogWrite(AIB, speed);

analogWrite(BIA, 0);

analogWrite(BIB, speed);

}

 

void forward()

{

 

Serial.print(" -------------forward :");

Serial.println(speed);

 

analogWrite(AIA, speed);

analogWrite(AIB, 0);

analogWrite(BIA, speed);

analogWrite(BIB, 0);

}

 

void left()

{

Serial.print(" -------------left :");

Serial.println(speed);

analogWrite(AIA, speed);

analogWrite(AIB, 0);

analogWrite(BIA, 0);

analogWrite(BIB, speed);

}

 

void right()

{

Serial.print(" -------------right :");

Serial.println(speed);

analogWrite(AIA, 0);

analogWrite(AIB, speed);

analogWrite(BIA, speed);

analogWrite(BIB, 0);

}

 

Ví dụ 2

Cùng một cách kết nối như trên, trong ví dụ 2 này, Arduino sẽ điều khiển 1 động cơ xoay theo chiều cùng và trái chiều kim đồng hồ một cách tuần tự.

// wired connections

#define HG7881_B_IA 10 // D10 --> Motor B Input A --> MOTOR B +

#define HG7881_B_IB 11 // D11 --> Motor B Input B --> MOTOR B -

 

// functional connections

#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed

#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction

 

// the actual values for "fast" and "slow" depend on the motor

#define PWM_SLOW 50 // arbitrary slow speed PWM duty cycle

#define PWM_FAST 200 // arbitrary fast speed PWM duty cycle

#define DIR_DELAY 1000 // brief delay for abrupt motor changes

 

void setup()

{

Serial.begin( 9600 );

pinMode( MOTOR_B_DIR, OUTPUT );

pinMode( MOTOR_B_PWM, OUTPUT );

digitalWrite( MOTOR_B_DIR, LOW );

digitalWrite( MOTOR_B_PWM, LOW );

}

 

void loop()

{

boolean isValidInput;

// draw a menu on the serial port

Serial.println( "-----------------------------" );

Serial.println( "MENU:" );

Serial.println( "1) Fast forward" );

Serial.println( "2) Forward" );

Serial.println( "3) Soft stop (coast)" );

Serial.println( "4) Reverse" );

Serial.println( "5) Fast reverse" );

Serial.println( "6) Hard stop (brake)" );

Serial.println( "-----------------------------" );

do

{

byte c;

// get the next character from the serial port

Serial.print( "?" );

while( !Serial.available() )

; // LOOP...

c = Serial.read();

// execute the menu option based on the character recieved

switch( c )

{

case '1': // 1) Fast forward

Serial.println( "Fast forward..." );

// always stop motors briefly before abrupt changes

digitalWrite( MOTOR_B_DIR, LOW );

digitalWrite( MOTOR_B_PWM, LOW );

delay( DIR_DELAY );

// set the motor speed and direction

digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward

analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast

isValidInput = true;

break;

 

case '2': // 2) Forward

Serial.println( "Forward..." );

// always stop motors briefly before abrupt changes

digitalWrite( MOTOR_B_DIR, LOW );

digitalWrite( MOTOR_B_PWM, LOW );

delay( DIR_DELAY );

// set the motor speed and direction

digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward

analogWrite( MOTOR_B_PWM, 255-PWM_SLOW ); // PWM speed = slow

isValidInput = true;

break;

 

case '3': // 3) Soft stop (preferred)

Serial.println( "Soft stop (coast)..." );

digitalWrite( MOTOR_B_DIR, LOW );

digitalWrite( MOTOR_B_PWM, LOW );

isValidInput = true;

break;

 

case '4': // 4) Reverse

Serial.println( "Fast forward..." );

// always stop motors briefly before abrupt changes

digitalWrite( MOTOR_B_DIR, LOW );

digitalWrite( MOTOR_B_PWM, LOW );

delay( DIR_DELAY );

// set the motor speed and direction

digitalWrite( MOTOR_B_DIR, LOW ); // direction = reverse

analogWrite( MOTOR_B_PWM, PWM_SLOW ); // PWM speed = slow

isValidInput = true;

break;

 

case '5': // 5) Fast reverse

Serial.println( "Fast forward..." );

// always stop motors briefly before abrupt changes

digitalWrite( MOTOR_B_DIR, LOW );

digitalWrite( MOTOR_B_PWM, LOW );

delay( DIR_DELAY );

// set the motor speed and direction

digitalWrite( MOTOR_B_DIR, LOW ); // direction = reverse

analogWrite( MOTOR_B_PWM, PWM_FAST ); // PWM speed = fast

isValidInput = true;

break;

 

case '6': // 6) Hard stop (use with caution)

Serial.println( "Hard stop (brake)..." );

digitalWrite( MOTOR_B_DIR, HIGH );

digitalWrite( MOTOR_B_PWM, HIGH );

isValidInput = true;

break;

 

default:

// wrong character! display the menu again!

isValidInput = false;

break;

}

} while( isValidInput == true );

 

// repeat the main loop and redraw the menu...

}

Với mạch cầu H này, bạn sẽ có thể tạo ra nhiều ứng dụng liên quan DC sáng tạo và thú vị hơn.

Code được tham khảo và đã chạy test thành công, bạn có thể tìm thấy điều tương tự tại hbajdi.com và BananaRobotics.com.

Bình luận (1)
binh-luan

giaiphaptt2@gmail.com

16/06/2016

Hay
VIẾT BÌNH LUẬN CỦA BẠN