درس ۱۰۲: استفاده از ZK-5DA برای کنترل دو موتور DC ۴ آمپری
در این آموزش، ما به بررسی نحوه استفاده از ماجیول درایور موتور ZK-5DA برای کنترل دو موتور DC 4A خواهیم پرداخت. این ماجیول بر اساس چیپ TA6586 طراحی شده است که کنترل مؤثر موتور را با افت ولتاژ کم و دفع حرارت ارائه میدهد. در پایان این آموزش، شما قادر خواهید بود موتور را به طور مؤثر شروع، متوقف و سرعت آن را کنترل کنید. برای توضیحات بیشتر، مطمئن شوید که ویدئو را در (در ویدئو در 08:55) بررسی کنید.

توضیح سختافزار
کامپوننت اصلی این پروژه ماجیول درایور موتور ZK-5DA است. این ماجیول از چیپ TA6586 استفاده میکند که کنترل کارآمد دو موتور DC را ممکن میسازد. این چیپ به گونهای طراحی شده است که میتواند تا 4 آمپر جریان برای هر موتور را مدیریت کند و در عین حال افت ولتاژ پایینی را حفظ کند که به کاهش تولید حرارت در حین کار کمک میکند.
علاوه بر درایور موتور، شما به یک برد آردوئینو نیاز دارید تا سیگنالهای کنترل را به ماجیول ارسال کنید. آردوئینو جهت و سرعت موتورها را با استفاده از سیگنالهای PWM (مدولاسیون عرض پالس) تعیین میکند. اتصال موتورها به پایههای مناسب روی ماجیول درایور امکان کنترل جهت و تنظیم سرعت را فراهم میآورد.
جزئیات ورقه داده
| تولید کننده | شرکت نیمه رسانا RZ |
|---|---|
| شماره قطعه | TA6586 |
| ولتاژ عملیاتی | ۳-۱۴ ولت |
| جریان اوج | ۹ A |
| جریان پیوسته | ۵ A |
| جریان آماده به کار | < ۲ میکروآمپر |
| افت ولتاژ | ۴۰۰ میلی ولت در ۴ آمپر |
| دامنه دما | -25 تا 85 درجه سانتیگراد |
| بسته | بسته IC استاندارد |
| یادداشتها / انواع | خاموشی حرارتی، محافظت در برابر جریان اضافی |
- تأمین دفع حرارت مناسب برای عملکرد مداوم بالای ۳ آمپر.
- از پایههای دارای PWM برای کنترل سرعت استفاده کنید.
- ولتاژهای مشخص شده را قبل از اتصال موتورها بررسی کنید.
- به قطبیت سیمکشی توجه کنید تا از آسیب به موتور جلوگیری شود.
- دمای دستگاه را در حین کار کنترل کنید تا از overheating جلوگیری شود.
دستورالعملهای سیمکشی

برای سیمکشی ماجیول درایور موتوری ZK-5DA، ابتدا تغذیه را وصل کنید. پایانه مثبت منبع تغذیه را به پایانه '+' درایور موتور و پایانه منفی را به پایانه '-' وصل کنید. دو موتور به پایانههای خروجی متصل خواهند شد که بهخاطر وضوح، برچسبگذاری شدهاند.
برای اتصالات آردوینو، از پایههای دارای PWM استفاده کنید: پایه را متصل کنید3به پایه کنترل برای موتور ۱ و پایه5به پایه کنترل دوم برای موتور ۱. به همین ترتیب، پایه را وصل کنید6به پایه کنترل موتور 2 و پایه9به پایه کنترلی دوم برای موتور 2. در نهایت، اطمینان حاصل کنید که تمام زمینها به هم متصل هستند.
نمونههای شِفر (کود) و راهنما
شِفر (کود) با تعریف پایههای مربوطه و راهاندازی نمایشگر مسلسل برای اشکالزدایی آغاز میشود. توابع کنترل موتور، مانندM1وM2, جهتدهی و سرعتهای موتور را کنترل کنید.
const int D0=9; // Motor 1 PWM pin
const int D1=6; // Motor 1 direction pin
const int D2=5; // Motor 2 PWM pin
const int D3=3; // Motor 2 direction pin
اینجا، پایهها به گونهای تنظیم شدهاند که موتورها را با استفاده از سیگنالهای PWM کنترل کنند.setupاین تابع این پایهها را به عنوان خروجی مقداردهی میکند.
void loop() {
M2(CW, 80); // Motor 2 runs clockwise at 80% speed
delay(3000); // Wait for 3 seconds
brake(2); // Apply brake to motor 2
delay(1000);
}
این بخش نشاندهنده حلقه اصلی برنامه است، جایی که موتور ۲ برای ۳ ثانیه با ۸۰٪ سرعت به صورت ساعتگرد کار میکند و سپس ترمز اعمال میشود.brakeاین تابع موتور را هنگام فراخوانی متوقف میکند.
void M1(bool direction, int speed) {
int pwm = map(speed, 0, 100, 0, 255); // Map speed to PWM range
if (direction == CW) {
analogWrite(D0, pwm);
analogWrite(D1, LOW);
} else {
analogWrite(D1, pwm);
analogWrite(D0, LOW);
}
}
متن:M1عملکرد جهت و سرعت را به عنوان ورودی میگیرد، سرعت را به یک مقدار PWM نگاشته و پایههای مناسب را برای کنترل جهت چرخش موتور تنظیم میکند.debugPrintتابع برای نمایش وضعیت فعلی در مانیتور سری فراخوانی میشود.
برای شِفر (کود) کامل، فراموش نکنید که در زیر مقاله (در ویدیو در ساعت 08:55) بررسی کنید.
نمایش / چه انتظاری باید داشت
زمانی که شِفر (کود) را اجرا میکنید، انتظار داشته باشید که موتورها در جهتهای مشخص شده با سرعتهای تعیین شده بچرخند. شِفر (کود) شامل ترمز و تنظیمات سرعت است که کنترل دینامیک را ممکن میسازد. اگر موتورها به طور خexpected پاسخ ندهند، اتصالات سیمکشی خود را دوباره بررسی کنید و اطمینان حاصل کنید که پایههای صحیح در شِفر (کود) تنظیم شدهاند. همچنین، نسبت به overheating احتیاط کنید، به ویژه زمانی که جریانهای بالا را میکشید، همانطور که در حین امتحان (در ویدئو در 23:23) نشان داده شده است.
مهرههای ویدیویی
- ۰۰:۰۰ مقدمه
- 03:16 برگه اطلاعات مشاهده شد
- 06:34 توضیح سیمکشی
- 08:55 شِفر (کود) توضیح داده شده
- ۱۴:۲۸ نمایش: کنترل موتور
- 17:22 نمایش: امتحان حداکثر جریان
- آزمایش افت ولتاژ در 3A، 4A و 5A
- تذکرات پایانی
/*
* Lesson 102: Using ZK-5DA to control 2 DC motors, each 4A
*
* Full video details: https://youtu.be/W_Wm28nQAYA
* Video timing:
00:00 Introduction
03:16 Datasheet viewed
06:34 Wiring explained
08:55 Code explained
14:28 Demonstration: Motor control
17:22 Demonstration: Maximum current test
23:23 Voltage drop test at 3A, 4A, and 5A
26:28 Conclusion remarks
* Written by Ahmad Shamshiri for Arduino Step by Step Course by Robojax
* www.Robojax.com
* on Mar 22, 2022
*
* This code is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
*
* For the library for this code, visit http://robojax.com/
*
If you found this tutorial helpful, please support me so I can continue creating
content like this. Make a donation using PayPal or a credit card: https://bit.ly/donate-robojax
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
//all pins must be PWM enabled pins with ~ printed beside them
const int D0=9;//~
const int D1=6;
const int D2=5;
const int D3=3;
bool CW = true;
bool CCW = false;
bool debug = false;
void setup() {
Serial.begin(9600);
Serial.println("Robojax TA6586 Motor Control");
pinMode(D0, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
}
void loop() {
// * Full video details: https://youtu.be/W_Wm28nQAYA
M2(CW, 80);//motor 1 runs CW at 80% speed
M1(CW, 100); //motor 1 runs CW at 100% speed
delay(3000);//wait for 3 seconds
brake (2);//apply brake to motor 2
delay(1000);
M2(CCW, 60);//motor 2 runs CCW at 60% speed
delay(3000);//wait for 3 seconds
brake (2);//apply brake to motor 2
brake (1);//apply brake to motor 1
delay(3000);//wait for 3 seconds
for(int i=0; i<=100; i++)
{
M1(CCW, i);//run motor 1 to CCW direction with i% speed
delay(100);
}
delay(2000);
brake (2);//apply brake to motor 2
delay(3000); delay(3000);//wait for 3 seconds}
}//loop ends
/*
* M1(bool direction,int speed)
* @brief runs motor 1
* @param direction is CW or CCW,
* @param speed is an integer between 0 to 100
* @return returns none
* Written by Ahmad Shamshiri for robojax.com
* on Mar 22, 2022
* Full video details: https://youtu.be/W_Wm28nQAYA
*/
void M1(bool direction,int speed)
{
int pwm=map(speed, 0, 100, 0, 255);
if(direction == CW)
{
analogWrite(D0,pwm);
analogWrite(D1,LOW);
}else{
analogWrite(D1,pwm);
analogWrite(D0,LOW);
}
debugPrint(1, direction, speed, false);
}//M1 end
/*
* M2(bool direction,int speed)
* @brief runs motor 2
* @param direction is CW or CCW,
* @param speed is an integer between 0 to 100
* @return returns none
* Written by Ahmad Shamshiri for robojax.com
* on Mar 22, 2022
* Full video details: https://youtu.be/W_Wm28nQAYA
*/
void M2(bool direction,int speed)
{
int pwm=map(speed, 0, 100, 0, 255);
if(direction == CW)
{
analogWrite(D2,pwm);
analogWrite(D3,LOW);
}else{
analogWrite(D3,pwm);
analogWrite(D2,LOW);
}
debugPrint(2, direction, speed, false);
}//M2 ends
/*
* brake(int motor)
* @brief applies brake to a motor
* @param motor is an integer (1 or 2)
* @return returns none
* Written by Ahmad Shamshiri for robojax.com
* on Mar 22, 2022
* Full video details: https://youtu.be/W_Wm28nQAYA
*/
void brake(int motor)
{
if(motor == 1)
{
analogWrite(D0,HIGH);
analogWrite(D1,HIGH);
}else{
analogWrite(D2,HIGH);
analogWrite(D3,HIGH);
}
debugPrint(motor, true, 0, true);
}//brake ends
/*
* debugPrint(int motor, bool direction, int speed, bool stop)
* @brief prints debugging information
* @param motor is an integer (1 or 2)
* @param direction is CW or CCW
* @param speed is an integer from 0 to 100
* @param stop is true or false; if true, the word "stop" is printed
* @return returns none
* Written by Ahmad Shamshiri for robojax.com
* on Mar 22, 2022
* Full video details: https://youtu.be/W_Wm28nQAYA
*/
void debugPrint(int motor, bool direction, int speed, bool stop)
{
if(debug)
{
Serial.print("Motor: ");
Serial.print(motor);
if(stop && motor>0)
{
Serial.println(" Stopped");
}else{
if(direction)
{
Serial.print(" CW at ");
}else{
Serial.print(" CCW at ");
}
Serial.print(speed);
Serial.println(" %");
}
}//debug
}
//not used but can be used to apply brake on both motors
void fullBrake()
{
brake(1);
brake(2);
}
مواردی که ممکن است به آنها نیاز داشته باشید
-
علیاکسپرسخرید ZK-5DA از علیاکسپرسs.click.aliexpress.com
منابع و مراجع
-
خارجی
-
خارجیخرید ZK-5DA از اَمه زون آلمانamzn.to
-
خارجیخرید ZK-5DA از اَمه زون کاناداamzn.to
-
خارجیخرید ZK-5DA از علیاکسپرسs.click.aliexpress.com
-
خارجی
فایلها📁
برگه مشخصات (pdf)
-
TA6586 motor Driver datasheet
TA6586_motor_Driver_datasheet.pdf0.22 MB