Ukoliko želimo upravljati motorima kod kojih se radu pojavljuju struje veće od 2A poslužit ćemo se H-mostom baziranim na čipu VNH2SP30 koji dolazi u obliku gotovog shielda za Arduino koji se popularno naziva Monster Moto Shield. <Monster Moto shield na Sparkfun-u>
Karakterisitike ovog modula su:
- Operativni napon: 5,5 – 16 V.
- Van tih granica se sklop sam isključuje (overvoltage and undervoltage protection/shutdown)
- Maksimalna struja (na mahove): 30 A
- Operativna struja (u kontinuitetu): 14 A
- Maksimalna PWM frekvencija: 20 kHz
- Termalna zaštita
- MOSFET otpor u vođenju (on-resistance): 19 mΩ
- Arduilno kompatibilan
Pogledajmo način na koji se spaja s motorima:
Motor 1 se spaja na izvode A1 i B1, a motor 2 na izvode A2 i B2.
Budući da je ovo shield forma pinovi koji se koriste su rezervirani:
Motor 1
- D5 - PWM1
- D7 - INA1
- D8 - INB1
Motor 2
- D6 - PWM2
- D4 - INA2
- D9 - INB2
Dijagnostički pinovi
- A0 - Status mosta 1
- A1 - Status mosta 2
- A2 - Jacina struje most 1
- A3 - Jacina struje most 2
Pogledajmo kod za upravljanje:
#define BRAKEVCC 0 #define CW 1 #define CCW 2 #define BRAKEGND 3 #define SP 1023 #define CS_THRESHOLD 100 int inApin[2] = {7, 4}; // INA: Selektor za smjer1 int inBpin[2] = {8, 9}; // INB: Selektor za smjer2 int pwmpin[2] = {5, 6}; // PWM izlaz int cspin[2] = {2, 3}; // CS: osjet jačine struje analogni ulaz int enpin[2] = {0, 1}; // EN: Status ukljucenosti mosta (Analogni 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, BRAKEGND, SP); motorGo(1, BRAKEGND, SP); } void loop() { motorGo(0, CW, 1023); // motor 1 - smjer 1 motorGo(1, CCW, 1023); // motor 2 - smjer 2 delay(3000); motorOff(0); // Iskljuci motor 1 motorOff(1); // Iskljuci motor 2 delay(1000); motorGo(0, CCW, 1023); // motor 1 - smjer 2 motorGo(1, CW, 1023); // motor 2 - smjer 1 delay(3000); motorOff(0); // Iskljuci motor 1 motorOff(1); // Iskljuci motor 2 delay(1000); if ((analogRead(cspin[0]) < CS_THRESHOLD) && (analogRead(cspin[1]) < CS_THRESHOLD)) digitalWrite(statpin, HIGH); } void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm) { if (motor <= 1) { if (direct <=4) { // Set inA[motor] if (direct <=1) digitalWrite(inApin[motor], HIGH); else digitalWrite(inApin[motor], LOW); // Set inB[motor] if ((direct==0)||(direct==2)) digitalWrite(inBpin[motor], HIGH); else digitalWrite(inBpin[motor], LOW); analogWrite(pwmpin[motor], pwm); } } } void motorOff(int motor) { // Initialize braked for (int i=0; i<2; i++) { digitalWrite(inApin[i], LOW); digitalWrite(inBpin[i], LOW); } analogWrite(pwmpin[motor], 0); }
Facebook Social Comments