شیلد های مختلی برای راه اندازی موتور های DS با آردوینو وجود دارد . به طور معمول آمپر خرووجی این موتور ها تا حداکثر 3 آمپر می باشد که تنها امکان اره اندازی موتور های کوچک و آرمیچر ها را دارند . در این بین شیلد VNH2SP30 یک درایور موتور دو کانال با جریان خروجی 30 آمپر می باشد که می توانید از آن برای راه اندازی موتور های بزرگتر همچون بالابر شیشه اتوموبیل و… استفاده کنید . این شیلد شامل دو چیپ VNH2SP30 می باشد هر کدام یک درایور تمام پل موتور DC هستند . در این شیلد جای ترمینال های اتصال موتور و تغذیه موتور ها در نظر گرفته شده است . VNH2SP30 به صورت نامی می تواند تا 30 آمپر در خروجی داشته باشد اما در عمل ممکن است این مقدار 40 در صد پایین تر باشد . در راه ات=ندازی موتور های با آمپر بالاتر از 3 باید از هیتسینک مناسب برای چیپ های شیلد استفاده نمود . تغذیه این شیلد می تواند تا حداکث 16 ولت باشد .

 

نکته : کلیه مقادیر ولتاژ و جریان ها برای ورودی و خروجی همگی به صورت نامی بوده و بدهی است این مقادیر در عمل اندکی متفاوت ( کمتر) باشند .

 

ویژگی ها :

  • قابلیت نصب بر روی آردوینو UNO و مدل های مشابه
  • درایو کردن دو موتور به صورت جدا گانه
  • حداکثر جریان نامی خروجی 30A
  • حداکثر ولتاژ خروجی برای موتور ها 16 ولت
  • قابلیت تشخیص جریان مصرفی از طریق پین های آنالوگ آردوینو
  • حداکثر فرکانس خروجی 20KHz
  • دارای محافظ جریان بحرانی
  • دارای محافظ دمای بحرانی
  • دارای محافظ ولتاژ بحرانی

 

پین های شیلد VNH2SP30 :

در تصویر زیر پین های شیلد VNH2SP30 و همچنین نحوه اتصال موتور ها نشان داده شده است .

 

 

راه اندازی شیلد  VNH2SP30 :

پس از اتصال تغذیه موتور ها و همچنین خود موتور ها به شیلد ، برد آردوینو را پروگرام کنید :

#define MtrBrake 0
#define ClockWise   1
#define CClockWise  2
#define GndBreak 3
#define CounterSenseThresHold 100
 
/*  VNH2SP30 pin definitions
 xxx[0] controls '1' outputs
 xxx[1] controls '2' outputs */
 
 
int inApin[2] = {7, 4};  // INA Clockwise Controll 
int inBpin[2] = {8, 9}; // INB Counter-clockwise Controll
int pwmpin[2] = {5, 6}; // PWM (Pulse with modulation ) Input
int cspin[2] = {2, 3}; // CS Current sense for analog input
int enpin[2] = {0, 1}; // EN Status of switches output (Analog pin)
 
int statpin = 13;
 
void setup()
{
  Serial.begin(9600);
  
  pinMode(statpin, OUTPUT);
 
  // Initialize digital pins as outputs
  for (int i=0; i<2; i++)
  {
    pinMode(inApin[i], OUTPUT);
    pinMode(inBpin[i], OUTPUT);
    pinMode(pwmpin[i], OUTPUT);
  }
  // Initialize braked
  for (int i=0; i<2; i++)
  {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
  }
  // motorGo(0, ClockWise, 255);
  // motorGo(1, CClockWise, 255);
}
 
void loop()
{
  motorGo(0, ClockWise, 255);
  motorGo(1, CClockWise, 255);
  delay(500);
 
  motorGo(0, CClockWise, 255);
  motorGo(1, ClockWise, 255);
  delay(500);
  
  if ((analogRead(cspin[0]) < CounterSenseThresHold) && (analogRead(cspin[1]) < CounterSenseThresHold))
    digitalWrite(statpin, HIGH);
}
 
void motorOff(int motor)
{
  // Initialize the brake
  for (int i=0; i<2; i++)
  {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
  }
  analogWrite(pwmpin[motor], 0);
}
 
/* Monster Motor will set a motor going in a specific direction
 the motor will continue turns in that direction, at that speed
 until told to do otherwise.
 
 Motor: this should be either 0 or 1 will selet which of the two motors to be controlled
 
 Direct Should be between 0 and 3, with the following result
 
 0 - Brake to VCC
 1 - Clock wise
 2 - Counter Clockwise
 3 - Brake to GND
 
PWM (Pulse with Moduleation) should be a value between 0and 1024, higher the number, the faster turns
 
 */
 
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
{
  if (motor <= 1)
  {
    if (direct <=4)
    {
      // Set to INA[motor]
      if (direct <=1)
        digitalWrite(inApin[motor], HIGH);
      else
        digitalWrite(inApin[motor], LOW);
 
      // Set to INB[motor]
      if ((direct==0)||(direct==2))
        digitalWrite(inBpin[motor], HIGH);
      else
        digitalWrite(inBpin[motor], LOW);
 
      analogWrite(pwmpin[motor], pwm);
    }
  }
}

 

Tags:
About Author: USER_4